一些抓包分析例子总结

Published on
3 12.9~16.5 min

一些抓包例子

1. 超时重传抓包示例

No.     Time       Source         Destination    Protocol Length Info
1       0.000000   192.168.1.100  192.168.1.200  TCP      66     5000 > 80 [SYN] Seq=0 Win=8192 Len=0
2       0.000100   192.168.1.200  192.168.1.100  TCP      66     80 > 5000 [SYN, ACK] Seq=0 Ack=1 Win=8192 Len=0
3       0.000200   192.168.1.100  192.168.1.200  TCP      54     5000 > 80 [ACK] Seq=1 Ack=1 Win=8192 Len=0
4       0.000300   192.168.1.100  192.168.1.200  HTTP     100    GET /index.html HTTP/1.1  (Seq=1, Ack=1, Len=46)
5       5.000000   192.168.1.100  192.168.1.200  HTTP     100    [TCP Retransmission] GET /index.html HTTP/1.1  (Seq=1, Ack=1, Len=46)

分析:

  • 包4是原始的HTTP请求,但发送方在5秒后(RTO=5秒)没有收到ACK

  • 包5是超时重传,Wireshark标记为[TCP Retransmission]

  • 两个包的Seq、Ack和Length相同,表明是重传同一个数据包

2. 快重传抓包示例

No.     Time       Source         Destination    Protocol Length Info
1       0.000000   192.168.1.100  192.168.1.200  TCP      1514   [PSH, ACK] Seq=1 Ack=1 Win=8192 Len=1460  # 数据段1
2       0.000100   192.168.1.100  192.168.1.200  TCP      1514   [PSH, ACK] Seq=1461 Ack=1 Win=8192 Len=1460  # 数据段2
3       0.000200   192.168.1.100  192.168.1.200  TCP      1514   [PSH, ACK] Seq=2921 Ack=1 Win=8192 Len=1460  # 数据段3
4       0.000300   192.168.1.200  192.168.1.100  TCP      54     [ACK] Seq=1 Ack=1461 Win=8192 Len=0  # 确认数据段1
5       0.000400   192.168.1.200  192.168.1.100  TCP      54     [ACK] Seq=1 Ack=1461 Win=8192 Len=0  # 重复ACK1(数据段2丢失)
6       0.000500   192.168.1.200  192.168.1.100  TCP      54     [ACK] Seq=1 Ack=1461 Win=8192 Len=0  # 重复ACK2
7       0.000600   192.168.1.200  192.168.1.100  TCP      54     [ACK] Seq=1 Ack=1461 Win=8192 Len=0  # 重复ACK3
8       0.000700   192.168.1.100  192.168.1.200  TCP      1514   [TCP Fast Retransmission] Seq=1461 Ack=1 Win=8192 Len=1460  # 快重传数据段2

分析:

  • 包1-3:发送方连续发送3个数据段

  • 包4:接收方确认数据段1(ACK=1461表示期望收到Seq=1461的数据)

  • 包5-7:接收方收到数据段3(乱序),连续发送3个重复ACK,都期望Seq=1461的数据段2

  • 包8:发送方收到3个重复ACK,触发快重传,重传数据段2

  • Wireshark标记为[TCP Fast Retransmission]

3. SACK抓包示例

No.     Time       Source         Destination    Protocol Length Info
1       0.000000   192.168.1.100  192.168.1.200  TCP      66     [SYN] Seq=0 Win=8192 Len=0 MSS=1460 SACK_PERM=1
2       0.000100   192.168.1.200  192.168.1.100  TCP      66     [SYN, ACK] Seq=0 Ack=1 Win=8192 Len=0 MSS=1460 SACK_PERM=1
3       0.000200   192.168.1.100  192.168.1.200  TCP      54     [ACK] Seq=1 Ack=1 Win=8192 Len=0
4       0.000300   192.168.1.100  192.168.1.200  TCP      1514   [PSH, ACK] Seq=1 Ack=1 Win=8192 Len=1460  # 数据段1
5       0.000400   192.168.1.100  192.168.1.200  TCP      1514   [PSH, ACK] Seq=1461 Ack=1 Win=8192 Len=1460  # 数据段2
6       0.000500   192.168.1.100  192.168.1.200  TCP      1514   [PSH, ACK] Seq=2921 Ack=1 Win=8192 Len=1460  # 数据段3
7       0.000600   192.168.1.200  192.168.1.100  TCP      54     [ACK] Seq=1 Ack=1461 Win=8192 Len=0
8       0.000700   192.168.1.200  192.168.1.100  TCP      54     [ACK] Seq=1 Ack=1461 Win=8192 Len=0  # 重复ACK
9       0.000800   192.168.1.200  192.168.1.100  TCP      54     [ACK] Seq=1 Ack=1461 Win=8192 Len=0 SACK 2921-4381  # 包含SACK信息

在包9的TCP选项中可以看到SACK信息:

Options: (12 bytes), SACK
    SACK: 2921-4381  # 表示已收到2921-4381字节的数据(数据段3)
    Length: 10

分析:

  • 包9的ACK=1461,表示期望下一个字节是1461(数据段2)

  • SACK块2921-4381表示已收到数据段3

  • 发送方知道只需要重传数据段2,数据段3不需要重传

4. 滑动窗口变化抓包示例

No.     Time       Source         Destination    Protocol Length Info
1       0.000000   192.168.1.100  192.168.1.200  TCP      66     [SYN] Seq=0 Win=65535 Len=0
2       0.000100   192.168.1.200  192.168.1.100  TCP      66     [SYN, ACK] Seq=0 Ack=1 Win=8192 Len=0  # 接收方窗口=8192
3       0.000200   192.168.1.100  192.168.1.200  TCP      54     [ACK] Seq=1 Ack=1 Win=65535 Len=0
​
# 开始数据传输
4       0.000300   192.168.1.100  192.168.1.200  TCP      1514   [PSH, ACK] Seq=1 Ack=1 Win=65535 Len=1460
5       0.000400   192.168.1.200  192.168.1.100  TCP      54     [ACK] Seq=1 Ack=1461 Win=8192 Len=0  # 窗口大小不变
6       0.000500   192.168.1.100  192.168.1.200  TCP      1514   [PSH, ACK] Seq=1461 Ack=1 Win=65535 Len=1460
7       0.000600   192.168.1.100  192.168.1.200  TCP      1514   [PSH, ACK] Seq=2921 Ack=1 Win=65535 Len=1460
8       0.000700   192.168.1.100  192.168.1.200  TCP      1514   [PSH, ACK] Seq=4381 Ack=1 Win=65535 Len=1460
9       0.000800   192.168.1.200  192.168.1.100  TCP      54     [ACK] Seq=1 Ack=2921 Win=0 Len=0  # 窗口调整为0,流量控制!
10      1.000000   192.168.1.200  192.168.1.100  TCP      54     [ACK] Seq=1 Ack=2921 Win=8192 Len=0  # 窗口恢复

分析:

  • 包2:接收方初始窗口=8192字节

  • 包9:接收方缓冲区满,窗口调整为0,发送方暂停发送

  • 包10:1秒后,接收方缓冲区有空闲,窗口恢复为8192,发送方可以继续发送

5. 拥塞控制相关抓包

慢启动阶段(cwnd指数增长)

发送方连续发送多个数据包,不需要等待每个ACK:

No.     Time       Source         Destination    Protocol Length Info
1       0.000000   192.168.1.100  192.168.1.200  TCP      1514   Seq=1 Ack=1 Win=65535 Len=1460
2       0.000010   192.168.1.100  192.168.1.200  TCP      1514   Seq=1461 Ack=1 Win=65535 Len=1460
3       0.000020   192.168.1.100  192.168.1.200  TCP      1514   Seq=2921 Ack=1 Win=65535 Len=1460
4       0.000030   192.168.1.100  192.168.1.200  TCP      1514   Seq=4381 Ack=1 Win=65535 Len=1460
# 没有立即收到ACK,但继续发送(cwnd=4)

拥塞发生(超时重传)

No.     Time       Source         Destination    Protocol Length Info
1       0.000000   192.168.1.100  192.168.1.200  TCP      1514   Seq=1 Ack=1 Win=65535 Len=1460
...
10      1.500000   192.168.1.100  192.168.1.200  TCP      1514   [TCP Retransmission] Seq=1 Ack=1 Win=65535 Len=1460
# 之后发送速率明显下降(cwnd重置为1,重新慢启动)

关键字段解释

在Wireshark中观察这些关键字段:

  1. 序列号(Sequence Number):当前数据包第一个字节的编号

  2. 确认号(Acknowledgment Number):期望收到的下一个字节的编号

  3. 窗口大小(Window Size):接收方还能接收的数据量

  4. 标志位(Flags)

    • SYN:建立连接

    • ACK:确认

    • PSH:推送数据(接收方应立即将数据交给应用层)

    • RST:重置连接

    • FIN:结束连接

  5. 选项(Options)

    • MSS:最大段大小

    • SACK:选择性确认

    • WS:窗口缩放因子

实用Wireshark过滤表达式

# 过滤重传包
tcp.analysis.retransmission
​
# 过滤快重传
tcp.analysis.fast_retransmission
​
# 查看SACK选项
tcp.options.sack
​
# 查看窗口大小变化
tcp.window_size < 1000  # 查找小窗口
​
# 查看连接建立过程
tcp.flags.syn == 1 and tcp.flags.ack == 0
​
# 查看零窗口
tcp.window_size == 0

分析技巧

  1. 识别拥塞控制阶段

    • 慢启动:发送速率指数增长

    • 拥塞避免:发送速率线性增长

    • 快速恢复:收到重复ACK后cwnd调整

  2. 区分流量控制和拥塞控制

    • 流量控制:接收方窗口变小或为0

    • 拥塞控制:出现重传、重复ACK、RTT增加

  3. 判断网络问题

    • 大量重传:网络丢包严重

    • 零窗口频繁出现:接收方处理慢

    • RTT波动大:网络不稳定


0