4、ICMP与路由协议:ICMP报文类型,Ping与Traceroute原理,静态路由与动态路由
聊完TCP和UDP,咱们得把目光转向网络层的一个“小兄弟”——ICMP。很多人觉得ICMP就是Ping一下,没啥好学的。其实不然。我在排查网络故障时,ICMP往往是第一个给我递线索的家伙。它不传输用户数据,但它负责传递网络状态和控制信息,说白了就是网络的“传令兵”。
4.1 ICMP报文类型与结构
ICMP(Internet Control Message Protocol)是IP协议的附属协议。它封装在IP数据报的数据部分,但逻辑上属于网络层。它的报文类型很多,但常用的就那么几种。
| 类型(Type) | 代码(Code) | 含义 | 典型场景 |
|---|---|---|---|
| 0 | 0 | Echo Reply | Ping响应 |
| 3 | 0~15 | Destination Unreachable | 网络/主机/端口不可达 |
| 8 | 0 | Echo Request | Ping请求 |
| 11 | 0 | Time Exceeded | TTL超时(Traceroute核心) |
报文结构很简单:前4字节是类型、代码和校验和,后面跟着可变长度的数据。对于Echo Request/Reply,数据部分通常包含标识符、序列号和发送时间戳。
核心要点:ICMP不是用来传输数据的,它是用来报告错误的。但注意,ICMP错误报文不会再为ICMP错误报文生成新的ICMP报文,否则会形成风暴。这个坑我踩过,后面细说。
4.2 Ping原理:不只是“通不通”
Ping是ICMP最经典的应用。它发送Type=8的Echo Request,目标回复Type=0的Echo Reply。但Ping能告诉你的远不止“通不通”。
- RTT(往返时间):发送时间戳和接收时间戳的差值。我习惯用这个判断链路是否拥塞。
- 丢包率:没收到Reply的比例。超过5%就要警惕了。
- TTL值:从回复报文的TTL可以反推目标操作系统。Windows默认128,Linux默认64,Cisco设备默认255。
避坑指南:我曾经遇到一个案例,Ping内网网关通,但Ping外网不通。排查了半天,发现是防火墙禁用了ICMP。记住:Ping不通不代表网络不通,可能是策略限制。用telnet或nc测端口更靠谱。
4.3 Traceroute原理:逐跳探测
Traceroute(Windows下叫tracert)利用ICMP Time Exceeded报文。它发送UDP包(Linux)或ICMP Echo Request(Windows),TTL从1开始递增。每经过一个路由器,TTL减1,减到0时路由器返回ICMP Time Exceeded。这样就能拿到每一跳的IP地址。
流程是这样的:
- 发送TTL=1的探测包,第一跳路由器返回Time Exceeded。
- 发送TTL=2的探测包,第二跳路由器返回Time Exceeded。
- 直到到达目标,目标返回Port Unreachable(UDP模式)或Echo Reply(ICMP模式)。
注意:有些路由器会静默丢弃TTL超时的包,不返回ICMP。这时候Traceroute会显示* * *。这不一定是故障,可能是设备配置了安全策略。
4.4 路由协议:让数据包找到路
路由协议决定了数据包从A到B走哪条路。我把它分为两类:静态路由和动态路由。
4.4.1 静态路由
管理员手动配置。适合小型网络,简单可控。但网络拓扑变了,你得手动改。我见过一个运维兄弟,改了静态路由忘了删旧的,导致路由环路,整个部门断网半小时。
# Linux添加静态路由
ip route add 192.168.2.0/24 via 192.168.1.1 dev eth0
# Cisco设备
ip route 192.168.2.0 255.255.255.0 192.168.1.1
4.4.2 动态路由
路由器之间自动交换路由信息。常见的有RIP、OSPF、BGP。
| 协议 | 类型 | 度量标准 | 适用场景 |
|---|---|---|---|
| RIP | 距离矢量 | 跳数 | 小型网络 |
| OSPF | 链路状态 | 带宽/延迟 | 大型企业网 |
| BGP | 路径矢量 | AS路径 | 互联网骨干 |
我个人习惯在企业网用OSPF。它收敛快,支持VLSM,不会像RIP那样有15跳的限制。BGP嘛,那是运营商和IDC玩的,我平时接触不多,但知道它负责互联网的路由决策。
4.5 路由环路与防环机制
路由环路是网络噩梦。数据包在两个路由器之间来回转发,直到TTL耗尽。为什么会这样?因为路由表不一致。
动态路由协议都有防环机制:
- 水平分割:从某个接口学到的路由,不再从该接口通告出去。
- 毒性逆转:把失效路由的度量值设为无穷大(RIP是16跳),直接告诉邻居“这条路死了”。
- 触发更新:拓扑变化时立即发送更新,不等常规周期。
我的经验:有一次排查一个间歇性丢包问题,抓包发现ICMP Time Exceeded报文频繁出现。顺着路径查,发现两台核心交换机配置了相同的静态路由指向对方,形成了环路。删掉一条就好了。所以,静态路由一定要小心,尤其是默认路由。
4.6 本章知识体系
下面这张图把ICMP和路由协议的核心关系串起来了。你看一眼就能明白它们在整个网络层中的位置。
嗯,这一章的内容就到这里。ICMP和路由协议是网络层的左膀右臂,一个负责诊断,一个负责决策。你在实际工作中遇到网络不通、延迟高、路由环路这些问题时,回头看看这张图,思路会清晰很多。