一些抓包分析例子总结
一些抓包例子
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中观察这些关键字段:
序列号(Sequence Number):当前数据包第一个字节的编号
确认号(Acknowledgment Number):期望收到的下一个字节的编号
窗口大小(Window Size):接收方还能接收的数据量
标志位(Flags):
SYN:建立连接
ACK:确认
PSH:推送数据(接收方应立即将数据交给应用层)
RST:重置连接
FIN:结束连接
选项(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分析技巧
识别拥塞控制阶段:
慢启动:发送速率指数增长
拥塞避免:发送速率线性增长
快速恢复:收到重复ACK后cwnd调整
区分流量控制和拥塞控制:
流量控制:接收方窗口变小或为0
拥塞控制:出现重传、重复ACK、RTT增加
判断网络问题:
大量重传:网络丢包严重
零窗口频繁出现:接收方处理慢
RTT波动大:网络不稳定
0