![ICMP协议详解](http://img.jiangsulong.com/220406/0Z61TU2-0.jpg)
文章插图
ICMP(Internet Control Message Protocol)是介于网络层和传输层的协议 。它的主要功能是传输网络诊断信息 。
ICMP传输的信息可以分为两类 , 一类是错误(error)信息 , 这一类信息可用来诊断网络故障 。我们已经知道 , IP协议的工作方式是“Best Effort” , 如果IP包没有被传送到目的地 , 或者IP包发生错误 , IP协议本身不会做进一步的努力 。但上游发送IP包的主机和接力的路由器并不知道下游发生了错误和故障 , 它们可能继续发送IP包 。通过ICMP包 , 下游的路由器和主机可以将错误信息汇报给上游 , 从而让上游的路由器和主机进行调整 。需要注意的是 , ICMP只提供特定类型的错误汇报 , 它不能帮助IP协议成为“可靠”(reliable)的协议 。另一类信息是咨询(Informational)性质的 , 比如某台计算机询问路径上的每个路由器都是谁 , 然后各个路由器同样用ICMP包回答 。
(ICMP基于IP协议 。也就是说 , 一个ICMP包需要封装在IP包中 , 然后在互联网传送 。ICMP是IP套装的必须部分 , 也就是说 , 任何一个支持IP协议的计算机 , 都要同时实现ICMP 。)
ICMP包的结构:
![ICMP协议详解](http://img.jiangsulong.com/220406/0Z61T0R-1.jpg)
文章插图
A bunch of Types
ICMP包都会有Type, Code和Checksum三部分 。Type表示ICMP包的大的类型 , 而Code是一个Type之内细分的小类型 。针对不同的错误信息或者咨询信息 , 会有不同的Type和Code 。从上面我们可以看到 , ICMP支持的类型非常多 , 就好像瑞士军刀一样 , 有各种各样的功能 。Checksum与IP协议的header checksum相类似 , 但与IP协议中checksum只校验头部不同 , 这里的Checksum所校验的是整个ICMP包(包括头部和数据) 。
余下的ICMP包格式根据不同的类型不同 。另一方面 , ICMP包通常是由某个IP包触发的 。这个触发IP包的头部和一部份数据会被包含在ICMP包的数据部分 。
ICMP协议是实现ping命令和traceroute命令的基础 。这两个工具常用于网络排错 。
常见的ICMP包类型
回音
回音(Echo)属于咨询信息 。ping命令就是利用了该类型的ICMP包 。当使用ping命令的时候 , 将向目标主机发送Echo-询问类型的ICMP包 , 而目标主机在接收到该ICMP包之后 , 会回复Echo-回答类型的ICMP包 , 并将询问ICMP包包含在数据部分 。ping命令是我们进行网络排查的一个重要工具 。如果一个IP地址可以通过ping命令收到回复 , 那么其他的网络协议通信方式也很有可能成功 。
源头冷却
源头冷却(source quench)属于错误信息 。如果某个主机快速的向目的地传送数据 , 而目的地主机没有匹配的处理能力 , 目的地主机可以向出发主机发出该类型的ICMP包 , 提醒出发主机放慢发送速度(请温柔一点吧) 。
目的地无法到达
目的地无法到达(Destination Unreachable)属于错误信息 。如果一个路由器接收到一个没办法进一步接力的IP包 , 它会向出发主机发送该类型的ICMP包 。比如当IP包到达最后一个路由器 , 路由器发现目的地主机down机 , 就会向出发主机发送目的地无法到达(Destination Unreachable)类型的ICMP包 。目的地无法到达还可能有其他的原因 , 比如不存在接力路径 , 比如不被接收的端口号等等 。
超时
超时(Time Exceeded)属于错误信息 。IPv4中的Time to Live(TTL)和IPv6中的Hop Limit会随着经过的路由器而递减 , 当这个区域值减为0时 , 就认为该IP包超时(Time Exceeded) 。Time Exceeded就是TTL减为0时的路由器发给出发主机的ICMP包 , 通知它发生了超时错误 。
traceroute就利用了这种类型的ICMP包 。traceroute命令用来发现IP接力路径(route)上的各个路由器 。它向目的地发送IP包 , 第一次的时候 , 将TTL设置为1 , 引发第一个路由器的Time Exceeded错误 。这样 , 第一个路由器回复ICMP包 , 从而让出发主机知道途径的第一个路由器的信息 。随后TTL被设置为2、3、4 , ... , 直到到达目的主机 。这样 , 沿途的每个路由器都会向出发主机发送ICMP包来汇报错误 。traceroute将ICMP包的信息打印在屏幕上 , 就是接力路径的信息了 。
推荐阅读
- 10分钟了解HTTP协议的前世今生
- Python模块详解
- Android多线程编程之详解:阻塞队列+线程池
- 装修房子的风水最详解析
- 冰墩墩用粘土怎么捏,冰墩墩粘土制作步骤教程详解
- 干货 TCP/IP加速原理详解
- MySQL 中常见的字符串函数应用详解
- Spring Boot配置文件yml格式详解
- php反射机制用法详解
- Android网络编程-TCP/IP协议