3. 混杂模式与网卡卸载对抓包完整性的影响验证

混杂模式与网卡卸载对抓包完整性的影响验证 学习卡片

为什么抓到的包会“看起来坏了”

混杂模式决定网卡是否接收目的 MAC 不是自己的帧;网卡卸载则决定校验和、分片、时间戳等工作由谁完成。两者都会改变 tcpdump/Wireshark 看到的字节流,导致“校验和错误”“分片缺失”“时间戳抖动”等假象。验证思路是:固定同一段流量,只改变一个变量,对比抓包结果。

混杂模式与网卡卸载对抓包完整性的影响路径 发送端 构造原始帧 IP 校验和 / TCP 校验和 分片(如 1500B MTU) 时间戳由内核生成 链路 接收网卡 混杂模式:收/不收非本机帧 RX 校验和卸载 TSO / LRO / GRO 时间戳硬件/软件 驱动 内核协议栈 校验和验证 分片重组 时间戳打标 tcpdump 抓包点 抓包结果(PCAP) 校验和字段 / 分片标志 / 时间戳 长度与原始字节 现象 1:校验和错误 RX 卸载未回填 → 全 0 或错误值 关闭 rx 校验和卸载后对比 现象 2:分片缺失/合并 TSO/LRO 把大包合并或拆分 关闭 tso/lro/gro 后对比 现象 3:时间戳抖动 硬件/软件时间戳源不一致 固定时间戳源后对比 混杂模式影响 关闭:只收本机 MAC 帧 → 漏包 开启:收全部帧 → 完整但可能混杂

验证方法:单变量对比

在同一台抓包机上,用同一段流量(例如 ping -c 20 加一段 curl 大文件下载)分别采集 4 组 PCAP,每次只改一个变量:

组别混杂模式RX 校验和卸载TSO/LRO/GRO预期观察
A关闭开启开启可能漏非本机帧,校验和字段异常
B开启开启开启帧数完整,但校验和/分片可能失真
C开启关闭开启校验和恢复正常,分片仍可能被合并
D开启关闭关闭校验和、分片、时间戳均接近真实链路

关键操作与判断依据

# 查看当前网卡卸载状态
ethtool -k eth0 | grep -E "rx-checksumming|tx-checksumming|tso|gro|lro"

# 关闭 RX 校验和卸载(示例)
ethtool -K eth0 rx off

# 关闭 TSO / GSO / GRO / LRO
ethtool -K eth0 tso off gso off gro off lro off

# 开启混杂模式抓包
tcpdump -i eth0 -c 200 -w mixed_on.pcap

# 关闭混杂模式抓包
tcpdump -i eth0 -c 200 -w mixed_off.pcap

判断依据:

  • 校验和:Wireshark 中若大量 TCP/UDP 校验和显示 “incorrect” 或 “unverified”,先检查 RX 卸载是否开启;关闭后若恢复正常,说明是卸载导致的假象。
  • 分片:若看到超大帧(如 64KB)或分片标志异常,检查 TSO/LRO/GRO;关闭后应看到符合 MTU 的分片或正常 MSS。
  • 时间戳:对比同一流量的两组 PCAP,若时间差呈固定偏移或抖动,检查时间戳源(硬件 vs 软件)是否一致。
  • 混杂模式:关闭时若只看到本机 MAC 的帧,说明漏掉了经过网卡但目的 MAC 非本机的流量;开启后帧数应明显增加。
建议在实验环境中先用 ethtool -k 记录基线,再逐项关闭卸载并重新抓包,避免一次改多个变量导致无法归因。
生产环境关闭网卡卸载可能增加 CPU 负载,验证完成后应根据实际需求恢复原设置,不要长期保留关闭状态。