前言在日常生活或工作中,我们在判断与对方网络是否畅通,使用的最多的莫过于 “那你知道 可能有的小伙伴奇怪的问:“我虽然不明白它的工作,但 ping 我也用的贼 6 啊!” 你用的是 6 ,但你能面试官面前,你就 6 不起来了,毕竟他们也爱问。 所以,我们要抱有「知其然,知其所以然」的态度,这样就能避免面试过程中,出门右拐的情况了。 不知道的小伙伴也没关系,今天我们就来搞定它,搞懂它。消除本次的问号,让问号少一点。 正文IP协议的助手 —— ICMP 协议ping 是基于
ICMP 全称是 Internet Control Message Protocol,也就是互联网控制报文协议。 里面有个关键词 —— 控制,如何控制的呢? 网络包在复杂的网络传输环境里,常常会遇到各种问题。当遇到问题的时候,总不能死个不明不白,没头没脑的作风不是计算机网络的风格。所以需要传出消息,报告遇到了什么问题,这样才可以调整传输策略,以此来控制整个局面。
在 如上图例子,主机 ICMP 的这种通知消息会使用 因此,从路由器 收到该 ICMP 包的主机
ICMP 报文是封装在 IP 包里面,它工作在网络层,是 IP 协议的助手。 ICMP 包头的类型字段,大致可以分为两大类:
查询报文类型
回送消息用于进行通信的主机或路由器之间,判断所发送的数据包是否已经成功到达对端的一种消息, 可以向对端主机发送回送请求的消息( 相比原生的 ICMP,这里多了两个字段:
在选项数据中, 差错报文类型接下来,说明几个常用的 ICMP 差错报文的例子:
IP 路由器无法将 IP 数据包发送给目标地址时,会给发送端主机返回一个目标不可达的 ICMP 消息,并在这个消息中显示不可达的具体原因,原因记录在 ICMP 包头的代码字段。 由此,根据 ICMP 不可达的具体消息,发送端主机也就可以了解此次发送不可达的具体原因。 举例 6 种常见的目标不可达类型的代码:
为了给大家说清楚上面的目标不可达的原因,小林牺牲自己给大家送 5 次外卖。 为什么要送外卖?别问,问就是为 a. 网络不可达代码为 0外卖版本: 小林第一次送外卖时,小区里只有 A 和 B 区两栋楼,但送餐地址写的是 C 区楼,小林表示头上很多问号,压根就没这个地方。 正常版本: IP 地址是分为网络号和主机号的,所以当路由器中的路由器表匹配不到接收方 IP 的网络号,就通过 ICMP 协议以网络不可达( 自从不再有网络分类以后,网络不可达也渐渐不再使用了。 b. 主机不可达代码为 1外卖版本: 小林第二次送外卖时,这次小区有 5 层楼高的 C 区楼了,找到地方了,但送餐地址写的是 C 区楼 601 号房 ,说明找不到这个房间。 正常版本: 当路由表中没有该主机的信息,或者该主机没有连接到网络,那么会通过 ICMP 协议以主机不可达( c. 协议不可达代码为 2外卖版本: 小林第三次送外卖时,这次小区有 C 区楼,也有 601 号房,找到地方了,也找到房间了,但是一开门人家是外国人说的是英语,我说的是中文!语言不通,外卖送达失败~ 正常版本: 当主机使用 TCP 协议访问对端主机时,能找到对端的主机了,可是对端主机的防火墙已经禁止 TCP 协议访问,那么会通过 ICMP 协议以协议不可达的原因告知主机。 d. 端口不可达代码为 3外卖版本: 小林第四次送外卖时,这次小区有 C 区楼,也有 601 号房,找到地方了,也找到房间了,房间里的人也是说中文的人了,但是人家说他要的不是外卖,而是快递。。。 正常版本: 当主机访问对端主机 8080 端口时,这次能找到对端主机了,防火墙也没有限制,可是发现对端主机没有进程监听 8080 端口,那么会通过 ICMP 协议以端口不可达的原因告知主机。 e. 需要进行分片但设置了不分片位代码为 4外卖版本: 小林第五次送外卖时,这次是个吃播博主了 100 份外卖,但是吃播博主要求一次性要把全部外卖送达,小林的一台电动车装不下呀,这样就没办法送达了。 正常版本: 发送端主机发送 IP 数据报时,将 IP 首部的分片禁止标志位设置为 随后,通过一个 ICMP 的不可达消息类型,代码为 4 的报文,告知发送端主机。
在使用低速广域线路的情况下,连接 WAN 的路由器可能会遇到网络拥堵的问题。
当路由器向低速线路发送数据时,其发送队列的缓存变为零而无法发送出去时,可以向 IP 包的源地址发送一个 ICMP 原点抑制消息。 收到这个消息的主机借此了解在整个线路的某一处发生了拥堵的情况,从而增大 IP 包的传输间隔,减少网络拥堵的情况。 然而,由于这种 ICMP 可能会引起不公平的网络通信,一般不被使用。
如果路由器发现发送端主机使用了「不是最优」的路径发送数据,那么它会返回一个 ICMP 重定向消息给这个主机。 在这个消息中包含了最合适的路由信息和源数据。这主要发生在路由器持有更好的路由信息的情况下。路由器会通过这样的 ICMP 消息告知发送端,让它下次发给另外一个路由器。 好比,小林本可以过条马路就能到的地方,但小林不知道,所以绕了一圈才到,后面小林知道后,下次小林就不会那么傻再绕一圈了。
IP 包中有一个字段叫做 此时,IP 路由器将会发送一个 ICMP 超时消息给发送端主机,并通知该包已被丢弃。 设置 IP 包生存周期的主要目的,是为了在路由控制遇到问题发生循环状况时,避免 IP 包无休止地在网络上被转发。 此外,有时可以用 TTL 控制包的到达范围,例如设置一个较小的 TTL 值。 ping —— 查询报文类型的使用接下来,我们重点来看 同个子网下的主机 A 和 主机 B,主机 A 执行 ping 命令执行的时候,源主机首先会构建一个 ICMP 回送请求消息数据包。 ICMP 数据包内包含多个字段,最重要的是两个:
每发出一个请求数据包,序号会自动加 然后,由 ICMP 协议将这个数据包连同地址 192.168.1.2 一起交给 IP 层。IP 层将以 192.168.1.2 作为目的地址,本机 IP 地址作为源地址,协议字段设置为 接下来,需要加入 主机 接收后检查该数据帧,将 IP 数据包从帧中提取出来,交给本机的 IP 层。同样,IP 层检查后,将有用的信息提取后交给 ICMP 协议。 主机 在规定的时候间内,源主机如果没有接到 ICMP 的应答包,则说明目标主机不可达;如果接收到了 ICMP 回送响应消息,则说明目标主机可达。 此时,源主机会检查,用当前时刻减去该数据包最初从源主机上发出的时刻,就是 ICMP 数据包的时间延迟。 针对上面发生的事情,总结成了如下图: 当然这只是最简单的,同一个局域网里面的情况。如果跨网段的话,还会涉及网关的转发、路由器的转发等等。 但是对于 ICMP 的头来讲,是没什么影响的。会影响的是根据目标 IP 地址,选择路由的下一跳,还有每经过一个路由器到达一个新的局域网,需要换 MAC 头里面的 MAC 地址。 说了这么多,可以看出 ping 这个程序是使用了 ICMP 里面的 ECHO REQUEST(类型为 8 ) 和 ECHO REPLY (类型为 0)。 traceroute —— 差错报文类型的使用有一款充分利用 ICMP 差错报文类型的应用叫做 1. traceroute 作用一 traceroute 的第一个作用就是故意设置特殊的 TTL,来追踪去往目的地时沿途经过的路由器。 traceroute 的参数指向某个目的 IP 地址: traceroute 192.168.1.100
它的原理就是利用 IP 包的生存期限 从 比如,将 TTL 设置 为 接下来将 TTL 设置为 这样的过程,traceroute 就可以拿到了所有的路由器 IP。 当然有的路由器根本就不会返回这个 ICMP,所以对于有的公网地址,是看不到中间经过的路由的。
traceroute 在发送 所以,当差错报文类型是端口不可达时,说明发送方发出的 UDP 包到达了目的主机。 2. traceroute 作用二 traceroute 还有一个作用是故意设置不分片,从而确定路径的 MTU。
这样做的目的是为了路径MTU发现。 因为有的时候我们并不知道路由器的 它的工作原理如下: 首先在发送端主机发送 随后,通过一个 ICMP 的不可达消息将数据链路上 MTU 的值一起给发送主机,不可达消息的类型为「需要进行分片但设置了不分片位」。 发送主机端每次收到 ICMP 差错报文时就减少包的大小,以此来定位一个合适的 参考文献[1] 竹下隆史.图解TCP/IP.人民邮电出版社. [2] 刘超.趣谈网络协议.极客时间. |
|
来自: 520jefferson > 《网络》