Scapy发送数据包无响应,“remaining 1 packets”含义咨询
先明确核心问题:"remaining 1 packets"是什么意思?
这句话直白点说就是:Scapy用srp()发送了1个数据包后,一直在等这个包的响应,但直到你关闭程序,它都没收到任何回应,所以这个未完成的“发送-等待响应”任务就被标记为“剩余1个数据包”。
为什么会触发这个?因为你用的是srp()函数——这是Scapy专门用于链路层发送并等待响应的方法(send and receive at layer 2),它的设计逻辑就是发送包后要等对应数量的响应回来,要是没等到,就会把这些未完成的等待计数保留,直到程序退出时提示你。
再分析你的场景:为什么tcpdump没抓到包,还出现这个提示?
结合你的代码来看,大概率是这几个环节出了问题:
1. 发送函数选得不对
你要发送的是RST重置包,这类包本身不需要对方回响应,完全没必要用srp()(它会强制等响应)。用srp()不仅会导致出现"remaining"提示,还可能因为你发送后直接exit(),打断了Scapy的发送流程,导致包没真正发出去。
建议换成不等待响应的发送函数:
- 如果要保留你手动构造的Ether层,用
sendp()(链路层发送,不等待响应):sendp(reset, iface="ens37") - 如果不想手动处理链路层(Scapy可以自动帮你填充MAC地址),直接去掉Ether层,用
send()(网络层发送):reset = ip/tcp send(reset, iface="ens37")
2. 接口不匹配
你的sniff()指定了iface="ens37",但srp()默认可能用的是系统默认接口,不是ens37!这就会导致包发去了别的接口,tcpdump在ens37上自然抓不到。所以一定要给发送函数也指定相同的接口。
3. 权限问题
发送原始数据包需要root权限!如果你是用普通用户运行脚本,Scapy大概率没权限真正把包发出去,只会在控制台提示“Finished to send 1 packets”,但实际数据包根本没到网络上。解决办法很简单:用sudo python script.py ...运行你的脚本。
4. 链路层构造可能有问题
你手动构造Ether层时,dst=p[Ether].src和src=p[Ether].dst看起来是交换源目的MAC,但如果你的网络环境是通过路由器转发的(不是直连),这个MAC地址可能不对——毕竟路由器会替换MAC地址。这种情况下,手动构造Ether层反而会导致包无法正确路由,不如让Scapy自动处理链路层。
快速修复建议
把你代码里的srp(reset)改成:
sendp(reset, iface="ens37", verbose=1)
然后用sudo运行脚本,同时提前启动tcpdump:
sudo tcpdump -i ens37 host <你的serveur_ip> and port <你的serveur_port>
这样应该能解决tcpdump抓不到包的问题,同时也不会再出现"remaining 1 packets"的提示。
内容的提问来源于stack exchange,提问作者JoeJoe

