网络数据包字段解析
本文将按网络5层结构,分析网络数据包的结构,及其字段的含义,以便于后续人工处理PCAP数据包。
1、包基本层级结构
Wireshark、Tcpdump等一系列数据链路层的抓包工具,抓取的PCAP包,均是以数据链路层字段开始的,然后是网络层,运输层,应用层。PCAP数据格式是由libpcap定义的,后续的抓包工具也都是基于此开发的。一个完整的应用层包,在Wireshark中的展示图如下:

Wireshark将抓到的包分为了4部分,即MAC帧头部、IP包头部、TCP报文头部和应用层数据。分别对应数据链路层、网络层、运输层、应用层。
TCP/IP完整数据包总览图如下:

UDP完整数据包格式如下:

下面将展开分析每一层的数据段。
2、数据链路层(MAC帧)

- 目的MAC地址:6字节。
- 源MAC地址:6字节。
- 类型:2字节,指出数据域中携带的数据应交给哪些协议实体处理,最常见的为IPv4(0x0800),IPv6(0x86DD),ARP(0x0806)。
- 数据:有效数据载荷,一般为46-1500,由MTU决定,以太网标准(IEEE 802.3)规定MTU为1500,也可以自定义。
- 校验码:4字节,校验数据段,采用32位CRC冗余校验方式进行校验,它把数据当作一个长二进制数用一个固定的“生成多项式”(如CRC-32的多项式)进行模2除法,余数就是CRC校验值,附加到帧末尾。由网卡在物理层处理,Wireshark抓不到。
3、网络层(IP包)

- 版本:4位,IP协议版本,有4和6两个版本。
- 首部长度:4位,表示IP包头长度,以4字节为单位,一般为5*4=20字节。
- 区分服务:8位,用于指示IP数据包的优先级和处理方式,实现网络中的服务质量(QoS)管理。公共互联网通常对所有流量一视同仁一般不咋使用。
- 总长度:16位,指首部和数据之和的长度,以1字节为单位。
- 标识:16位,它是一个计数器,每产生一个数据报就加1。用于标识同一个IP数据报的所有分片,以便接收方能将它们正确重组还原。
假设原始 IP 包大小为 4000 字节,超过 MTU 限制(1500),因此被分为:
分片1:Identification=0x1234,Offset=0,More Fragments=1
分片2:Identification=0x1234,Offset=1480,More Fragments=1
分片3:Identification=0x1234,Offset=2960,More Fragments=0
接收端看到 Identification 相同,就知道这是同一个包的不同分片,可以按顺序重组。
- 标志:3位,第一位未使用,其值为 0。第二位为DF,表示是否允许分片。取值为0时,表示允许分片。第三位称为MF,表示是否还有分片正在传输,设置为0时,表示没有更多分片需要发送,或数据报没有分片。
- 片偏移:13位,它指出较长的分组在分片后,某片在原分组中的相对位置,以8个字节为单位。所以,除了最后一个分片,其他分片的偏移值都是8字节的整数倍。
- 生存时间(TTL):8位,表示数据报在网络中通过的路由器数的最大值,可用于traceroute探测路由路径,以及系统识别。
- 协议:8位,指出使用何种协议,其中6表示TCP,17表示UDP,1表示ICMP。
- 首部校验和:16位,只校验分组的首部,而不校验数据部分。发送端将IP首部每16位相加,最后取反生成校验值,接收端也做相同操作,加上收到的校验和,如果结果是全1(0xFFFF),说明无差错;否则丢弃该包。
- 可选字段:长度不固定,IP可选字段用于携带额外控制信息,但因影响性能和普遍不被支持,现代网络中很少使用。
- 填充:长度不固定,由于IP首部长度必须是4字节的整数倍,当可选字段长度不是4字节的整数倍时,需要在后面加填充字节,使整个IP首部长度满足4字节对齐。
固定部分20个字节,可变部分(可选字段+填充)40字节,首部最长60字节。
4、运输层
运输层包含TCP和UDP两大主要协议,也有别的,但是以这两者为主。
4.1 TCP报文

- 源端口号:16位。
- 目的端口号:16位。
- 序列号(Seq):32位,用来标识从TCP发送端向接入端发送的数据字节流进行编号,对字节进行计数,以1字节为单位。每个TCP连接初始化时,发送方会随机选择一个初始序号。
- 确认号(ACK):32位,确认号包含发送确认的一端所期望收到的下一个序列号。确认号只有在ACK标志为1时才有效。
- 数据偏移:4位,也称为首部长度,用于定位数据部分的起始位置,以4字节为单位。
- 保留位:6位,必须是0,为将来定义新用途保留。
标志:6位,在TCP报文中不管是握手还是挥手还是传数据等,都很重要。
URG:紧急标志位,表示当前数据中有紧急数据,需要优先处理,由紧急指针指出;
ACK:确认标志位,表示确认号字段有效,用于确认收到的数据;
PSH:推标志位,要求接收方立即将数据交给应用层,不必缓存等待更多数据;
RST:复位标志,强制中断异常连接,或拒绝非法请求;
SYN:同步标志,用于建立连接,发起三次握手的第一步;
FIN:结束标志,表示数据发送完毕,请求断开连接。- 窗口大小:16位,表示接收方还能接收多少字节的数据,用于实现流量控制。
- 检验和:16位,不同于IP校验和,TCP校验和对TCP头、数据全部进行16位加和并取反,但二者算法相同,均为16位一组求和后取反的“反码求和算法”。
- 紧急指针:16位,指向数据中优先部分的最后一个字节,通知接收方紧急数据的长度,该字段在URG标志置位时有效。
- 选项+填充:0-40字节,以4字节为单位。选项字段用来扩展TCP功能,填充字段用来保证TCP头部长度对齐。
4.2 UDP报文

- 源端口:2字节。
- 目的端口:2字节。
- UDP数据报长度:2字节,包含了UDP头部和数据部分。
- 校验和:2字节,与TCP,IP一样,使用16位反码加和校验,包含UDP头部和数据部分,由发送端计算和存储,由接收端校验。
5、应用层
应用层协议很多,这里拿一些知名的列举。
5.1 TLS ClientHello包

ClientHello数据包分为两部分,前部分为TLS Record Layer头部,后面则是TLS Record Layer数据。
5.2 DNS包
