事情是这样的最近学计算机网络用到了ping命令,觉得自己学的差不多了基础命令都大概了解了,但是老师给出的答案确是:“最好了解一下原理!!”。一下给我这个菜鸡给弄蒙了,原理???
为了帮大家了解一下有没有必要了解一下我特意百度搜了一下,大佬们都说最好还是看一下谁也不知道面试官有多奇葩万一问了咋办,比如下面:
好吧为了知其然,知其所以然我们今天我们就来看看ping的原理,来吧!!!别忘了点赞三连啊!!!!!
都知道ping
是基于 ICMP
协议工作的,所以要明白 ping 的工作,首先我们先来熟悉 ICMP 协议
Internet Control Message Protocol
,也就是互联网控制报文协议A
向主机 B
发送了数据包,由于某种原因,途中的路由器 2
未能发现主机 B
的存在,这时,路由器 2
就会向主机 A
发送一个 ICMP
目标不可达数据包,说明发往主机 B
的包未能成功。IP
进行发送 。ICMP
包会按照往常的路由控制先经过路由器 1 再转发给主机 AICMP 报文是封装在 IP 包里面,它工作在网络层,是 IP 协议的助手。
给大家看一张经常见到的图便于理解:
ICMP 包头的类型字段,大致可以分为两大类:
0
和 8
可以向对端主机发送回送请求的消息(ICMP Echo Request Message,类型 8)
,也可以接收对端主机发回来的回送应答消息(ICMP Echo Reply Message,类型 0)
。
比原来的ICMP多了两个字段:
PID
作为标识符;ping
还会存放发送请求的时间值,来计算往返时间,说明路程的长短。接下来,说明几个常用的 ICMP 差错报文的例子:
3
4
5
11
目标不可达消息(Destination Unreachable Message)
—— 类型为 3
0
1
2
3
4
为了便于解释这几种不可达的原因我们还是来个故事吧,故事名字就叫肥学外卖记
0
肥学
第一次送外卖时,小区里只有 A 和 B 区两栋楼,但送餐地址写的是 C 区楼,肥学
表示头上很多问号,压根就没这个地方。(Network Unreachable)
的原因告知主机。1
肥学
第二次送外卖时,这次小区有 5 层楼高的 C 区楼了,找到地方了,但送餐地址写的是 C 区楼 601 号房 ,说明找不到这个房间。Host Unreachable)
的原因告知主机。肥学
第三次送外卖时,这次小区有 C 区楼,也有 601 号房,找到地方了,也找到房间了,但是一开门人家是外国人说的是英语,我说的是中文!语言不通,外卖送达失败~真正的原因:当主机使用 TCP 协议访问对端主机时,能找到对端的主机了,可是对端主机的防火墙已经禁止 TCP 协议访问,那么会通过 ICMP 协议以协议不可达的原因告知主机。
3
肥学
第四次送外卖时,这次小区有 C 区楼,也有 601 号房,找到地方了,也找到房间了,房间里的人也是说中文的人了,但是人家说他要的不是外卖,而是快递。。。4
肥学
第五次送外卖时,这次是个吃播博主了 100 份外卖,但是吃播博主要求一次性要把全部外卖送达,小林的一台电动车装不下呀,这样就没办法送达了。原点抑制消息(ICMP Source Quench Message
) —— 类型 4
重定向消息(ICMP Redirect Message) —— 类型 5
超时消息(ICMP Time Exceeded Message) —— 类型 11
IP 包中有一个字段叫做 TTL (Time To Live,生存周期),它的值随着每经过一次路由器就会减 1,直到减到 0 时该 IP 包会被丢弃。
此时,IP 路由器将会发送一个 ICMP 超时消息给发送端主机,并通知该包已被丢弃。
此外,有时可以用 TTL 控制包的到达范围,例如设置一个较小的 TTL 值
接下来,我们重点来看 ping 的发送和接收过程
同个子网下的主机 A 和 主机 B,主机 A 执行ping 主机 B 后,我们来看看其间发送了什么?
ping 命令执行的时候,源主机首先会构建一个 ICMP 回送请求消息数据包。
ICMP 数据包内包含多个字段,最重要的是两个:
第一个是类型,对于回送请求消息而言该字段为 8;
另外一个是序号,主要用于区分连续 ping 的时候发出的多个数据包。
每发出一个请求数据包,序号会自动加 1。为了能够计算往返时间 RTT,它会在报文的数据部分插入发送时间。
然后,由 ICMP 协议将这个数据包连同地址 192.168.1.2 一起交给 IP 层。IP 层将以 192.168.1.2 作为目的地址,本机 IP 地址作为源地址,协议字段设置为 1 表示是 ICMP 协议,在加上一些其他控制信息,构建一个 IP 数据包。
接下来,需要加入 MAC 头。如果在本地 ARP 映射表中查找出 IP 地址 192.168.1.2 所对应的 MAC 地址,则可以直接使用;如果没有,则需要发送 ARP 协议查询 MAC 地址,获得 MAC 地址后,由数据链路层构建一个数据帧,目的地址是 IP 层传过来的 MAC 地址,源地址则是本机的 MAC 地址;还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。
主机 B 收到这个数据帧后,先检查它的目的 MAC 地址,并和本机的 MAC 地址对比,如符合,则接收,否则就丢弃。
接收后检查该数据帧,将 IP 数据包从帧中提取出来,交给本机的 IP 层。同样,IP 层检查后,将有用的信息提取后交给 ICMP 协议。
主机 B 会构建一个 ICMP 回送响应消息数据包,回送响应数据包的类型字段为 0,序号为接收到的请求数据包中的序号,然后再发送出去给主机 A。
在规定的时候间内,源主机如果没有接到 ICMP 的应答包,则说明目标主机不可达;如果接收到了 ICMP 回送响应消息,则说明目标主机可达。
此时,源主机会检查,用当前时刻减去该数据包最初从源主机上发出的时刻,就是 ICMP 数据包的时间延迟。
针对上面发生的事情,总结成了如下图:
当然这只是最简单的,同一个局域网里面的情况。如果跨网段的话,还会涉及网关的转发、路由器的转发等等。
但是对于 ICMP 的头来讲,是没什么影响的。会影响的是根据目标 IP 地址,选择路由的下一跳,还有每经过一个路由器到达一个新的局域网,需要换 MAC 头里面的 MAC 地址。
说了这么多,可以看出 ping 这个程序是使用了 ICMP 里面的 ECHO REQUEST(类型为 8 ) 和 ECHO REPLY (类型为 0)。
有一款充分利用 ICMP 差错报文类型的应用叫做 traceroute(在UNIX、MacOS中是这个命令,而在Windows中对等的命令叫做 tracert )。
traceroute 的第一个作用就是故意设置特殊的 TTL,来追踪去往目的地时沿途经过的路由器。
traceroute 的参数指向某个目的 IP 地址:
traceroute 192.168.1.100
这个作用是如何工作的呢?
它的原理就是利用 IP 包的生存期限 从 1 开始按照顺序递增的同时发送 UDP 包,强制接收 ICMP 超时消息的一种方法。
比如,将 TTL 设置 为 1,则遇到第一个路由器,就牺牲了,接着返回 ICMP 差错报文网络包,类型是时间超时。
接下来将 TTL 设置为 2,第一个路由器过了,遇到第二个路由器也牺牲了,也同意返回了 ICMP 差错报文数据包,如此往复,直到到达目的主机。
这样的过程,traceroute 就可以拿到了所有的路由器 IP。
当然有的路由器根本就不会返回这个 ICMP,所以对于有的公网地址,是看不到中间经过的路由的。
发送方如何知道发出的 UDP 包是否到达了目的主机呢?
traceroute 在发送 UDP 包时,会填入一个不可能的端口号值作为 UDP 目标端口号(大于 3000 )。当目的主机,收到 UDP 包后,会返回 ICMP 差错报文消息,但这个差错报文消息的类型「端口不可达」。
所以,当差错报文类型是端口不可达时,说明发送方发出的 UDP 包到达了目的主机。
traceroute 还有一个作用是故意设置不分片,从而确定路径的 MTU。
这么做是为了什么?
这样做的目的是为了路径MTU发现。
因为有的时候我们并不知道路由器的 MTU 大小,以太网的数据链路上的 MTU 通常是 1500 字节,但是非以太网的 MTU 值就不一样了,所以我们要知道 MTU 的大小,从而控制发送的包大小。
它的工作原理如下:
首先在发送端主机发送 IP 数据报时,将 IP 包首部的分片禁止标志位设置为 1。根据这个标志位,途中的路由器不会对大数据包进行分片,而是将包丢弃。
随后,通过一个 ICMP 的不可达消息将数据链路上 MTU 的值一起给发送主机,不可达消息的类型为「需要进行分片但设置了不分片位」。
发送主机端每次收到 ICMP 差错报文时就减少包的大小,以此来定位一个合适的 MTU 值,以便能到达目标主机。
原地址肥学大师:https://blog.csdn.net/jiahuiandxuehui?spm=1010.2135.3001.5343
绿水青山总是情,点赞三连行不行
说个事,我发现有很多小伙伴不知道怎么三连,就按着赞不松开超过三秒就行。
什么???
你知道???
我不信!!!