六、ICMP 与 ping
ICMP 协定的格局
ping 是基于 ICMP 协定工作的。ICMP 全称 Internet Control Message Protocol,就是互联网管制报文协定。
ICMP 报文是封装在 IP 包外面的。因为传输指令的时候,必定须要源地址和指标地址。它自身非常简单。
ICMP 报文有很多的类型,不同的类型有不同的代码。最罕用的类型是被动申请为 8,被动申请的应答为 0。
查问报文类型
罕用的 ping 就是查问报文,是一种被动申请,并且取得被动应答的 ICMP 协定。所以,ping 发的包也是合乎 ICMP 协定格局的,只不过它在前面减少了本人的格局。
对 ping 的被动申请,进行网络抓包,称为 ICMP ECHO REQUEST。同理被动申请的回复,称为 ICMP ECHO REPLY。比起原生的 ICMP,这外面多了两个字段,一个是标识符(标识是申请还是回复),另一个是序号(每个收回的报文都有序号)。
在选项数据中,ping 还会寄存发送申请的工夫值,来计算往返工夫,阐明途程的长短。
过错报文类型
起点不可达为 3,源克制为 4,超时为 11,重定向为 5。
过错报文的构造绝对简单一些。除了后面还是 IP,ICMP 的前 8 字节不变,前面则跟上出错的那个 IP 包的 IP 头和 IP 注释的前 8 个字节。
ping:查问报文类型的应用
ping 命令执行的时候,源主机首先会构建一个 ICMP 申请数据包,ICMP 数据包内蕴含多个字段。最重要的是两个,第一个是 类型字段 ,对于申请数据包而言该字段为 8;另外一个是 顺序号,次要用于辨别间断 ping 的时候收回的多个数据包。每收回一个申请数据包,顺序号会主动加 1。为了可能计算往返工夫 RTT,它会在报文的数据局部插入发送工夫。
主机 B 会构建一个 ICMP 应答包,应答数据包的类型字段为 0,顺序号为接管到的申请数据包中的顺序号,而后再发送进来给主机 A。
在规定的时候间内,源主机如果没有接到 ICMP 的应答包,则阐明指标主机不可达;如果接管到了 ICMP 应答包,则阐明指标主机可达。此时,源主机会查看,用以后时刻减去该数据包最后从源主机上收回的时刻,就是 ICMP 数据包的时间延迟。
常常会遇到一个问题,如果不在咱们的管制范畴内,很多中间设备都是禁止 ping 的,然而 ping 不通不代表网络不通。这个时候就要应用 telnet,通过其余协定来测试网络是否通。
ping 这个程序是应用了 ICMP 外面的 ECHO REQUEST 和 ECHO REPLY 类型。
Traceroute:过错报文类型的应用
有一个程序 Traceroute,它会应用 ICMP 的规定,成心制作一些可能产生谬误的场景。所以,Traceroute 的第一个作用就是成心设置非凡的 TTL,来追踪去往目的地时沿途通过的路由器。
Traceroute 的参数指向某个目标 IP 地址,它会发送一个 UDP 的数据包。将 TTL 设置成 1,也就是说一旦遇到一个路由器或者一个关卡,就示意它“就义”了。如果两头的路由器不止一个,当然碰到第一个就“就义”。于是,返回一个 ICMP 包,也就是网络过错包,类型是工夫超时。
接下来,将 TTL 设置为 2。第一关过了,第二关就“就义”了,那我就晓得第二关有多远。如此重复,直到达到目标主机。这样,Traceroute 就拿到了所有的路由器 IP。当然,有的路由器压根不会回这个 ICMP。这也是 Traceroute 一个公网的地址,看不到两头路由的起因。
怎么晓得 UDP 有没有达到目标主机呢?Traceroute 程序会发送一份 UDP 数据报给目标主机,但它会抉择一个不可能的值作为 UDP 端口号(大于 30000)。当该数据报达到时,将使目标主机的 UDP 模块产生一份“端口不可达”谬误 ICMP 报文。如果数据报没有达到,则可能是超时。
Traceroute 还有一个作用是成心设置不分片,从而确定门路的 MTU。要做的工作首先是发送分组,并设置“不分片”标记。发送的第一个分组的长度正好与进口 MTU 相等。如果两头遇到窄的关口会被卡住,会发送 ICMP 网络过错包,类型为“须要进行分片但设置了不分片位”。其实,这是人家成心的好吧,每次收到 ICMP“不能分片”过错时就减小分组的长度,直到达到指标主机。
ping 应用查问报文,Traceroute 应用过错报文