共计 3676 个字符,预计需要花费 10 分钟才能阅读完成。
日常开发中,咱们常常会碰到查问网络是否畅通以及域名对应 IP 地址等小需要,这时候用的最多的应该就是 ping 命令了。那你晓得 ping 命令是怎么工作的吗?明天,咱们就来一起意识下 ping 命令及其对应的 ICMP 协定。
ICMP 协定
ICMP 全称 Internet Control Message Protocol,指互联网管制报文协定。
网络自身是不牢靠的,数据包在传输过程中,可能会产生很多突发事件并导致数据传输失败。而网络层的 IP 协定是一个无连贯的协定,它不会解决网络层的故障,因而,咱们须要其它的协定,在数据包传输呈现故障时,能将故障信息传回来,这样能力对应解决相干问题。
就像在电视剧里看到的现代和平一样,打仗的时候须要通过斥候来传递战局状况,进而更好的管制战局。而 ICMP 报文在网络世界中就充当“斥候”这样的角色。
ICMP 报文是封装在 IP 包外面的。因为传输指令的时候,必定须要源地址和指标地址。它自身格局非常简单,如下图:
Exploring ICMP Port Number with Example
Exploring ICMP with Examples
ICMP 报文有很多的类型,不同的类型有不同的代码,最罕用的类型是被动申请,代码为 8,被动申请的应答,代码为 0。从大的方面看能够分为 查问报文类型和过错报文类型。
查问报文类型
咱们常常在电视剧里听到这样的话:来人,后方战事如何?斥候回来没?一有状况,立即通报。
相似这种主帅发动,被动查看敌情的状况,就对应着 ICMP 的查问报文类型。例如,常见的 ping 命令就是查问报文,是一种被动申请,并且取得被动应答的 ICMP 协定。因而,ping 命令收回的包也是合乎 ICMP 协定格局的,只不过它在前面减少了本人的格局。
对 ping 的被动申请,进行网络抓包,称为 ICMP ECHO REQUEST。同理,被动申请的回复,称为 ICMP ECHO REPLY。比起原生的 ICMP,这外面多了两个字段,一个是标识符,另一个是序号。这不难理解,大帅派出去两队斥候,一队是找谁要的,一队是侦察战况的,要有个标识能力辨别。
另一方面,派出去的斥候,都要编个号。如果派出去 10 个,回来 10 个,就阐明后方战况不错。如果派出去 10 个,回来 2 个,就阐明状况可能不妙。
在选项数据中,ping 还会寄存发送申请的工夫值,来计算往返工夫,阐明途程的长短。
Filtering ICMP Packets with Tcpdump
Exploring ICMP Protocol with Examples
过错报文类型
过错报文次要是用来将发送的出错报文相干信息返回到源设施,以供源设施确定如果更好的重发失败的数据包。
还是拿咱们的“大帅”举例。
当主帅正在大帐中看地图,思考战事时,里面的小兵忽然喊到:大帅,不好啦,张将军遭逢潜伏,全军覆没了。
这种是异常情况发动的,来报告产生了不好的事件,对应 ICMP 的过错报文。
过错报文有以下罕用的类型:
3:起点不可达
4:源克制
5:重定向
11:超时
第一种状况起点不可达。小兵报告,大帅,送给张将军的粮草没有送到。
那大帅必定会问,为啥没有送到?这就对应 ICMP 中的以下代码了。
网络不可达代码:0
主机不可达代码:1
协定不可达:2
端口不可达:3
须要进行分片但设置了不分片:4
具体的场景就像这样:
网络不可达:大帅,找不到中央
主机不可达:大帅,找到中央,没找到张将军
协定不可达:大帅,找到中央,也找到人了,然而口令没对上。
端口不可达:大帅,找到中央,找到了人,也对上了口令,但事件没对上。我去送粮草,人家说在等救兵。
须要进行分片但设置不分片:大帅,走到一半,山路狭隘,想换瞎扯,然而登程前你下令严禁换小车,就没方法送到了。
第二种是源站克制。也就是让源站加快发送速度(小兵:大帅,粮草送的太多了吃不完,你能够慢点送)。
第三种是工夫超时。也就是超过网络包的生存工夫还是没到目的地(大帅,送粮草的人都把食粮吃完了,还没到中央,曾经饿死了)。
第四种是路由重定向。也就是下次发给另一个路由器(大帅,上次送粮草的人原本只有走大王村,一公里就到了,后果非要绕道张家界,多了五公里,下次记得走大王村)。
过错报文的构造绝对简单一些。除了后面还是 IP,ICMP 的前 8 个字节不变,前面则跟上出错的那个 IP 包的 IP 头和 IP 注释的前 8 个字节。
而且这类斥候特地尽责,岂但字节返回来报信,还把一部分遗物带回来。
斥候:大帅,张将军曾经战死沙场,这是他的印信和佩剑。
大帅:张将军是怎么死的(能够查看 ICMP 的前 8 字节)?没错,这是张将军的剑(IP 数据包的头及注释前 8 字节)。
ping:查问报文类型的应用
接下来,咱们重点来看 ping 命令的发送和接管过程。
Understanding Ping Command and ICMP with Examples
What is ICMP type?
ICMP 举例
假设主机 A 的 IP 地址是 192.168.1.1,主机 B 的 IP 地址是 192.168.1.2,它们都在同一个子网。那么,当在主机 A 上运行“ping 192.168.1.2”后,会产生什么呢?
源主机构建 ICMP 申请数据包。这个数据包内蕴含多个字段。最重要的有两个,一个是类型字段,对应申请数据包而言,该字段为 8。另一个是顺序号,次要用于辨别间断 ping 的时候收回的多个数据包。每收回一个申请数据包,顺序号会主动加 1. 为了可能计算往返工夫 RTT,它会在报文的数据局部插入发送工夫。
IP 层构建 IP 数据包。ICMP 协定将数据包连同指标 IP 一起交给 IP 层,IP 层将以 192.168.1.2 作为目标地址,本机 IP 地址作为源地址,加上其余管制信息,构建一个 IP 数据包。
退出 MAC 头。找到 192.168.1.2 对应的 MAC 地址,附加上一些管制信息,根据以太网的介质拜访规定,将它们传送进来。
主机 B 收到数据帧后,会进行如下步骤:
查看 MAC 地址,抛弃或接收数据帧,提取 IP 数据包。查看数据包目标 MAC 地址,并与本机 MAC 地址比照。如合乎,就接收数据帧,否则就抛弃。接管后检查数据帧,将 IP 数据包从帧中提取解决,交给本机的 IP 层。
IP 层查看 IP。查看实现后,提取有用的信息交给 ICMP 协定。
构建 ICMP 应答包。应答数据包的类型字段为 0,顺序号为接管到的申请数据包中的顺序号。
将应答数据包发给主机 A。
在规定的工夫内,源主机如果没有接到 ICMP 的应答包,则阐明指标主机不可达。
如果接管到了应打包,则阐明指标主机可达。此时,源主机会检测时间延迟。就是用以后时刻减该数据包从源主机收回去的时刻。
当然,这只是最简略的,同个局域网的状况。如果跨网段的话,还会波及网关的转发、路由器的转发等。
能够看出,ping 命令是应用了 ICMP 外面的 ECHO REQUEST 和 ECHO REPLY 类型。
那其它类型呢?是不是只有真正遇到谬误的时候,能力收到?答案是否定的。有一个 Traceroute 命令,它会应用 ICMP 的规定,成心制作一些可能产生谬误的场景。
Traceroute:过错报文类型的应用
Traceroute 命令有两个比拟罕用的性能。
第一个性能:
通过设置非凡的 TTL,追踪去往目的地时通过的路由器
Traceroute 的参数执行某个目标 IP 地址,会发送一个 UDP 的数据包。
将 TTL 设置成 1 时,示意这个数据包的 MP 为 1,碰到第一个“拦路虎”(通常是路由器或一个其它类型的关卡)就会阵亡了,而后就会返回一个 ICMP 包,这个包就是 网络过错包,类型是工夫超时。
通过过错包,咱们就能失去数据包到第一个关卡时破费的工夫及其每个关卡的 IP 地址(有的主机不会响应 ICMP,所以会呈现申请时全是 * 的状况)。
那怎么晓得 UDP 有没有达到目标主机呢?Traceroute 程序会发送一份 UDP 数据包给目标主机,但它会抉择一个不可能的值作为 UDP 端口号(大于 30000)。当该数据报达到目标主机时,因为找不到对应端口号,所以会返回一个“端口不可达”的谬误报文。这样,咱们就晓得 UDP 是否达到主机了。
第二个性能:
设置数据包不分片,确定门路的 MTU
发送分组,并设置“不分片”标记。发送的第一个分组的长度正好与进口的 MTU 相等。如果两头遇到窄的关卡就会被卡主,返回 ICMP 网络过错包,类型是“须要进行分片但设置了不分片”。就这样,每次收到 ICMP“不能分片”过错时就减小分组的长度,从而确定整个门路中的 MTU。
总结
ICMP 相当于网络世界的侦察兵。罕用的有两种类型,被动探查的查问报文和异样报告的过错报文。
ping 命令应用查问报文,Traceroute 命令应用过错报文。
Understanding ICMP Packets with Examples
Capture ICMP Packets With Tcpdump