ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

TCP/IP详解学习笔记(4)-ICMP协议,ping和Traceroute

TCP/IP详解学习笔记(4)-ICMP协议,ping和Traceroute 1. 为什么 ping 通了不代表网络没问题很多人排查网络的第一步就是ping看到Reply from ...就觉得链路正常。但实际运维里经常遇到这种情况ping 目标 IP 完全通业务却连不上或者 ping 不通但网页能打开。这背后的原因往往藏在 ICMP 协议本身的工作机制里。ICMPInternet Control Message Protocol互联网控制报文协议是 IP 层的“辅助协议”。IP 协议本身不保证送达也不负责报错ICMP 就是补上这块能力当数据包传输出错主机不可达、端口不可达、TTL 超时路由器或目标主机会用 ICMP 把错误信息封包回传给源主机。同时 ICMP 也承担查询功能ping 用的 Echo Request/Reply、Traceroute 用的 TTL 超时报文都属于 ICMP 的范畴。这篇笔记聚焦三件事ICMP 报文在 TCP/IP 栈里的定位与结构、ping 和 Traceroute 分别依赖哪类 ICMP 报文、以及如何用 Wireshark 和 tcpdump 把协议字段和工具输出一一对应起来。适合已经了解 IP 基础、想真正看懂抓包结果的后端和运维同学。下面所有命令都可以直接复制执行我会给出实测的过滤表达式和逐跳验证步骤。2. 先把 ICMP 报文结构搞清楚2.1 ICMP 在协议栈中的位置ICMP 虽然和 IP 同层但它并不承载在 TCP 或 UDP 之上而是直接被 IP 封装。IP 头里的 Protocol 字段值为1时就表示上层是 ICMP。这一点很关键你在 Wireshark 里过滤icmp能直接命中但过滤tcp.port 80是抓不到 ping 包的。ICMP 报文整体结构非常简洁前 4 个字节是固定的字段长度说明Type8 bit报文类型如 8Echo Request0Echo Reply11TTL 超时Code8 bit同一类型下的子代码如 Type 3 下 Code 3 表示端口不可达Checksum16 bit覆盖整个 ICMP 报文的校验和可变部分视类型而定Echo 报文里是 Identifier Sequence Number 数据Type 和 Code 的组合决定了报文语义。常见的几组Type 8/Code 0 是 ping 请求Type 0/Code 0 是 ping 应答Type 11/Code 0 是 TTL 超时Traceroute 的核心Type 3/Code 3 是端口不可达Traceroute 判断到达目标的依据。2.2 查询报文与差错报文ICMP 报文分两大类。查询报文用于主动探测包括 Echoping、时间戳、地址掩码等差错报文在传输出错时被动产生包括目的不可达、超时、重定向等。这里有个容易被忽略的规则ICMP 差错报文本身不会再触发新的 ICMP 差错报文。否则一个出错包引发另一个出错包会无限循环。此外目的地址是广播或多播、源地址不是单个主机、非分片首片等情况也不会产生差错报文。这些规定都是为了抑制 ICMP 报文的无限传播。3. 用 ping 抓包看 Echo Request/Reply3.1 启动抓包并生成流量先在一个终端启动 tcpdump只抓 ICMPsudo tcpdump -i eth0 -n icmp -vv-n禁止 DNS 反解-vv输出更详细的字段。然后在另一个终端 ping 一个内网地址ping -c 4 192.168.1.1tcpdump 会打印出类似这样的内容IP 192.168.1.100 192.168.1.1: ICMP echo request, id 2314, seq 1, length 64 IP 192.168.1.1 192.168.1.100: ICMP echo reply, id 2314, seq 2, length 64注意id和seqid 是 ping 进程的标识seq 是序号。ping 命令输出的bytes32 time1ms TTL255里TTL 来自 IP 头time 是发送和收到应答的时间差而 id/seq 正是用来匹配请求和应答的。3.2 Wireshark 过滤表达式如果习惯图形界面用 Wireshark 打开抓包文件后在过滤栏输入icmp.type 8 || icmp.type 0只看 ping 的请求和应答。想进一步区分方向可以加 IP 条件icmp ip.src 192.168.1.100 icmp.type 8展开 ICMP 详情面板你能看到 Type、Code、Checksum、Identifier、Sequence Number 逐字段展开和 tcpdump 的输出完全对应。实测下来把 ping 命令的-c数量、-s包大小和抓包里的 length 字段对照能很快建立“命令参数 → 报文长度”的直觉。4. Traceroute 的 TTL 机制与逐跳验证4.1 TTL 超时报文是怎么产生的Traceroute 的原理是利用 IP 头的 TTL 字段。TTL 每经过一个路由器减 1减到 0 时路由器丢弃该包并回送一个 Type 11/Code 0 的 ICMP 超时报文。Traceroute 先发 TTL1 的探测包第一个路由器把 TTL 减到 0回送超时报文于是拿到第一跳 IP再发 TTL2拿到第二跳如此递增直到探测包到达目标主机。Linux 下 traceroute 默认发 UDP 包端口号大于 30000目标主机收到后回送 Type 3/Code 3 端口不可达traceroute 据此判断“到了”。Windows 的 tracert 则默认发 ICMP Echo靠 Echo Reply 判断到达。4.2 抓包验证每一跳在源主机抓 ICMP 超时报文sudo tcpdump -i eth0 -n icmp[icmptype] 11同时运行traceroute -n 8.8.8.8你会看到 tcpdump 每收到一个超时报文就打印一行源 IP 正是当前跳的路由器。把 traceroute 输出的每一跳 IP 和 tcpdump 里的ip.src对照就能确认路径。如果想看 UDP 探测包本身用sudo tcpdump -i eth0 -n udp portrange 33434-33534traceroute 默认从 33434 端口开始递增。Wireshark 里对应的过滤表达式icmp.type 11 || icmp.type 3这样能同时看到中间跳的超时报文和最终目标的端口不可达报文完整还原整条路径的探测过程。5. 常见报错与排查ping 显示 Request timed out但抓包能看到 Echo Request 没有 Reply。说明请求发出去了但目标没回或回程被拦。先确认目标是否禁 ping很多云主机默认关闭 ICMP再检查中间防火墙是否放行 ICMP。用tcpdump -i any icmp在目标机上抓看请求是否到达。traceroute 中间出现* * *。某一跳路由器配置了不回应 ICMP 超时或该跳被防火墙丢弃。这不代表路径断了继续看后续跳是否恢复即可。可以加-I改用 ICMP 探测或-T改用 TCP 探测绕过部分限制。Wireshark 过滤icmp抓不到任何包。检查抓包网卡是否选对容器环境里要抓宿主网卡或 veth 对。另外 ICMPv6 的过滤字段是icmpv6不是icmp别混用。ping 通但业务不通。这恰恰说明 ICMP 和 TCP/UDP 走的是不同路径或不同策略。ICMP 通只证明 IP 层可达端口是否开放、应用是否监听得用telnet或nc单独验证。6. 把抓包能力接到实际工作流里协议字段看懂了下一步是把它变成可复用的排查能力。如果你在写自动化脚本或 Agent 工具需要频繁调用模型来解析抓包结果、生成过滤表达式可以先把 API Key 配好。到 TaoToken API Keys 创建密钥接入文档在 TaoToken 接入文档里面有各语言的调用示例。想先验证模型对 ICMP 报文的理解直接开 模型对话 贴一段 tcpdump 输出让它解释字段。如果是要长期做网络排障类的编码和 Agent 任务Coding Plan 更适合按周期使用。控制台入口在 TaoToken Console官网是 taotoken.net。最后留一个我常用的习惯每次排查完网络问题把当时的 tcpdump 命令和 Wireshark 过滤表达式记到笔记里按“现象 → 过滤表达式 → 关键字段”三列整理。下次遇到类似问题直接翻笔记比重新推导快得多。ICMP 的 Type/Code 组合就那几组抓几次包就能形成肌肉记忆。
返回列表