关键在于-s 0捕获完整tcp头部以保留sack等option字段,确认syn包含sackok协商,并用tcp.options.sack过滤实际携带sack块的ack包,结合tcp.analysis.retransmission分析重传原因。

直接用 tcpdump 捕获带 TCP Option(尤其是 SACK 相关字段)的报文,关键不在“过滤出 SACK”,而在于确保抓包时保留完整 TCP 头部、启用必要选项,并在后续分析中识别 SACK 块。Linux 默认开启 SACK,但抓包配置不当会导致 Option 被截断或无法解析。
确保抓包不丢 TCP Option 字段
默认情况下,tcpdump 只捕获前 68 字节(-s 68),而含 SACK 的 TCP 头通常超过这个长度(尤其带时间戳、窗口缩放等)。必须显式指定完整截取:
- 加
-s 0:捕获每个包的全部内容,避免 TCP Option 被截断 - 示例:
sudo tcpdump -i eth0 -s 0 -w sack_capture.pcap 'tcp port 80' - 若只看控制台输出,建议同时加
-XX(十六进制+ASCII)便于人工核对 Option 字段位置
识别 SACK 是否实际启用
SACK 不是每次连接都出现,它依赖三次握手时双方协商。抓包后需确认 SYN 或 SYN-ACK 中是否含 sackOK 标记:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 在 Wireshark 中打开 pcap 文件,筛选
tcp.flags.syn == 1 - 点开任意 SYN 包 → TCP header → Options → 查看是否有 SACK Permitted(即
sackOK) - 命令行快速确认:
tcpdump -r sack_capture.pcap -nn -A | grep -i "sackok" - 没有 sackOK,后续就不会有 SACK 块;即使有,也需接收方真正反馈 SACK 才生效
定位含 SACK 块的实际数据包
SACK 块只出现在 ACK 报文中(非 SYN/SYN-ACK),且仅当接收方已收到不连续的数据段时才携带。常用筛选方式:
- Wireshark 过滤器:
tcp.options.sack(直接显示带 SACK Option 的包) - 命令行粗筛:
tcpdump -r sack_capture.pcap -nn -A | grep -A2 -B2 "sack" - 典型 SACK Option 显示为:
options [mss 1460,sackOK,TS val 123456789 ecr 0,nop,wscale 7](这是协商)或options [sack 12345:12678,nop,wscale 7](这是实际 SACK 块) - 注意区分
sackOK(能力协商)和sack(实际确认块),后者才是分析重传行为的关键
结合重传分析 SACK 行为
单独看到 SACK 块意义有限,需与重传行为联动判断网络问题:
- 先用
tcp.analysis.retransmission在 Wireshark 中标出重传包 - 再查该重传包对应的 ACK 是否含 SACK 块,且 SACK 左边界是否等于重传 Seq
- 若 SACK 明确说“我收到了 11233–11585”,但发送方仍重传 Seq=11233,说明原始包未达接收方(发送侧丢包)
- 若 SACK 块覆盖范围异常(如左边界 > 右边界),可能是 D-SACK,暗示接收方重复收到或乱序严重










