概述
不管是开发中,还是电脑日常使用,常常遇到网络不通的问题。这时你就会习惯性的使用一个命令ping,查看问题出在哪里,那它是如何工作的哪?
ICMP协议
ICMP就是互联网控制报文协议,网络包在复杂的网络环境传输时,常常遇到各种各样的问题。当遇到问题的时候,总不能让这个网络包死的不明不白,要传出消息来,报个情况,是怎么死的,为什么死的,这样才可以调整传输的策略。所以ICMP的功能主要有两种,确认IP包是否成功到底目标地址,通知在发送过程中IP被丢弃的原因。
ICMP报文是封装在IP包里的,一个ICMP报文包括IP报头,ICMP报头和ICMP报文,若IP报头中的协议字段为1时,说明是一个ICMP报文。
类型:占一个字节,标识ICMP报文的类型,不同类型有不同的代码,它有分为两大类,一类为差错报文,一类为查询报文。
代码:与类型字段一起标识ICMP报文的详细类型。
校验和:检验报文在传输过程中是否出现差错,和IP报头中的校验和是一样的。
查询报文类型
ping就是查询报文,一种主动的请求,并且获得主动应答的ICMP协议。ping发起请求命令,会发送一个ICMP Echo Request给对端,请求得到回复,就叫ICMP Echo Reply,它对比原生的ICMP,多了两个字段,一个是标识符,一个是序号。并且ping命令会统计响应时间和TTL(生存周期)来计算往还时间,说明路程的长短。
假定我们在一个子网内,主机A的IP为192.168.6.1,主机B的IP为192.168.6.2,。在主机A运行ping 192.168.6.2
- ping命令执行的时候,源主机会构建一个ICMP请求的数据包。里头有两个重要的字段,就是我们前面说的标识符和序号,对于请求数据包而言该字段的类型为8(回送请求),另一个就是顺序号,区分连续ping的时候发出的多个数据包,每发出一个请求数据包,顺序号会自动加1,并且会在报文的数据部分插入发送时间。
- ICMP协议将这个数据包连同192.168.6.2交给IP层,IP层将会以192.168.6.2作为目标地址,本机IP地址作为源地址,还有一些控制信息构建为一个IP数据包
- 加入MAC头,先判断一下是不是在一个子网内,如果是就在ARP映射表中查找IP地址192.168.6.2对应的MAC地址,则可以直接使用。如果没有,就要发送ARP协议查询MAC地址,获取MAC地址后。构建一个数据帧在附加上一些控制信息,依据以太网的介质访问规则,将数据包发送出去。
- 192.168.6.2收到这个数据帧后,检查下MAC目标地址,和本机的MAC地址对比,符合就接收,不符丢弃。检查该数据帧,将IP数据包从帧中提取出来,交给本机IP层,IP层检查完后,有用信息提取后交给ICMP协议。
- 192.168.6.2收到后,会构建一个ICMP应答包,应答的类型字段为0,顺序号为接收到的请求包的序号,发给主机192.168.6.1
- 在规定时限内,源主机也就是192.168.6.1没有接到ICMP的应答包,就说明目标主机不可达,如果接收到ICM应答包,则说明目标主机可达。然后检查当前时刻减去该数据最初从源主机发出的时刻,也就是ICMP数据包的时间延迟。
注意:有很多中间设备都是禁止ping的,并不是说网络不通。这个时候我们就要使用其他协议来检查网络是否通畅,如telnet等
差错报文类型
这是ICMP协议的另一个报文种类,差错报文中常用的类型主要有5种。终点不可达,端口不可达,源点抑制,超时,参数问题,改变路由
- 假定主机A给主机B发送一个邮件,网络传输中要经过很多台路由器,若R1接到邮件后,发生了故障,不知道下一步该发给哪个路由设备或那台主机设备,这封邮件也就没法到达主机B,这时路由R1就会把数据包丢弃并向主机A发回一个终点不可达的数据报文。这时数据报文,类型标号为3,表示是不可达的错误类型。
- 目标系统收到一个IP数据报某个服务请求时,本地没有此服务,会向源头返回ICMP端口不可达信息。
- 假定主机A给主机B发送一个视频,主机A传输非常快,主机B接收慢的话,可能导致数据都拥塞在某一台设备上,这台设备解决不了拥塞问题,会给源主机发送一个源点抑制报文反馈给源主机,告诉源主机数据拥塞了,在发送就会丢数据,告诉他放慢发送数据。类型标号为4,
- 如果超过网络包生存周期还是没到,就是超时,主机A给主机B发送一个数据报文时,该数据报文在网络会有一个TTL生存时间字段,没经过一台路由,TTL字段就会减1,路由器收到数据报文后TTL字段值减1后为0的话,该路由器就会把数据包丢弃并向主机A发送一个ICMP超时报文,类型是为11
- 当路由器后目标追收到数据报的首部中有的字段值不正确时,就会丢弃数据报,向源点发送参数问题的报文,类型为12
- 路由器改变路由报文发送给主机,让主机知道下次应将数据报文发送给另外的路由器。类型为5
traceroute
traceroute的应用就是差错报文类型使用,它的目的就打印出可执行的程序主机,一直到目标主机之前要经历多少路由器,也就是路由追踪。traceroute使用ICMP的规则,故意制造一些能产生错误的场景,就是故意设置特殊的TTL,追踪去往目的地时沿途经过的路由器。
======================================================
如发现错误,请及时留言,lz及时修改,避免误导后来者。感谢!!!