
前几篇我们把数据送到了家里的路由器电脑发现网站不在本地网络就把数据交给默认网关。接下来的路由器也要回答同一个问题这份数据下一步交给谁它不会在收到数据包时临时查出一条从你家到网站服务器的完整路线。它查看目标 IP 地址查自己的路由表选出下一站。下一台路由器收到后再作一次选择。数据包就这样一跳一跳向前走。今天把这个过程弄清楚再看ping和tracert它们为什么能帮我们观察网络又为什么不能替我们证明“网站一定能打开”。路由器手里有什么信息上一篇说过电脑有路由表。路由器也有只是通常要处理更多网络。你可以先把路由表读成一组规则去某个地址范围 → 从某个接口发出或交给某个下一站假设一台路由器有下面几条路由目标 IP 是10.20.30.42目标地址范围下一站10.0.0.0/8A10.20.0.0/16B10.20.30.0/24C0.0.0.0/0D四条都能“匹配”这个目标10.20.30.42属于10.0.0.0/8也属于更小的10.20.30.0/24。路由器会优先采用最具体的匹配也就是前缀最长的那条。因此这个例子会选/24把数据交给 C。这个规则叫最长前缀匹配。最后一行0.0.0.0/0的匹配范围最大是默认路由。只有没有更具体的路可用时才会用到它。你家路由器通常就靠一条默认路由把不知道具体该怎么走的外部流量交给运营商。这里的“下一站”不是最终网站。路由器只决定自己负责的这一跳到达下一站后下一站再查它自己的路由表。每经过一跳数据包会发生什么变化假设电脑访问一个远端服务器路径暂时画成电脑 → 家用路由器 → 运营商路由器 → 其他路由器 → 服务器在一般的 IP 转发过程中目标 IP 仍指向服务器。路由器不会因为要把数据交给运营商就把 IP 里的目标改成“运营商路由器”。下一站交接所需的地址由当前这一段网络的链路层处理。前面讲过的 MAC 地址就是常见局域网里使用的地址。不过有两个细节值得现在记住第一每到一段新的网络交接方式和使用的链路层地址可能变化。第一跳使用你家路由器的 MAC不代表后面的设备也继续使用这个 MAC。第二家用 IPv4 网络通常还会经过 NAT。路由器可能改写来源 IP 和端口让家里多台设备共享对外连接。因此“IP 地址一路完全不变”也不准确。今天讨论路由时重点看的是设备如何依据目标 IP选择下一站。路由表如果既没有匹配的具体路由也没有可用的默认路由数据包就无法继续转发。路由器不会随便挑一条线试试看。如果路由表出了错数据包会不会绕圈可能会。比如两台路由器配置错误甲认为“去那个网络应该找乙”乙却认为“应该找甲”。数据包可能在它们之间来回转发。IP 数据包里有一个限制这种情况的字段TTL。名字叫Time To Live但在日常观察中更适合把它理解为“还能经过多少次路由转发”的计数。路由器转发 IPv4 数据包时会减少 TTL当它减到无法继续转发时路由器丢弃该包。这样即使网络里出现转发环路一个数据包也不会永远兜圈子。路由器通常会向发送方返回一条ICMP Time Exceeded消息告诉它“数据包走到我这里时TTL 用尽了。”等会儿我们就利用这个机制看见沿途有哪些路由器。ICMP 是什么ping又在问什么ICMP 是配合 IP 使用的一类控制与差错报告消息。它可以表达“目标无法到达”“TTL 用尽”等情况也包含ping使用的回显请求与回显应答。运行ping 192.168.1.1电脑通常会向这个地址发送ICMP Echo Request。如果对方愿意回应会返回Echo Reply。ping再计算这一来一回花了多久也就是往返时间。假设结果显示来自 192.168.1.1 的回复时间2ms你可以说“我的电脑收到了网关对这次 ICMP 请求的回应。”但不能再往前推成“互联网完全正常”因为请求根本还没走到外部网站。即使ping一个网站地址得到回应也只能说明这类 ICMP 请求得到了回应它没有替浏览器测试 TCP 连接、TLS 握手或 HTTP 响应。反过来ping没有回应也未必表示网页打不开。有些设备会限制或不回复 ICMP仍然正常提供网页服务。ping是一项有用的证据不是给整个网站判生死的按钮。tracert怎样让沿途路由器露面Windows 上的tracert利用了刚才的 TTL。它先发送一个 TTL 为 1 的探测包。第一个路由器处理时TTL 用尽返回 ICMP Time Exceeded。于是你知道了第一跳是谁。然后它发送 TTL 为 2 的探测包。这个包能经过第一跳到第二个路由器时用尽 TTL第二跳就有机会返回消息。接着是 3、4、5……直到目标回应或探测结束。TTL1 → 第一跳丢弃并回应 → 看见第一跳 TTL2 → 第二跳丢弃并回应 → 看见第二跳 TTL3 → 第三跳丢弃并回应 → 看见第三跳Windows 的tracert使用 ICMP 回显请求做这种探测。其他系统里的traceroute默认探测方式可能不同但借助逐步增加 TTL 观察路径的思路相近。你可能会看到这样的结果1 2 ms 1 ms 2 ms 192.168.1.1 2 12 ms 11 ms 13 ms ... 3 * * * 请求超时 4 25 ms 24 ms 26 ms ...第三跳显示星号第四跳却又出现了。这通常说明第三跳没有对探测作出可见的回应不等于数据包在第三跳被彻底堵住否则后面的路由器也不会被探测到。同样不要拿相邻两行的毫秒数直接相减声称“这一段链路耗时多少”。每一行测的是探测包到那个节点、再返回你电脑的往返时间返回路径和路由器处理探测消息的方式都可能不同。tracert展示的是这次探测观察到的路径不是网站所有流量都必经的一条永久路线。动手看一次从网关走向网站Windows 用户先运行ipconfig记下正在使用的网卡的“默认网关”。然后试试ping 你的默认网关IP这一步主要观察电脑与本地网关之间的通信。接着运行tracert /d example.com/d表示不再额外尝试把沿途 IP 地址转换成名称输出通常更快、更容易读。example.com只是一个练习目标网站是否回应探测、途中显示多少跳会因网络环境而异。读结果时重点回答三个问题第一跳是不是你的网关在常见家庭网络里通常是。中间有没有*如果后续跳数仍出现不要把那一行直接判作断网点。最终有没有到达目标如果没有只能说明这次探测没得到完整结果还要结合其他检查判断原因。至此一份数据包走出家门后的过程就清楚了每台路由器查看目标 IP在路由表中选择最具体的匹配交给下一站TTL 限制它能被不断转发的次数ICMP 则让我们得到一些沿途信息。下一篇我们会回到数据的两端当 IP 已经把数据送到正确的机器机器怎样知道该交给哪个程序TCP 和 UDP 又为什么要提供不同的传输方式参考资料IPv4 路由器要求 RFC 1812、ICMP 规范 RFC 792、微软tracert使用说明。