程序员社区

一文搞懂什么是ICMP协议

网络上的报文并不总是能顺利地传送并被接收,有时可能由于网关MTU太小而报文不允许分片造成报文不能被网关转发,有时可能由于TTL值减小到0而不能继续发送或接收,也有可能由于报文头参数有问题而不能被接收者接收,这些问题,并不能简单地丢弃处理。如果你丢弃了又不告诉源主机,源主机会认为它发送成功了,这样会造成通信双方信息不同步,进而造成更大的故障。所以,在丢弃报文的同时,还必须告知源主机丢弃的原因,就是通过ICMP报文携带相关信息

ICMP

ICMP

Internet Control Message Protocol,它位于网络层,是IP层的一个组成部分,主要用来传递差错报文以及其他需要注意的信息

一文搞懂什么是ICMP协议插图

icmp协议是网络层上的一个组成部分,所以icmp报文具有ip层首部,这里我并没有把icmp写成icmpHeader+icmpPayload,因为icmp报文的类型有很多,造成了icmp报文结构并不完全相同

差别在哪?我们先看一下icmp报文通用格式

一文搞懂什么是ICMP协议插图1

所有类型的icmp报文都有1字节的Type、1字节的Code和2字节的Checksum,然后根据Type和Code值不同,决定了Message Body的不同

  • Type

报文类型,用来表示报文

  • Code

代码,提供报文类型的进一步信息

  • Checksum

校验和,icmp校验和仅覆盖icmp报文

  • Message Body

字段的长度和内容,取决于消息的类型和代码

ICMP报文类型

ICMP Echo Request/Response

用于检测IP网络连通性的Ping/Tracert,就是我们在cmd窗口中ping的操作

ICMP目的不可达消息

IP是一个尽力而为的交付机制,不会轻易丢弃数据报。当路由设备无法转发或者交付IP数据报时,会向源站发送一个目的站不可达的报文,然后丢弃该数据报

这就是我们在序言里提及的由于路由设备的MTU太小而需要分片,然而IP报文DF标志位不允许,造成无法转发,此时路由会丢弃报文并同时向源主机发送一条ICMP目的不可达消息

ICMP重定向消息

ICMP重定向消息是ICMP控制报文中的一种。在特定的情况下,当路由器检测到一台主机或网络设备使用非优化路由的时候,它会向该主机或网络设备发送一个ICMP重定向报文,请求主机或网络设备改变路由。路由器也会把初始数据报向它的目的地转发

ICMP超时消息

当收到TTL为0的报文时,网络设备/主机会丢弃该报文,并返回一个ICMP超时报文

ICMP参数问题消息

如果发现接收的数据包存在报文头参数有问题,无法完成数据包解析时,网络/主机会将数据包丢弃,并可能会返回一个ICMP参数问题消息给源端

当报文的IP头部,或者TCP头部,或者UDP头部里发生参数错误,接收者无法完成数据包解析工作,就会把数据包丢弃,并返回一个icmp参数问题消息

ICMP源端被关闭消息

用于表示对方或中途的服务器繁忙无法回应。如果网络设备没有足够的缓存空间存储到某个目的主机的报文时,这些报文会被该设备丢弃。此时,网络设备发送ICMP源端被关闭消息给该目的主机。如果到达某一个主机的数据包过快,来不及被主机处理,则该主机也可以发送ICMP源端被关闭消息,以便降低数据包速率

最后,以上讲的都是ICMPv4协议,基于IPv4协议的icmp报文,ICMPv6有自己的定义和格式


赞(0) 打赏
未经允许不得转载:IDEA激活码 » 一文搞懂什么是ICMP协议

相关推荐

  • 暂无文章

一个分享Java & Python知识的社区