一、ICMP报文

1.1 ICMP报文格式

image.pngICMP报文中最常用的类型是主动请求为8,应答是0。

1.2 查询报文类型

我们常用的ping报文,本质上就是一种ICMP报文,当从机器A ping 机器B的时候,首先会发送一个ICMP ECHO REQUEST。机器B收到ping请求后,会返回一个ICMP ECHO REPLY。ping报文中,标识符是用来表示ping的id,防止冲突。在数据中,存放了发送请求的时间值,用来计算往返时间。

1.3 差错报文类型

我们在写代码中,调用函数,都会有很多返回值,比如会提示你输入不符合要求,或者其他各种异常情况,通过返回值或者Exception来通知你,而在网络中,也有这样的机制,通过特殊的报文形式,来告诉你各种异常情况,
常见的异常类型如下:

1.3.1 主机不可达

  • 网络不可达
  • 主机不可达
  • 协议不可达
  • 端口不可达
  • 需要进行分片,但是没有进行分片。

    1.3.2 源站抑制

  • 用于流量控制,通知发送方,发送的慢一点。

    1.3.3 时间超时

  • 用于超时控制,通知客户端超时。

    1.3.4 路由重定向

二、PING 发送和接受详解

image.png
对于Client端,首先是封装ICMP报文,ICMP ECHO REQUEST,然后交给3层,3层封装IP头,交给2层,2层通过查ARP表,查到dest ip 的mac 地址,然后开始封装MAC头,交给交换机。交换机查看本地MAC表,走右边的口发送出去。
对于Server端,收到报文,首先到2层,拆开MAC头,发现目标MAC是自己,把拆完的包给3层,3层拆开IP头,发现dest ip 是自己,把拆完的包给ICMP层,ICMP进行ICMP ECHO REPLY。进行回复。
接下来的Server端封包,Client端解包。一次完整的ping流程就结束了。

三、TRACEROUTE 原理。

traceroute命令可以快速定位到源地址到目标地址经过了哪些网关。原理当报文超时的时候,网关会发送差错报文。初始的时候, traceroute会发送一个TTL为1的UDP报文,当遇到第一个网关的时候,就发现超时了,网关就直接返回了,这样traceroute就知道了到第一个网关的ip以及时间。接着不断地增大TTL,这样所有网关都能回复客户端并且带着自生的ip和时间。
但是有时候,traceroute会返回???,原因就是有些路由器是禁ICMP的,所以发出去的报文就直接没了。
怎么才知道目标主机是否可达呢。traceroute通过发送一个UDP报文,并且设置一个不存在的UDP端口,这样目标主机会返回一个端口不可达的ICMP报文。

四、总结

  • ICMP报文是一种探测以及差错报文。
  • ping使用的是查询报文,traceroute使用的是差错报文。