ICMP
ICMP(Internet Control Message Protocol)是 TCP/IP 协议簇的一个子协议,用于在 IP 主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。例如,数据报大小超过设备的最大处理能力,设备就会丢弃该数据报并往回发送一个 ICMP 消息。又例如网关发现一个更短的路由路径,就会往回发送一个 ICMP 消息,数据报会被路由到更短的路径。
ICMP 协议是为了辅助 IP 协议,交换各种各样的控制信息而被制造出来的,它工作在网络层,是 IP 的组成部分,必须由每个 IP 模块实现。
ICMP 大致分成两种功能:差错通知和信息查询。
MTU 探索:找到通信对方之间不用分片 IP 数据报,就能交流的 MTU 大小的功能。
改变路由:路由器向送信方指示路径改变。源主机根据路由信息来决定传送目标,没有相应的路由信息就发给默认网关的路由器。默认网关接收到数据包,发现将数据包发给局域网内的其它路由器会比较快的时候,将这一信息通过 ICMP 通知发送方。
源点抑制:数据包集中到达某一路由器后,数据包来不及被处理,有可能被丢弃。此时向送信方发送 ICMP 源点抑制报文,用来使送信方减慢发送速度。
traceroute:通过发送不同 TTL 的数据报,然后凭借 ICMP 超时报文来确定路径信息。
ICMP 信息包含在 IP 数据报的数据部分,IP 数据报的协议字段值为 1。
ICMP 消息包含源数据报完整的首部,以使源主机定位出错的包。
一般格式
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Pointer: Identifies the problem in the original IP message |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Message Body +
| |
Type: 消息类型,8 bits,常见有
Type 3 -- Destination unreachable
Code: 编码,8 bits,提供消息类型更详细的信息。
Pointer:指针,32 bits,指出原数据报中问题所在字节位置。
Network Unreachable——网络不可达
Protocol Unreachable——协议不可达
Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特
Source routing failed——源站选路失败
Destination network unknown——目的网络未知
Destination host unknown——目的主机未知
Source host isolated (obsolete)——源主机被隔离(作废不用)
Destination network administratively prohibited——目的网络被强制禁止
Destination host administratively prohibited——目的主机被强制禁止
Network unreachable for TOS——由于服务类型TOS,网络不可达
Host unreachable for TOS——由于服务类型TOS,主机不可达
Communication administratively prohibited by filtering——由于过滤,通信被强制禁止
Host precedence violation——主机越权
Precedence cutoff in effect——优先中止生效
Source quench——源端被关闭(基本流控制)
Redirect for network——对网络重定向
Redirect for host——对主机重定向
Redirect for TOS and network——对服务类型和网络重定向
Redirect for TOS and host——对服务类型和主机重定向
Echo request——回显请求(Ping请求)
Router advertisement——路由器通告
Route solicitation——路由器请求
TTL equals 0 during transit——传输期间生存时间为0
TTL equals 0 during reassembly——在数据报组装期间生存时间为0
IP header bad (catchall error)——坏的IP首部(包括各种差错)
Required options missing——缺少必需的选项
Timestamp request (obsolete)——时间戳请求(作废不用)
Timestamp reply (obsolete)——时间戳应答(作废不用)
Information request (obsolete)——信息请求(作废不用)
Information reply (obsolete)——信息应答(作废不用)
Address mask request——地址掩码请求
Address mask reply——地址掩码应答
ICMPv6 除了与 ICMP 相同的功能外,还有基于 ICMPv6 实现的邻居发现,包括:地址解析、重复地址检测、路由发现、Path MTU发现以及重定向等功能。
ICMPv6 的协议号为 58,也就是在 IPv6 报文中的 Next Header 的值为58。