You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何自制Traceroute脚本仅在执行tracert后于4G网络正常工作?

手机热点4G环境下自制Traceroute脚本卡顿问题排查分析

以下是针对你遇到的问题的可能原因及排查方向:

1. 4G网络NAT/运营商限制差异

手机热点的4G网络通常搭载运营商级NAT,部分运营商对ICMP探测包的初始连接会做限流或丢弃处理。而系统自带的tracert发送的标准ICMP Echo Request包会触发NAT建立临时会话规则,后续脚本的包就能基于这个已建立的规则正常传输。

  • 检查脚本构造的ICMP包是否完全匹配Windowstracert的格式:tracert默认发送ICMP Echo Request(类型8,代码0),TTL从1开始递增,确认你的脚本是否使用相同的ICMP类型,以及对Time Exceeded(类型11)响应的处理逻辑是否正确。

2. 超时与发包间隔设置不合理

4G网络延迟波动远大于Wi-Fi/有线网络,如果脚本的超时时间过短或发包间隔未做适配,会导致探测超时后无法正常进入下一轮循环,进而卡住。而系统tracert默认超时为4000ms,发包间隔也适配了移动网络特性。

  • 对比脚本与tracert的超时设置:比如你是否设置了socket.settimeout(1)这类过短的超时?建议调整为4秒,并为每个TTL添加3次重试机制。

3. 底层网络栈初始化差异

虽然以管理员身份运行,但Windows网络栈处理ICMP包时,系统tracert会触发特定的底层初始化(如加载驱动、配置网络参数),而自制脚本首次运行时这些初始化未完成,导致包无法正常接收。

  • 检查脚本的Socket创建逻辑:Windows下创建ICMP原始套接字必须使用socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP,确认代码是否正确,示例如下:
    import socket
    try:
        icmp_sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
    except PermissionError:
        print("需要管理员权限运行")
        exit(1)
    

4. ICMP响应解析逻辑遗漏异常处理

4G网络中可能收到运营商返回的自定义ICMP包,若脚本未处理这类异常响应,会卡在等待正确响应的循环中。而系统tracert能兼容这类异常,继续后续探测。

  • 检查响应处理逻辑:是否添加了超时后的退出机制?是否对所有收到的ICMP包做了类型校验(区分Time Exceeded和Echo Reply)?比如:
    # 简化示例:解析ICMP头部
    icmp_header = recv_packet[20:28]
    type_code = icmp_header[0]
    if type_code == 11:
        # 处理TTL超时响应
        pass
    elif type_code == 0:
        # 处理目标响应
        break
    else:
        # 忽略其他类型ICMP包,继续等待
        continue
    

排查建议

  • 在脚本中添加详细日志,记录每次发包的TTL、发送时间、响应状态,卡住时查看最后一条日志,确定是发包失败还是等待响应超时。
  • 用Wireshark抓包对比脚本与tracert的ICMP包格式,检查TTL、ICMP类型、包长度等是否一致。
  • 尝试在脚本运行前先执行ping 目标地址,验证是否能通过提前建立ICMP会话解决卡顿问题。

内容的提问来源于stack exchange,提问作者Lipe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 15:43:37