如何解决Scapy中sr()函数的超时设置不生效问题?
Scapy ICMP扫描超时参数不生效的解决办法
问题根源
sr()是为多数据包收发场景设计的,它的timeout参数是等待所有响应的总时长,而非单个数据包的超时阈值,所以设置0.01秒无法起到预期的快速超时效果。- 代码存在变量名错误:函数参数定义为
host,但构造ICMP包时使用了未定义的destination变量,会导致逻辑异常。
修正方案
- 替换为
sr1()函数:该函数专门用于发送单个数据包并等待第一个响应,超时参数会直接作用于单个包的等待逻辑,精准度更高。 - 修正变量名:将
destination替换为函数参数host,保证逻辑一致性。 - 可选添加
retry=0参数:禁用自动重试机制,彻底避免额外等待时间。
修正后的代码
def icmp_ping(host): icmp_packet = IP(dst=host)/ICMP() # sr1返回收到的第一个响应,超时则返回None response = sr1(icmp_packet, timeout=0.01, verbose=False, retry=0) # 可根据需求返回响应包,或直接返回主机是否可达的布尔值 return response is not None
补充说明
如果仍存在轻微的超时偏差,可能是操作系统网络栈的默认限制(比如ICMP底层的重试机制),但上述修改已经能解决绝大多数快速扫描场景下的问题。
内容的提问来源于stack exchange,提问作者Khalsam
相关产品推荐
相关产品推荐

