ping的工作原理
我们判断与对方网络是否畅通,通常使用的是ping命令。
那ping命令的原理有了解吗,在一次面试中,我被面试官以很温柔的语气问出了一道我答不出来的题。
这里需要了解一个协议IP的协议的助手—ICMP协议
ping是基于ICMP协议工作的,全称是 Internet Control Message Protocol,互联网控制报文协议。
那如何体现控制
网络包在复杂的传输环境里,常常会遇到各种问题,所以需要传出消息,报告遇到的问题,这样才可以调整传输策略,以此来控制整个局面。
首先了解一下ICMP的功能
ICMP主要的功能是:确认IP包是否成功到达目标地址、报告发送过程中IP包被废弃的原因和改善网络设置等。
在IP通信中如果某个IP包因为某种原因未能到达目标地址,那么这个具体原因将由ICMP负责通知。
主机A---->路由器1---->路由器2---->主机B(电源关闭)
详细过程:
发送包—路由器2为了知道主机B的MAC地址,而发送ARP包----APR请求 ----再次发送ARP请求(然而主机B已经关机)----再次发送ARP包-----多次发送ARP包无果-----由于始终无法到达主机B,路由器2返回一个ICMP目标不可达的包发给主机A。
主机A 向主机A发送了数据包,由于某种原因,途中的路由器2未能发现主机B的存在,这是,路由器2就会向主机A发送一个ICMP目标不可达数据包,说明发往主机B的包未能成功。
ICMP的这种通知消息会使用IP进行发送
因此,路由器2返回的ICMP包会按照往常路由控制先经过路由器1再转发给主机A。收到该ICMP包的主机A则分解ICMP的首部和数据域,得知具体发生问题的原因。
ICMP报文是封装在IP包里面,他工作在网络层,是IP协议助手
ICMP包头的类型字段,大致可以分为两大类:
①用于诊断的查询信息,也就是查询报文类型
②通知出错原因的错误消息,也就是差错报文类型
ICMP类型
类型 | 类容 | 种类 |
---|
0 | 回送应答(Echo Reply) | 查询报文类型 | 3 | 目标不可达(Destination Unreachable) | 差错报文类型 | 4 | 原点抑制(Source Quench) | 差错报文类型 | 5 | 重定向或改变路由(Redirect) | 差错报文类型 | 8 | 回送请求(Echo Request) | 查询报文类型 | 11 | 超时(Time exceeded) | 差错报文类型 |
ping–查询报文类型的使用
ping的发送和接收过程
同个子网下的主机A(IP 192.168.1.1)和主机B(IP 192.168.1.2),主机A执行ping主机B后,发生了什么?
ping命令执行的时候,源主机首先会构建一个ICMP回送请求消息的数据包。
ICMP数据包内包含多个字段,最重要的是类型和序号这两个字段:
类型:应为是回送请求,该字段为8;
序号:用于区分连续ping的时候发出的多个数据包(序号从0开始,每发送一个新的回送请求就加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地址。
traceroute–差错报文类型的使用
traceroute作用1:
故意设置特殊的TTL,来追踪去往目的地时沿途经过的路由器,例:traceroute 192.168.1.100
原理:
利用IP包的生存期限从1开始按照顺序递增的同时发送UDP包,强制接收ICMP超时消息的一种方法。
比如,将TTL设置为1.则遇到第一个路由器就牺牲了,接着返回ICMP差错报文网络包,类型是时间超时。
接下来,将TTL设置为2.则遇到第2个路由器就牺牲了,接着返回ICMP差错报文网络包,类型是时间超时.
如此往复,直到到达目的主机。
通过这个过程,traceroute就可以拿到所有路由器的IP。
需要注意的是,有的路由器根本不会返回这个ICMP,所有对于有的公网地址,是看不到中间经过这个路由的。
发送方如何知道发出的UDP包是否到达了目的主机呢?
traceroute在发送UDP包时,会填入一个不可能的端口号值作为UDP目标端口号(大于3000)。当目的主机收到UDP包后,会返回ICMP差错报文信息,但这个差错报文信息的类型是端口不可达
所以当差错报文类型是端口不可达时,说明发送方发出的UDP包到达了目的主机。
traceroute作用2:
故意设置不分片,从而确定路径的MTU
因为有的时候,我们并不知道路由器MTU大小,以太网的数据链路层上的MTU通常是1500字节,但是非以太网的MTU值就不一样了,所以我们需要知道MTU的大小,从而控制发送包的大小。
原理:
首先在发送端主机发送IP数据报时,将IP包首部的分片禁止标志位设置为1.根据这个标志位,途中的路由器不会对大数据包进行分片,而是将包丢弃。
随后,通过一个ICMP的不可达消息将数据链路上的MTU的一起发送给发送主机,不可达的消息类型为需要进行分片但设置了不分片位
发送主机端每次收到ICMP差错报文时就减少包的大小,以此来定位一个合适的MTU值,以便能到达目标主机。
|