ICMP
复习
- IPv4 数据包:靠 TTL 防止数据包无限转发
- 路由器与逐跳转发:路由器只决定下一跳
- MTU 与分片:包太大时需要分片
TL;DR
- ICMP 用于报告转发过程中的错误与诊断信息
- 它不承载用户数据,是网络里的“差错信使”
- 目的地不可达、TTL 超时等,都靠它通知
- ping 和 traceroute 就建立在 ICMP 之上
正文
数据包踏上旅途后,可能遇到各种意外:目的地根本不存在、绕来绕去绕不出来、太大塞不进。可它自己没法回头报信——那谁来告诉发送方“出事了”?
这个报信人,就是 ICMP(互联网控制消息协议,Internet Control Message Protocol)。
一个专门报告“坏消息”的协议
ICMP 不传输你要发送的真正数据,它专门传递关于网络本身的消息。常见的几种:
- 目的地不可达:这个地址到不了
- 超时:包的 TTL 减到 0 被丢弃
- 重定向:告诉你换一条更合适的路走
收到这类消息,发送方至少能知道“刚才那包没成功,原因是这个”,而不是一直傻等。
两个熟悉的工具
ICMP 最有名的作用,是支撑起两个几乎人人都用过的工具。
- ping:发一个“回声请求”,对方回一个“回声应答”。能收到,说明这条链路至少是通的;顺便还能算出往返时间
- traceroute:不断发出 TTL 依次增大的包。TTL 为 1 的包在第一台路由器就被丢弃并回一个“超时”消息,于是暴露了第一跳;TTL 为 2 的包暴露第二跳……一层层试探,就勾勒出整条路径
你会发现,traceroute 很聪明地复用了 TTL 机制:本来用来防止无限转发的字段,被反过来当作逐跳探测的工具。
它只是信使
要记住 ICMP 的边界:它只负责报信,不负责补救。
它不会替你重传数据,也不能保证消息一定送达(它自己也可能丢)。收到“目的地不可达”,究竟要不要重试、怎么重试,得由上层协议(比如 TCP)自己决定。
把“发现问题”和“解决问题”分开,是网络设计里反复出现的分工思路。
思考题 1
TTL 耗尽时,路由器靠什么通知发送方?
思考题 2
traceroute 是怎样利用 TTL 逐跳发现路径的?
小结
知识点
- ICMP 传递网络自身的差错与诊断信息
- 常见消息:不可达、超时、重定向
- ping 与 traceroute 建立在 ICMP 之上
- ICMP 只报信,不负责重传或纠正
参考资料
- Wikipedia(zh):互联网控制消息协议:传递网络差错与诊断信息
- Wikipedia(zh):traceroute:利用 TTL 逐跳探测路径
思考题答案(仅供参考)
思考题 1
路由器在 TTL 减到 0、丢弃该包时,会向发送方回送一条 ICMP“超时”消息,从而告知发送方这个包没能到达。发送方由此知道出了问题及大致原因。
思考题 2
traceroute 先发 TTL 为 1 的包,第一台路由器减到 0 便丢弃并回送超时消息,于是暴露了第一跳的地址;再发 TTL 为 2 的包,暴露第二跳……如此逐步增大 TTL,就能一站一站地把整条路径探出来。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪