如何生成大于64KB的TCP数据包并保存为PCAP文件用于网络设备测试?
解决Scapy创建超大TCP数据包并写入PCAP的报错问题
你遇到的这个错误根源很明确:IP协议的总长度字段是16位无符号整数,最大值只能到65535(约64KB)。Scapy默认会自动计算IP包的总长度和校验和,当你的120000字节负载加上IP、TCP头部长度后,总长度远超65535,触发了struct打包时的范围检查,所以抛出了'H' format requires 0 <= number <= 65535的错误。
要创建这种不符合规范但用于测试的超大包,你需要手动绕过Scapy的自动校验和与长度计算,具体实现如下:
修改后的可运行代码
from scapy.all import * # 构造超大数据包,手动设置IP层参数以绕过自动检查 bigp = ( IP(src="127.0.0.1", dst="192.168.2.71", len=65535, chksum=0) # 手动指定IP长度,关闭自动校验和计算 / TCP(sport=123, dport=456, chksum=0) # 关闭TCP自动校验和计算 / Raw(RandString(size=120000)) ) # 直接将数据包写入PCAP文件 wrpcap("/tmp/c.pcap", [bigp])
关键细节说明
- 手动设置
IP(len=65535):这一步是为了绕过Scapy的长度合法性检查,虽然实际负载远大于这个值,但PCAP格式本身会完整记录所有负载字节(即使IP层的长度字段和实际内容不匹配)。如果需要更大的数据包,甚至可以把len设为更大的数值(比如100000),同样能生效。 - 设置
chksum=0:告诉Scapy不要自动计算IP和TCP的校验和,避免因为长度异常导致校验和计算失败。 - 测试场景兼容性:这类不符合协议规范的数据包,PCAP文件可以正常存储,后续的重放工具只要不强制校验IP协议合法性,就能正常加载并发送。
内容的提问来源于stack exchange,提问作者LetMeSOThat4U
相关产品推荐
相关产品推荐

