ICMP介绍以及traceroute和ping的实现原理
ICMP介绍
ICMP(Internet Control Message Protocol)用于主机或者路由器报告差错情况和提供有关异常的情况报告,和IP协议同时处于网络层,但是ICMP会使用IP,最终由IP来传输其信息(everything is over ip)
常规ICMP报文格式截图:
主要分为两大类:差错报告报文和询问报文。
ICMP报文类型 | 类型对应的值 | ICMP报文的类型 |
---|---|---|
差错报告报文 | 3 | 终点不可达:路由器或者主机发现信息不可达时 |
11 | 时间超时(TTL):当路由器收到TTL为1,然后-1后是0,则丢弃数据的同时向源主机发送 | |
12 | 参数问题 | |
5 | 改变路由:默认路由器发现有跟好的路由线路 | |
询问报文 | 8或者0 | 回送请求或回答 |
13或者14 | 时间戳请求或回答 |
ICMP的差错报告报文中,会把收到的需要进行差错报告的IP的数据提取出来作为ICMP报文的数据部分。
可以看到icmp内部包含了一个完整的IP数据包。
典型的ICMP的应用是trace route 和ping应用,这两个应用直接通过ICMP从而跳过了传输层协议(TCP or UDP)。
ICMP看上去像高层协议,实际上不是,是IP层的协议。
trace route应用
有地方介绍是源主机向目的主机发送不可达的udp报文,然后路由器通过TTL变为0后返回给源主机ICMP报文,但是实际抓包发现trace route给目的主机发送的也是icmp报文。
源主机向目标主机发送ICMP报文:
第一次发送时IP的TTL设置为1,第一个路由器收到后,把TTL减1,丢弃该数据,并且向源主机发送一个超时的ICMP报文(code为11),这样源主机就得到了第二个路由器的IP地址。
第二次发送时IP的TTL设置为2。得到第二个路由器的IP地址。
。。。
一直发送后直到如果收到一个常规的ICMP回答(code为0),则认为找到了最后一个路由器。(如果某次ICMP请求在固定时间内没有返回,则显示超时,继续下一条的路由查找【上图中标红的case】)。
最终的IMCP回答报文,标志着traceroute结束
应答报文截图。
ping应用
ping使用icmp的回送请求和回送应答报文。
抓包
可以看到分别发送了4次request,同时得到了4次reply,和cmd console中展示的效果一致。
回送请求报文示例,type为8。
回送应答示例,type为0,同时返回了耗时15ms,和cmd console里面展示的温和。