本文将按网络5层结构,分析网络数据包的结构,及其字段的含义,以便于后续人工处理PCAP数据包。

1、包基本层级结构

Wireshark、Tcpdump等一系列数据链路层的抓包工具,抓取的PCAP包,均是以数据链路层字段开始的,然后是网络层,运输层,应用层。PCAP数据格式是由libpcap定义的,后续的抓包工具也都是基于此开发的。一个完整的应用层包,在Wireshark中的展示图如下:

image.png

Wireshark将抓到的包分为了4部分,即MAC帧头部IP包头部TCP报文头部应用层数据。分别对应数据链路层、网络层、运输层、应用层。

TCP/IP完整数据包总览图如下:

image.png

UDP完整数据包格式如下:

image.png

下面将展开分析每一层的数据段。

2、数据链路层(MAC帧)

image.png

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

3、网络层(IP包)

image.png

  1. 版本:4位,IP协议版本,有4和6两个版本。
  2. 首部长度:4位,表示IP包头长度,以4字节为单位,一般为5*4=20字节。
  3. 区分服务:8位,用于指示IP数据包的优先级和处理方式,实现网络中的服务质量(QoS)管理。公共互联网通常对所有流量一视同仁一般不咋使用。
  4. 总长度:16位,指首部和数据之和的长度,以1字节为单位。
  5. 标识: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 相同,就知道这是同一个包的不同分片,可以按顺序重组。

  1. 标志:3位,第一位未使用,其值为 0。第二位为DF,表示是否允许分片。取值为0时,表示允许分片。第三位称为MF,表示是否还有分片正在传输,设置为0时,表示没有更多分片需要发送,或数据报没有分片。
  2. 片偏移:13位,它指出较长的分组在分片后,某片在原分组中的相对位置,以8个字节为单位。所以,除了最后一个分片,其他分片的偏移值都是8字节的整数倍。
  3. 生存时间(TTL):8位,表示数据报在网络中通过的路由器数的最大值,可用于traceroute探测路由路径,以及系统识别。
  4. 协议:8位,指出使用何种协议,其中6表示TCP,17表示UDP,1表示ICMP。
  5. 首部校验和:16位,只校验分组的首部,而不校验数据部分。发送端将IP首部每16位相加,最后取反生成校验值,接收端也做相同操作,加上收到的校验和,如果结果是全1(0xFFFF),说明无差错;否则丢弃该包。
  6. 可选字段:长度不固定,IP可选字段用于携带额外控制信息,但因影响性能和普遍不被支持,现代网络中很少使用。
  7. 填充:长度不固定,由于IP首部长度必须是4字节的整数倍,当可选字段长度不是4字节的整数倍时,需要在后面加填充字节,使整个IP首部长度满足4字节对齐。

固定部分20个字节,可变部分(可选字段+填充)40字节,首部最长60字节。

4、运输层

运输层包含TCP和UDP两大主要协议,也有别的,但是以这两者为主。

4.1 TCP报文

image.png

  1. 源端口号:16位。
  2. 目的端口号:16位。
  3. 序列号(Seq):32位,用来标识从TCP发送端向接入端发送的数据字节流进行编号,对字节进行计数,以1字节为单位。每个TCP连接初始化时,发送方会随机选择一个初始序号。
  4. 确认号(ACK):32位,确认号包含发送确认的一端所期望收到的下一个序列号。确认号只有在ACK标志为1时才有效。
  5. 数据偏移:4位,也称为首部长度,用于定位数据部分的起始位置,以4字节为单位。
  6. 保留位:6位,必须是0,为将来定义新用途保留。
  7. 标志:6位,在TCP报文中不管是握手还是挥手还是传数据等,都很重要。

    URG:紧急标志位,表示当前数据中有紧急数据,需要优先处理,由紧急指针指出;
    ACK:确认标志位,表示确认号字段有效,用于确认收到的数据;
    PSH:推标志位,要求接收方立即将数据交给应用层,不必缓存等待更多数据;
    RST:复位标志,强制中断异常连接,或拒绝非法请求;
    SYN:同步标志,用于建立连接,发起三次握手的第一步;
    FIN:结束标志,表示数据发送完毕,请求断开连接。

  8. 窗口大小:16位,表示接收方还能接收多少字节的数据,用于实现流量控制。
  9. 检验和:16位,不同于IP校验和,TCP校验和对TCP头、数据全部进行16位加和并取反,但二者算法相同,均为16位一组求和后取反的“反码求和算法”。
  10. 紧急指针:16位,指向数据中优先部分的最后一个字节,通知接收方紧急数据的长度,该字段在URG标志置位时有效。
  11. 选项+填充:0-40字节,以4字节为单位。选项字段用来扩展TCP功能,填充字段用来保证TCP头部长度对齐。

4.2 UDP报文

image.png

  1. 源端口:2字节。
  2. 目的端口:2字节。
  3. UDP数据报长度:2字节,包含了UDP头部和数据部分。
  4. 校验和:2字节,与TCP,IP一样,使用16位反码加和校验,包含UDP头部和数据部分,由发送端计算和存储,由接收端校验。

5、应用层

应用层协议很多,这里拿一些知名的列举。

5.1 TLS ClientHello包

image.png

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

5.2 DNS包

image.png

标签: pcap

添加新评论