网络通信和协议
网络通信 指的是不同设备之间通过网络交换数据的过程。
两台主机想要正确通信,必须遵循统一的规则,这些规则就叫做 协议。
协议本质上约定了:数据如何封装、如何发送、如何接收、如何校验,以及出现错误后如何处理。
网络协议和OSI网络模型
网络协议 是一组通信规则,用来保证不同厂商、不同系统的设备能够互联互通。
为了更清晰地理解网络通信过程,人们把复杂的通信过程分层描述,典型代表就是 OSI 七层模型。
OSI 七层模型 自下而上分别是:
- 物理层:负责比特流传输,例如网线、电信号、光信号。
- 数据链路层:负责相邻节点之间的数据传输,例如 MAC 地址、帧。
- 网络层:负责路径选择与跨网络传输,例如 IP 协议。
- 传输层:负责端到端通信,例如 TCP、UDP。
- 会话层:负责建立、管理、终止会话。
- 表示层:负责数据格式转换、加密解密、压缩解压。
- 应用层:直接为用户程序提供服务,例如 HTTP、FTP、SMTP。
OSI 模型的意义 主要在于:
- 降低网络系统设计复杂度。
- 让每一层只关注自己的职责。
- 便于协议标准化与模块化开发。
- 出现故障时更容易定位问题。
TCP/IP模型
在实际互联网中,更常用的是 TCP/IP 模型。
它比 OSI 模型更贴近真实网络实现,通常分为四层或五层。
常见四层 TCP/IP 模型 包括:
- 网络接口层:对应 OSI 的物理层和数据链路层。
- 网络层:主要协议是 IP,负责寻址和路由。
- 传输层:主要协议是 TCP 和 UDP,负责进程之间的通信。
- 应用层:包含 HTTP、HTTPS、DNS、FTP 等协议。
数据在发送时会经历逐层封装:
- 应用层产生原始数据。
- 传输层添加 TCP 头或 UDP 头。
- 网络层添加 IP 头。
- 网络接口层再封装成帧并发送。
接收方则进行逐层拆包,还原出原始数据。
IP地址
IP 地址 用于唯一标识网络中的一台主机。
可以把它理解为设备在网络中的地址,没有 IP 地址,数据就不知道该发送到哪里。
IP 地址主要分为两类:
- IPv4:由 32 位二进制组成,通常写成点分十进制形式,例如
192.168.1.10。 - IPv6:由 128 位二进制组成,地址空间更大,例如
2001:db8::1。
按照使用范围,IP 地址还可以分为:
- 公网 IP:可在互联网中直接访问。
- 私网 IP:通常用于局域网内部,常见网段有
192.168.x.x、10.x.x.x、172.16.x.x到172.31.x.x。
在网络通信中,IP 地址负责找到目标主机,但只靠 IP 地址还不能确定具体是主机上的哪个程序在通信,因此还需要 端口号。
端口号
端口号 用于标识一台主机上的某个具体应用程序或服务。
IP 地址定位的是主机,端口号定位的是主机中的进程。
端口号范围 是 0 ~ 65535,通常分为:
- 知名端口:
0 ~ 1023,例如 HTTP 默认端口80,HTTPS 默认端口443。 - 注册端口:
1024 ~ 49151,常用于某些固定服务。 - 动态或私有端口:
49152 ~ 65535,通常由客户端临时使用。
例如访问网站时,目标可能是:
服务器IP + 80端口
这表示把数据发送到某台服务器上的 Web 服务程序。
客户端和服务端
网络程序通常分为 客户端 和 服务端 两部分。
- 服务端:负责提供服务,通常长期运行并监听固定端口,等待客户端连接或请求。
- 客户端:负责发起请求,主动去连接服务端并获取结果。
以浏览器访问网页为例:
- 浏览器是客户端。
- 网站服务器是服务端。
- 浏览器向服务器发起请求。
- 服务器返回网页数据给浏览器。
在编程中,两者职责不同:
- 服务端 重点在于监听、接收连接、处理多个请求。
- 客户端 重点在于连接目标主机、发送请求、接收响应。
UDP和TCP
UDP 和 TCP 都是传输层协议,用于实现进程与进程之间的通信,但两者设计目标不同。
| 协议 | 主要特点 |
|---|---|
| UDP | 无连接、速度快、开销小,但不保证可靠性 |
| TCP | 面向连接、可靠、有序,但开销较大 |
简单理解:
- UDP 更像“发消息”,发出去就结束,不确认对方是否收到。
- TCP 更像“打电话”,先建立连接,再进行可靠通信。
UDP网络协议
UDP 全称是 User Datagram Protocol,即 用户数据报协议。
它在发送数据之前不需要建立连接,直接把数据打包后发出去,因此效率较高。
UDP 的通信特点是 面向数据报。发送方每发送一次,就是一个独立的数据包;接收方一次接收的也是一个完整数据报。
UDP编程步骤
UDP 编程的一般流程如下:
- 创建 Socket 对象,指定使用 UDP 协议。
- 如果是接收方,可以绑定本地 IP 和端口。
- 发送方直接调用发送接口,把数据发送到目标 IP 和端口。
- 接收方调用接收接口,获取数据报。
- 通信结束后关闭 Socket。
UDP 通信通常不需要先建立连接,因此实现简单,适合快速收发短消息。
UDP特点与优缺点
UDP 的特点:
- 无连接。
- 不保证数据一定到达。
- 不保证数据按顺序到达。
- 没有重传机制。
- 首部开销小,效率较高。
UDP 的优点:
- 传输速度快。
- 实现简单。
- 资源消耗较小。
- 适合实时性要求高的场景。
UDP 的缺点:
- 容易丢包。
- 数据可能乱序。
- 不能自动处理可靠传输问题。
UDP应用场景
UDP 常用于 对实时性要求高、对少量丢包可容忍的场景,例如:
- 语音通话。
- 视频直播。
- 在线游戏中的实时状态同步。
- DNS 查询。
- 局域网广播和组播。
TCP网络协议
TCP 全称是 Transmission Control Protocol,即 传输控制协议。
它是一种 面向连接、可靠、有序、基于字节流 的传输协议。
在正式通信之前,TCP 需要先建立连接;通信结束后,还要断开连接。
为了保证可靠性,TCP 提供 确认应答、超时重传、流量控制、拥塞控制 等机制。
TCP编程步骤
TCP 编程的一般流程如下:
服务端步骤:
- 创建 ServerSocket 或监听 Socket 对象。
- 绑定本地 IP 和端口。
- 监听客户端连接。
- 接收到连接后,得到与客户端通信的 Socket 对象。
- 通过输入输出流或收发接口与客户端交换数据。
- 通信结束后关闭连接。
客户端步骤:
- 创建 Socket 对象。
- 主动连接服务端 IP 和端口。
- 连接成功后发送数据。
- 接收服务端返回的数据。
- 通信结束后关闭连接。
TCP特点与优缺点
TCP 的特点:
- 面向连接。
- 可靠传输。
- 按顺序到达。
- 基于字节流。
- 具有流量控制和拥塞控制机制。
TCP 的优点:
- 数据可靠,不易丢失。
- 能保证顺序。
- 适合传输重要业务数据。
TCP 的缺点:
- 建立连接和断开连接有额外开销。
- 传输速度通常比 UDP 慢。
- 协议实现更复杂。
TCP应用场景
TCP 适用于 对准确性、完整性要求高的场景,例如:
- 网页访问。
- 文件传输。
- 邮件发送。
- 数据库连接。
- 即时通信中的可靠消息传输。
Socket编程
Socket 可以理解为网络通信的“插座”或“接口”,应用程序通过它与传输层协议进行交互。
无论是 TCP 还是 UDP 编程,最终通常都要通过 Socket 来完成数据发送和接收。
Socket 编程的核心作用包括:
- 创建网络通信端点。
- 绑定本地地址和端口。
- 建立连接或直接发送数据。
- 接收远程主机发来的数据。
- 在通信结束后释放资源。
根据协议不同,Socket 编程可以分为两类:
- UDP Socket:无连接,直接发送数据报。
- TCP Socket:面向连接,需要先建立连接再通信。