zoukankan      html  css  js  c++  java
  • ping的工作原理&ICMP协议

      ping命令用于判断与对方网络是否畅通,ping 是基于ICMP协议工作的。

    ICMP协议(互联网控制报文协议):

    ICMP报文:

      ICMP主要的功能:确认 IP 包是否成功送达目标地址;报告发送过程中 IP 包被废弃的原因;改善网络设置等。

      ICMP 的通知消息会使用IP进行发送,收到该 ICMP 包的主机分解 ICMP 的首部和数据,得知发生问题的原因。

    ICMP报文类型:

    查询报文类型:

      回送消息(回送应答和回送请求)用于进行通信的主机或路由器之间,判断所发送的数据包是否已经成功到达对端ping 命令就是利用回送消息实现的。

    差错报文类型:

      目标不可达消息:

        网络不可达:IP 地址分为网络号和主机号,当路由器中的路由器表匹配不到接收方 IP 的网络号,通过 ICMP 协议以网络不可达(Network Unreachable)的原因告知主机。

        主机不可达:当路由表中没有该主机的信息,或者该主机没有连接到网络,那么会通过 ICMP 协议以主机不可达(Host Unreachable)的原因告知主机。

        协议不可达:当主机使用 TCP 协议访问对端主机时,能找到对端的主机了,可是对端主机的防火墙已经禁止 TCP 协议访问,那么会通过 ICMP 协议以协议不可达的原因告知主机。

        端口不可达:当主机访问对端主机 8080 端口时,这次能找到对端主机了,防火墙也没有限制,可是发现对端主机没有进程监听 8080 端口,那么会通过 ICMP 协议以端口不可达的原因告知主机。

        需要进行分片但是设置了不可分片:发送端主机发送 IP 数据报时,将 IP 首部的分片禁止标志位设置为1。根据这个标志位,途中的路由器遇到超过 MTU 大小的数据包时,不会进行分片,而是直接抛弃。通过 ICMP 协议以需要进行分片但是设置了不可分片告知发送端主机。

      原点抑制消息:   

        当路由器向低速线路发送数据时,其发送队列的缓存变为零而无法发送出去时,可以向 IP 包的源地址发送一个 ICMP 原点抑制消息,收到这个消息的主机知道了在整个线路的某一处发生了拥堵的情况,从而增大 IP 包的传输间隔,减少网络拥堵的情况。

        ICMP原点抑制消息的目的就是为了缓和这种拥堵情况

      重定向消息:

        如果路由器发现发送端主机使用了「不是最优」的路径发送数据,那么它会返回一个 ICMP 重定向消息给这个主机,在这个消息中包含了最合适的路由信息和源数据。这主要发生在路由器持有更好的路由信息的情况下。路由器会通过这样的 ICMP 消息告知发送端,让它下次发给另外一个路由器。

      超时消息:

        IP 包中有一个字段叫做 TTL (Time To Live,生存周期),它的值随着每经过一次路由器就会减 1,直到减到 0 时该 IP 包会被丢弃,此时,IP 路由器将会发送一个 ICMP 超时消息给发送端主机,并通知该包已被丢弃。设置 IP 包生存周期的主要目的,是为了在路由控制遇到问题发生循环状况时,避免 IP 包无休止地在网络上被转发

    ping的工作过程(同网段):

      ping 命令执行的时候,源主机首先会构建一个 ICMP 回送请求数据包发送给目的主机。ICMP 数据包内包含多个字段,最重要的是两个:

    • 第一个是类型,对于回送请求消息而言该字段为 8

    • 另外一个是序号,主要用于区分连续 ping 的时候发出的多个数据包。每发出一个请求数据包,序号会自动加 1

      此外,为了能够计算往返时间 RTT,它会在报文的数据部分插入发送时间。由 ICMP 协议将这个数据包连同IP地址一起交给 IP 层。

      目的主机收到IP数据包以后,将有用的信息提取后交给 ICMP 协议。同时,构建一个 ICMP 回送应答数据包发送出去给主源机 。

      在规定的时候间内,源主机如果没有接到 ICMP 的应答包,则说明目标主机不可达;如果接收到了 ICMP 回送响应消息,则说明目标主机可达。此时,源主机会检查,用当前时刻减去该数据包从源主机上发出的时刻,就是 ICMP 数据包的时间延迟。

    原文链接 https://mp.weixin.qq.com/s/leE2DgDOl5z90hG2gG1Urw

      

  • 相关阅读:
    今天学到的单词
    今天是运维的一天
    今天是属于数据库的一天
    Python基础9 元组的访问和拆包
    Python基础8 元组的创建
    Python基础7 序列
    Python基础6 控制语句 if else elif range() while for
    Python基础5 运算符
    Python基础4 字符串的查找 find rfind 字符串类型和数字类型的转换
    Python基础2 数据类型:数字类型
  • 原文地址:https://www.cnblogs.com/yongjin-hou/p/14523533.html
Copyright © 2011-2022 走看看