ICMP协议
ICMP经常被认为是IP层的一个组成部分,它传递差错报文以及其它需要注意的信息。ICMP报文通常交由IP层或者更高层协议(TCP/UDP)处理,一些ICMP报文把差错报文返回给用户进程。
ICMP报文格式
ICMP报文是在IP数据报内部被传输的:
其报文格式如下图所示,所有的报文前4个字节都是一样的。
- 类型字段有15个不同的值,以描述特定类型的ICMP报文。某些ICMP报文还使用代码字段进一步描述不同的条件。
- 校验和字段覆盖整个ICMP报文,算法和IP首部检验算法相同。
ICMP报文可以是一份查询报文,也可是是一份差错报文。下面几种情况不对导致产生ICMP差错报文(防止ICMP差错报文对广播分组影响带来的广播风暴):
- ICMP差错报文(查询报文可能会)
- 目的地址是广播地址或多播地址的IP数据报
- 作为链路层广播的数据报
- 不是IP分层的第一片
- 源地址不是单个主机的数据报。(源地址不能为零地址、回环地址、广播地址或多播地址)
ICMP报文例子
- ICMP重定向差错:假设一主机发送一份IP数据报给路由器R1(可能是默认路由),R1收到后并检查它的路由表,发现R2是发送该数据报的下一站,把数据报转发给R2。若发现R2和发送方属于同一接口(LAN),则R1发送一份ICMP重定向报文给发送端,告诉它把数据报发送给R2而不是R1。 主机启动时路由表中可能只有一个默认表项。通过重定向报文可以让路由信息很少的主机逐步建立完善的路由表。
- ICMP路由器通告、请求报文:除了指定静态路由来初始化路由表,还可以通过ICMP路由器通告和请求报文来实现。一般认为主机引导后要广播或多播一份路由器请求报文,一台或更多台路由器响应一份路由器通告报文。另外,路由器会不定期随机发送一份路由器通告报文,允许每个正在监听的主机相应的更新它们的路由表。
各类型ICMP报文
参考
[1] TCP/IP详解卷1
[2] 维基百科