Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

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 只报信,不负责重传或纠正

参考资料

  1. Wikipedia(zh):互联网控制消息协议:传递网络差错与诊断信息
  2. Wikipedia(zh):traceroute:利用 TTL 逐跳探测路径

思考题答案(仅供参考)

思考题 1

  路由器在 TTL 减到 0、丢弃该包时,会向发送方回送一条 ICMP“超时”消息,从而告知发送方这个包没能到达。发送方由此知道出了问题及大致原因。

思考题 2

  traceroute 先发 TTL 为 1 的包,第一台路由器减到 0 便丢弃并回送超时消息,于是暴露了第一跳的地址;再发 TTL 为 2 的包,暴露第二跳……如此逐步增大 TTL,就能一站一站地把整条路径探出来。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪