网络编程入门
软件结构
C/S 结构
C/S 结构: 全称为 Client/Server 结构, 是指客户端和服务器结构. 常见的程序有 QQ, 迅雷等软件.
B/S 结构
B/S 结构: 全称为 Browser/Server 结构, 是指浏览器和服务器结构. 常见浏览器有谷歌, 火狐等.
两种架构各有优势, 但是无论哪种架构, 都离不开网络的支持. 网络编程, 就是在一定的协议下, 实现两台计算机的通信的程序.
网络通信协议
网络通信协议: 通信协议是对计算机必须遵守的规则, 只有遵守这些规则, 计算机之间才能进行通信. 这就好比在道路中行驶的骑乘一定要遵守交通规则一样.协议中对数据的传输格式, 传输速率, 传输步骤等做了统一规定. 通信双方必须同时遵守, 最终完成数据交换.
TCP/IP 协议: 传输控制协议/因特网互联协议 (Transmission Control Protocol/Internet Protocol), 是 Internet 最基本, 最广泛的协议. 它定义了计算机如何连入因特网, 以及数据如何在它们之间传输的标准. 它的内部包含一系列的用于处理数据通信的协议, 并采用了 4 层的分层模型, 每一层都呼叫它的下一层提供的协议来完成自己的需求.
协议的分类
通信的协议还是比较复杂的, java.net 包中包含的类和接口, 它们提供层次的通信细节. 我们可以直接使用这些类和接口, 来专注于网络程序开发, 而不用考虑通信的细节.
java.net 包中提供了两种常见的网络协议的支持: TCP 和 UDP.
TCP
TCP: 传输控制协议 (Transmission Control Protocol). TCP 协议是面向连接的通信协议, 即传输数据之前, 在发送端和接收端建立逻辑连接, 然后再创术数据. TCP 协议提供了两台计算机之间可靠无差错的数据传输.
三次握手: TCP 协议中, 在发送数据的准备阶段, 客户端与服务器之间的三次交互, 以保证连接的可靠.
- 第一次握手: 客户端向服务端发出连接请求, 等待服务器确认
- 第二次握手: 服务端向客户回送一个响应, 通知客户端收到了连接请求
- 第三次握手, 客户端再次向服务端发生确认信息, 确认连接. 整个交互过程如下图所示
完成三次握手, 连接建立后, 客户端和服务器就可以开始进行数据创术了. 由于这种面向连接的特性, TCP 协议可以保证传输数据的安全, 所以应用十分广泛. 例如下载文件, 浏览网页等.
UDP
UDP: 用户数据报协议 (User Datagram Protocol). UDP 协议是一个面向无连接的协议. 传输数据时, 不需要建立连接, 不管对方端服务器是否启动, 直接将数据, 数据源和目的地都封装在数据包中, 直接发送. 每个数据包的大小限制在 64k 以内. (UDP 协议是不可靠协议) 因为无需建立连接, 所以传输速度快, 但是容易丢失数据. 人才应用中, 例如视频会议, QQ 聊天等.
网络编程三要素
协议
协议: 计算机网络通信必须遵守的规则. 我们前面已经介绍, 不再赘述.
IP 地址
IP 地址: 指互联网协议地址 (Internet Protocol Address), 俗称 IP. IP 地址用来给一个网络中的计算机设备做唯一的编号. 假如我们把 “个人电脑” 比作 “一台电话” 的话, 那么 “IP 地址” 就相当于 “电话号码”.
IP 地址分类
IPv4: 是一个 32 位的二进制数, 通常被分为 4 个字节, 表示成 a.b.c.d 的形式, 例如 192.168.65.100. 其中 a, b, c, d 都是 0~255 之间的十进制整数, 那么最多可以表示 42 亿个.
IPv6: 由于互联网的蓬勃发展, IP 地址的需求量越来越大. 但是网络地址资源有限, 使得 IP 的分配越发紧张. 为了扩大地址空间, 通过 IPv6 重新定义地址空间, 采用 128 位地址长度, 每 16 个字节一组, 分成 8 组十六进制数, 表示成ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
. IPv6 号称可以称为全世界的每一粒沙子编上一个网址, 这样就解决了网络地址资源数量不够的问题.
常用命令
查看本机 IP 地址, 在控制台输入:
ipconfig
查看网络是否连通, 在控制台输入:
ping 空格 IP地址
ping 192.168.1.1
特殊的 IP 地址
本机 IP 地址: 127.0.0.1, localhost.
端口号
网络的通信, 本质上是两个进程 (应用程序) 的通信. 每台计算机都有很多的进程, 那么在网络通信时, 如何区分这些进程呢?
如果说 IP 地址可以唯一标识网络中的设备, 那么端口号就可以唯一标识设备中的进程 (应用程序) 了.
- 端口号: 用两个字节表示的整数, 它的取值范围是 0~65535. 其中, 0~1023 之间的端口号用于一些知名的网络服务和应用, 普通的应用程序需要使用 1024 以上的端口号. 如果端口号被另外一个服务或应用所占用, 会导致当前程序启动失败
利用 协议 + IP 地址 + 端口号 三元组合, 就可以标识网络中的进程了, 那么进程间的通信就可以利用这个标识与其它进程进行交互.