理解网络数据包结构的核心在于一个概念:封装(Encapsulation)。数据在从高层向低层传递时,每一层都会给上一层传来的数据加上自己的“头部”(Header),有时也会加上“尾部”(Trailer),这个过程就像是把一封信(高层数据)装进一个信封(本层头部),再把这个信封放进一个更大的快递盒(更低层头部)里。
我们将以最常见的 TCP/IP 五层(或四层)模型 为例,自上而下地描述每一层的数据单元(PDU, Protocol Data Unit)及其结构。
概览:数据封装过程
为了方便理解,我们先用一个形象的文字嵌套结构来展示整个封装过程:
[ 帧头 [ IP头 [ TCP头 [ 应用层数据 ] ] ] 帧尾 ]
- 应用层数据:最原始的数据,比如一个 HTTP 请求或一封邮件。
- TCP头:传输层加上,用于标记源/目标端口号,确保数据传输的可靠性。
- IP头:网络层加上,用于标记源/目标IP地址,负责在整个网络中寻址和路由。
- 帧头/帧尾:数据链路层加上,用于标记源/目标MAC地址,负责在局域网内进行传输,并进行错误校验。
接下来,我们详细拆解每一层的结构。
1. 应用层 (Application Layer)
- 数据单元名称:报文 (Message)
- 功能:为用户应用程序提供网络服务,如 HTTP、FTP、SMTP、DNS 等。
- 数据结构:应用层的数据结构没有统一的标准,由具体的应用协议自行定义。通常可以看作是 “协议头部” + “数据体”。
以 HTTP 请求为例:
[ HTTP 请求头部 ] [ HTTP 数据体 (可选) ]
- HTTP 请求头部:
- 请求行:
GET /index.html HTTP/1.1
(方法, URL, 协议版本) - 请求头:
Host: www.example.com
,User-Agent: Chrome/9...
,Accept: text/html
等键值对。
- 请求行:
- HTTP 数据体:对于 GET 请求通常为空,对于 POST 请求则包含要提交的数据(如表单内容)。
对比:应用层是最贴近用户的层,其“包结构”是为了让应用程序之间能够相互理解,而不是为了网络传输。
2. 传输层 (Transport Layer)
- 数据单元名称:
- 使用 TCP 协议时,称为 段 (Segment)
- 使用 UDP 协议时,称为 数据报 (Datagram)
- 功能:提供端到端(进程到进程)的通信。TCP 提供可靠、面向连接的服务;UDP 提供不可靠、无连接的服务。
- 数据结构:在应用层报文的前面加上传输层头部。
2.1 TCP 段 (Segment) 结构
TCP 为了保证可靠性,头部结构非常复杂。
[ TCP 头部 ] [ 应用层报文 (Data) ]
- TCP 头部 (20-60字节) 的关键字段:
- 源端口号 (Source Port, 16位):标识发送方应用程序。
- 目的端口号 (Destination Port, 16位):标识接收方应用程序。
- 序列号 (Sequence Number, 32位):用于对数据包进行排序,确保有序性。
- 确认号 (Acknowledgement Number, 32位):期望收到的下一个字节的序列号,用于确认收到。
- 头部长度 (Header Length, 4位):表示 TCP 头的长度。
- 标志位 (Flags, 6位):如
SYN
(建立连接),ACK
(确认),FIN
(断开连接),RST
(重置连接) 等,是 TCP 状态机的核心。 - 窗口大小 (Window Size, 16位):用于流量控制,告知对方自己还能接收多少数据。
- 校验和 (Checksum, 16位):用于检查头部和数据部分在传输过程中是否出错。
- 紧急指针 (Urgent Pointer, 16位):一个很少使用的字段。
- 选项 (Options):可变长度,用于协商 MSS(最大报文段长度)等。
2.2 UDP 数据报 (Datagram) 结构
UDP 只负责“尽力而为”的传输,所以头部非常简单。
[ UDP 头部 ] [ 应用层报文 (Data) ]
- UDP 头部 (固定8字节) 的关键字段:
- 源端口号 (Source Port, 16位)
- 目的端口号 (Destination Port, 16位)
- 长度 (Length, 16位):UDP 头部 + 数据的总长度。
- 校验和 (Checksum, 16位):用于检查头部和数据部分是否出错(在IPv4中可选)。
对比:TCP 头部复杂,字段多,开销大(至少20字节),但能保证可靠性、顺序和流量控制。UDP 头部简单,开销小(固定8字节),速度快,但不可靠。
3. 网络层 (Internet Layer / Network Layer)
- 数据单元名称:数据报 (Datagram),通常也称为 包 (Packet)
- 功能:负责将数据从源主机路由到目标主机。使用 IP 地址进行逻辑寻址。
- 数据结构:在传输层数据段/数据报的前面加上 IP 头部。
以 IPv4 为例:
[ IPv4 头部 ] [ 传输层数据 (TCP Segment / UDP Datagram) ]
- IPv4 头部 (20-60字节) 的关键字段:
- 版本 (Version, 4位):值为 4,表示 IPv4。
- 头部长度 (IHL, 4位):表示 IP 头的长度。
- 服务类型 (Type of Service, 8位):用于指定数据包的优先级。
- 总长度 (Total Length, 16位):IP 头部 + 数据的总长度。
- 标识 (Identification, 16位):唯一标识一个数据包,用于数据包分片后的重组。
- 标志 (Flags, 3位) & 片偏移 (Fragment Offset, 13位):用于处理数据包的分片。
- 生存时间 (Time to Live, TTL, 8位):数据包在网络中可通过的最多路由器数。每经过一个路由器减 1,为 0 则丢弃,防止数据包在网络中无限循环。
- 协议 (Protocol, 8位):指明上层(传输层)使用的是什么协议。
6
代表 TCP,17
代表 UDP。 - 头部校验和 (Header Checksum, 16位):仅用于检查 IP 头部是否出错。
- 源 IP 地址 (Source IP Address, 32位):发送方主机的 IP 地址。
- 目的 IP 地址 (Destination IP Address, 32位):接收方主机的 IP 地址。
- 选项 (Options):可变长度,如记录路由等。
对比:传输层关心的是端口号(哪个程序),而网络层关心的是 IP 地址(哪台主机)。TTL 和分片相关字段是网络层独有的,用于解决跨网络传输的问题。
4. 数据链路层 (Data Link Layer)
- 数据单元名称:帧 (Frame)
- 功能:负责在同一个物理网络(如一个局域网)内的节点之间传输数据。使用 MAC 地址进行物理寻址,并进行差错校验。
- 数据结构:在网络层数据报的前面加上帧头,后面加上帧尾。
以太网帧 (Ethernet Frame) 结构为例:
[ 帧头 (Header) ] [ 网络层数据报 (IP Datagram) ] [ 帧尾 (Trailer) ]
- 帧头 (14字节):
- 目的 MAC 地址 (Destination MAC, 6字节):接收方网卡的物理地址。
- 源 MAC 地址 (Source MAC, 6字节):发送方网卡的物理地址。
- 类型 (Type, 2字节):指明上层(网络层)的协议类型。
0x0800
代表 IPv4,0x0806
代表 ARP。
- 数据 (Payload):
- 就是整个 IP 数据报。长度在 46 到 1500 字节之间。如果 IP 包太小,会进行填充。
- 帧尾 (4字节):
- 帧校验序列 (Frame Check Sequence, FCS, 4字节):使用 CRC 循环冗余校验,用于检查整个帧(从目的MAC到数据部分)在传输过程中是否出错。
对比:网络层使用 IP 地址进行全局、逻辑寻址,可以跨越多个网络。而数据链路层使用 MAC 地址进行局部、物理寻址,只在当前局域网内有效。当数据包从一个局域网传到另一个局域网时,IP 地址不变,但 MAC 地址会随着每一“跳”而改变。此外,数据链路层是唯一一个通常有尾部的层,用于差错校验。
5. 物理层 (Physical Layer)
- 数据单元名称:比特流 (Bit Stream)
- 功能:负责在物理媒介(如网线、光纤、无线电波)上传输原始的二进制比特流。
- 数据结构:没有“包”结构。它将数据链路层的帧转换为电信号(高低电压)、光信号(亮暗)或电磁波,然后发送出去。
表示:0101101010001010111...
最终总结与对比
层次 | 数据单元名称 | 地址类型 | 功能与头部关键信息 | 封装表示 |
---|---|---|---|---|
应用层 | 报文 (Message) | 无 (由应用定义) | 定义通信规则 (如HTTP GET/POST),数据格式 | [应用数据] |
传输层 | 段(TCP)/数据报(UDP) | 端口号 | 进程间通信。TCP:序列号/确认号(可靠性);UDP:简单快速 | [TCP/UDP头 [应用数据]] |
网络层 | 数据报 (Packet) | IP地址 | 主机间路由。TTL(防环路),协议号(区分TCP/UDP),分片信息 | [IP头 [传输层数据]] |
数据链路层 | 帧 (Frame) | MAC地址 | 局域网内节点间传输。类型(区分IP/ARP),FCS(差错校验) | [帧头 [网络层数据] 帧尾] |
物理层 | 比特 (Bit) | 无 | 物理传输 | 01010... |
这个整理清晰地展示了每一层如何通过添加自己的控制信息(头部/尾部)来封装上层数据,从而协同工作,最终完成一次完整的网络通信。