计算机网络通信并不是由单一协议完成的,而是由多个协议在不同层次上协同工作。以浏览器访问网站为例,浏览器首先需要通过域名找到服务器的 IP地址,再通过端口号定位服务器上的具体服务,随后使用 TCP或者UDP等传输层协议完成数据传输。
首先本文将对网络分层模型进行较为详细的解释。
1 网络分层模型详解
网络通信的本质是两个计算机之间交换数据。为了降低复杂度,网络被设计为分层架构——每一层只关心自己那一层的功能,下层为上层提供服务。
1.1 OSI七层模型
OSI(Open Systems Interconnection)模型由ISO组织定义,将网络通信分为七层:
| OSI层级 | 功能 | 典型协议/设备 |
| 7. 应用层 (Application) | 为用户应用程序提供网络服务接口 | HTTP,FTP,SMTP,DNS |
| 6.表示层(Presnetation) | 数据格式转换、加密、压缩 | SSL/TLS, JPEG, ASCII |
| 5.会话层(Session) | 建立、管理、终止会话 | NetBIOS, RPC, PPTP |
| 4.传输层(Transport) | 端到端可靠传输、流量控制 | TCP、UDP、SCTP |
| 3.网络层(Network) | 路径选择、逻辑寻址、路由 | IP, ICMP, OSPF, 路由器 |
| 2.数据链路层 (Data Link) | 相邻节点间可靠传输、错误检测 | Ethernet, PPP, 交换机 |
| 1. 物理层 (Physical) | 比特流传输、电气特性定义 | RS-232, RJ45, 集线器 |
1.2 TCP/IP 分层模型
网络通信需要处理应用交互、可靠传输、跨网络转发和局域网传输等不同问题。为了降低系统复杂度,互联网采用分层设计思想,各层只负责特定功能,并向上层提供服务。
常见的 TCP/IP 四层模型如下。
| 层次 | 常见协议 | 主要职责 |
| 应用层 | HTTP、HTTPS、DNS、SMTP | 定义应用程序之间的交互规则和数据格式 |
| 传输层 | TCP、UDP | 实现端到端的进程通信 |
| 网络层 | IP、ICMP | 负责逻辑寻址和跨网络路由转发 |
| 网络接口层 | Ethernet、Wi-Fi、ARP | 负责局域网中的帧传输和链路寻址 |
当应用程序发送数据时,数据会按照从上到下的顺序逐层封装:
应用层数据 ↓ TCP/UDP 首部 + 应用层数据 ↓ IP 首部 + TCP/UDP 报文 ↓ 以太网首部 + IP 数据报 + 帧尾 ↓ 转换为比特流并进行物理传输不同层次中,数据的名称也有所不同:
| 层次 | 数据单位 |
|---|---|
| 应用层 | 数据(Data) |
| 传输层 | 报文段(TCP Segment)或数据报(UDP Datagram) |
| 网络层 | IP 数据报(IP Datagram)或分组(Packet) |
| 数据链路层 | 帧(Frame) |
| 物理层 | 比特流(Bits) |
接收端收到数据后,会按照相反方向进行解封装,并将最终的应用层数据交给对应程序处理。
2 IP 协议与 IP 地址
IP(Internet Protocol,互联网协议)位于网络层,主要负责逻辑寻址和路由转发。IPv4 地址由 32 位二进制数组成,通常使用点分十进制表示,例如:192.168.1.100 。
IP 地址的作用是标识网络中的主机或网络接口,使网络设备能够判断数据的目标位置。例如:
客户端 IP:192.168.1.100 服务器 IP:203.0.113.10当客户端向服务器发送数据时,IP 协议负责将数据封装为 IP 数据报,并在首部中填写源 IP 地址和目的 IP 地址。路由器会根据目的 IP 地址和路由表,将数据逐跳转发至目标网络。
IP协议具有以下特点:
- 无连接:即发送数据前不需要建立连接
- 尽力而为:即不能保证数据一定到达
- 不保证数据顺序
- 不负责丢包重传
- 支持不同网路之间的路由转发
因此,IP 主要解决“数据应当发送到哪台主机”的问题,而数据是否可靠到达,则通常由 TCP 等上层协议负责。
3 端口号:定位主机中的服务
仅通过 IP 地址可以找到一台主机,但一台主机上通常运行多个网络服务。例如,一台服务器可能同时提供 Web 服务、SSH 远程登录服务和数据库服务。
因此,网络通信还需要通过端口号定位主机上的具体应用程序。端口号由 16 位二进制数组成,取值范围为:0 ~ 65535 。
端口通常分为以下三类:
| 端口范围 | 类型 | 说明 |
|---|---|---|
| 0 ~ 1023 | 知名端口 | 常用于标准网络服务 |
| 1024 ~ 49151 | 注册端口 | 可由应用程序或厂商使用 |
| 49152 ~ 65535 | 动态端口 | 通常由客户端临时分配 |
常见端口如下:
| 服务或协议 | 默认端口 |
|---|---|
| HTTP | TCP 80 |
| HTTPS | TCP 443 |
| SSH | TCP 22 |
| FTP | TCP 21 |
| SMTP | TCP 25 |
| DNS | UDP 53,必要时使用 TCP 53 |
| MySQL | TCP 3306 |
例如,访问 HTTPS 网站时,可以将通信表示为:
客户端:192.168.1.100:52341 服务器:203.0.113.10:443其中,客户端的52341通常是操作系统临时分配的动态端口;服务器的443则是 HTTPS 服务监听的固定端口。
可以将 IP 地址和端口号的关系概括为:
IP 地址用于定位主机; 端口号用于定位主机上的具体应用程序。4 TCP 协议:可靠的传输方式
TCP(Transmission Control Protocol ,传输控制协议)位于传输层,是一种面向连接、可靠、面向字节流的协议。
TCP的特点主要包括:
- 在传输数据之前需要建立连接;
- 保证数据可靠达到 ;
- 保证数据按顺序交付;
- 支持超时重传;
- 支持流量控制;
- 支持拥塞控制;
- 通过端口号实现进程间通讯。
TCP的适用于对数据完整性要求较高的场景,例如:
- HTTP和HTTPS网页访问
- 文件传输
- 远程登录
- 数据库连接
- 电子邮件传输
4.1 TCP三次握手
TCP在传输数据之前,需要通过三次握手建立连接。
客户端 服务器 | | | -------- SYN,Seq=x --------------------> | | | | <--- SYN + ACK,Seq=y,Ack=x+1 ---------- | | | | -------- ACK,Ack=y+1 -------------------> | | | TCP 连接建立完成三次握手的过程如下:
1. 客户端发送SNY报文,请求建立连接;
2. 服务器返回SNY + ACK报文,表示同意建立连接;
3. 客户端发送ACK报文,确认收到服务器响应;
4. 双方完成初始序列号同步,TC怕链接建立。
TCP 使用三次握手的目的,是让通信双方确认彼此具备正常的收发能力,并避免失效连接请求导致错误建立连接。
4.2 TCP 的可靠传输机制
TCP 的可靠性由多个机制共同实现。
| 机制 | 作用 |
|---|---|
| 序列号 | 保证数据能够按照正确顺序重组 |
| 确认机制 | 接收方确认已正确接收到数据 |
| 超时重传 | 未收到确认时重新发送数据 |
| 校验和 | 检测传输过程中是否发生数据损坏 |
| 流量控制 | 防止发送速度超过接收方处理能力 |
| 拥塞控制 | 减少网络拥塞对传输造成的影响 |
例如,发送方发送数据后,如果在规定时间内没有收到确认报文,就会认为数据可能丢失,并进行重传。
4.3 TCP 四次挥手
当通信完成后,TCP 连接通常需要通过四次挥手关闭。
客户端(主动关闭) 服务器(被动关闭) | | | -------- FIN --------------------------------> | | | | <------- ACK --------------------------------- | | | | <------- FIN --------------------------------- | | | | -------- ACK --------------------------------> | | | TCP 连接关闭完成其基本过程如下:
- 主动关闭方发送 FIN,表示不再发送数据;
- 被动关闭方返回 ACK,确认收到关闭请求;
- 被动关闭方完成剩余数据发送后,发送 FIN;
- 主动关闭方返回 ACK,确认连接关闭。
主动关闭方在发送最后一个 ACK 后,通常进入TIME_WAIT状态,并等待一段时间。该状态的作用是确保最后一个 ACK 能够到达对方,同时避免旧连接中延迟到达的报文影响新的连接。
5 UDP 协议:轻量的数据报传输
UDP(User Datagram Protocol,用户数据报协议)同样位于传输层。与 TCP 相比,UDP 的设计更加简单,传输开销较小。
UDP 的主要特点如下:
- 无连接,发送数据前不需要建立连接;
- 不保证数据一定到达;
- 不保证数据到达顺序;
- 不提供自动重传;
- 首部长度固定为 8 字节;
- 支持广播和组播;
- 以数据报为单位传输数据。
UDP 适用于对实时性要求较高、能够容忍少量丢包的场景,例如:
- DNS 查询;
- 网络游戏;
- 在线音视频通话;
- 直播推流;
- DHCP;
- 实时监控数据传输。
在实时音视频场景中,如果某个数据包延迟过高,即使重新传输也可能已经失去实际意义。因此,相比等待重传,及时发送后续数据通常更重要。
UDP 的不可靠性并不意味着它没有价值,而是表示其不在传输层负责可靠性保障。应用程序可以根据自身需求,在 UDP 基础上设计确认、重传或排序机制。
6 TCP 与 UDP 的比较
TCP 和 UDP 均属于传输层协议,但其特性和适用场景不同。
| 对比项目 | TCP | UDP |
|---|---|---|
| 是否建立连接 | 需要 | 不需要 |
| 是否可靠传输 | 是 | 否 |
| 是否保证顺序 | 是 | 否 |
| 是否支持重传 | 支持 | 不支持 |
| 流量控制 | 有 | 无 |
| 拥塞控制 | 有 | 无 |
| 数据传输单位 | 字节流 | 数据报 |
| 首部长度 | 最少 20 字节 | 固定 8 字节 |
| 传输开销 | 相对较高 | 相对较低 |
| 常见应用 | Web、文件传输、远程登录 | DNS、游戏、音视频 |
TCP 更适用于可靠性优先的场景,UDP 则更适用于实时性和低延迟优先的场景。两者不存在绝对优劣,实际选择应根据业务需求决定。
7 套接字(Socket)
套接字(Socket)是操作系统提供给应用程序的网络通信接口,也是对网络通信断电的抽象。应用程序通常不会直接构造TCP报文或者IIP数据报,而是通过Socket接口完成连接建立、数据发送和数据接收等操作。
一个通信端点通常可以表示为:协议 + IP 地址 + 端口号 。例如:
TCP 192.168.1.100:52341 TCP 203.0.113.10:443一次 TCP 连接通常由以下四个信息唯一确定:
源 IP 地址 + 源端口号 + 目的 IP 地址 + 目的端口号例如:192.168.1.100:52341 → 203.0.113.10:443
如果再加上所使用的传输层协议,则可以称为五元组:协议 + 源 IP + 源端口 + 目的 IP + 目的端口
即:TCP + 192.168.1.100 + 52341 + 203.0.113.10 + 443
服务器可以同时为多个客户端提供服务。即使所有客户端均访问服务器的443端口,不同客户端的源 IP 地址或源端口不同,因此服务器仍能够区分不同连接。
客户端 A:192.168.1.100:52341 → 203.0.113.10:443 客户端 B:192.168.1.101:52342 → 203.0.113.10:4438 Socket 通信的基本流程
在典型的 TCP 客户端—服务器模式中,双方使用 Socket 的流程有所不同。
8.1 服务器端
服务器端通常按照以下顺序执行操作:
socket() → 创建套接字 bind() → 绑定本地 IP 地址和端口 listen() → 监听客户端连接请求 accept() → 接受客户端连接 recv() → 接收数据 send() → 发送数据 close() → 关闭套接字例如,一个 Web 服务器通常会绑定并监听80或443端口,等待客户端请求。
8.2 客户端
客户端通常按照以下顺序执行操作:
socket() → 创建套接字 connect() → 连接服务器 send() → 发送数据 recv() → 接收数据 close() → 关闭套接字对于 TCP Socket 而言,客户端调用connect()时,底层会发起 TCP 三次握手。三次握手完成后,客户端和服务器便可以交换数据。
对于 UDP Socket,由于 UDP 不需要建立连接,通常可以直接使用sendto()发送数据报,并使用recvfrom()接收数据报。