• 【转】Ping、Traceroute 工作原理


    转自:https://www.jishuwen.com/d/2eEA

    在工作开发过程中,我们经常会使用到ping和traceroute。在这里,我们将细述其工作原理,让你在会用的基础之上理解其内部工作过程。

    Ping工作原理

    Ping 是 ICMP 的一个重要应用,主要用来测试两台主机之间的连通性。Ping 的原理是通过向目的主机发送 ICMP Echo 请求报文,目的主机收到之后会发送 Echo 回答报文。Ping 会根据时间和成功响应的次数估算出数据包往返时间以及丢包率。

    Ping的完整工作流程:

    Ping本质上是ICMP数据包,所以其工作流程就是ICMP数据包的发送与解析流程。大致流程如下:

    构造ICMP数据包-->构造IP数据包-->构造以太网数据帧----物理传输到目标主机---->获取以太网数据帧-->解析出IP数据包-->解析出ICMP数据包-->发送回送应答报文

    本地主机处理流程:

    1. 在本地,ping命令会构建一个ICMP数据包(构造回送请求报文)

    2. 将该ICMP数据包和目标IP地址给IP协议,IP协议将本地地址作为源地址,与目的地址等构造IP数据包

    3. 根据本地ARP缓存查找目的地址IP对应的MAC地址,如果缓存中没有则通过ARP协议找到对应IP的MAC地址。将MAC地址交给数据链路层以构造数据帧

    4. 经物理层发送给目的主机

    目的主机处理流程:

    1. 目的主机接收到数据包

    2. 物理层接收到二进制数据流经数据链路层,按照以太网协议解析出数据帧,如果数据帧中的目标MAC地址与本机MAC地址相同,则接收该数据包,否则丢弃该数据包。

    3. 接收到该数据包之后,经网络层解析出IP数据包,通过IP包头中的协议字段判断出是ICMP数据包。之后解析出ICMP数据包,发现是回送请求报文(ping request)后马上构建一个ICMP回送应答报文(ping reply)

    4. 将封装好的ICMP数据包经网络层、数据链路层、物理层发送回源主机

    所以,Ping的本质其实就是ICMP回送请求报文和回送应答报文。我们可通过Wireshark抓包工具对Ping进行分析。使用ping命令:

    在这里插入图片描述

    本机会向远端主机发送ICMP回送请求报文。

    在这里插入图片描述

    远端主机收到后会发送回送应答报文:

    在这里插入图片描述

    Traceroute工作原理

    Traceroute也是ICMP的一个应用,用来跟踪一个分组从源点到终点的路径。有2种实现方案:基于UDP实现和基于ICMP实现。

    基于UDP实现traceroute工作原理

    在基于UDP的实现中,客户端发送的数据包是通过UDP协议来传输的,使用了一个大于30000的端口号,服务器在收到这个数据包的时候会返回一个端口不可达的ICMP错误信息, 客户端通过判断收到的错误信息是TTL超时还是端口不可达来判断数据包是否到达目标主机。 流程如下:

    1. 源主机向目的主机发送一连串的 IP 数据报(UDP报文)。第一个数据报 P1 的生存时间 TTL 设置为 1,当 P1 到达路径上的第一个路由器 R1 时,R1 收下它并把 TTL 减 1,此时 TTL 等于 0,R1 就把 P1 丢弃,并向源主机发送一个 ICMP 时间超过差错报告报文;

    2. 源主机接着发送第二个数据报 P2,并把 TTL 设置为 2。P2 先到达 R1,R1 收下后把 TTL 减 1 再转发给 R2,R2 收下后也把 TTL 减 1,由于此时 TTL 等于 0,R2 就丢弃 P2,并向源主机发送一个 ICMP 时间超过差错报文。

    3. 不断执行这样的步骤,直到最后一个数据报刚刚到达目的主机,主机不转发数据报,也不把 TTL 值减 1。但是因为数据报封装的是无法交付的 UDP,因此目的主机要向源主机发送 ICMP 终点不可达差错报告报文。

    4. 之后源主机知道了到达目的主机所经过的路由器 IP 地址以及到达每个路由器的往返时间。

    Linux中的traceroute就是这种实现方式。

    基于ICMP实现的tracert工作原理

    在这一种实现中我们不使用UDP协议,而是直接发送一个ICMP回显请求(echo request)数据包,服务器在收到回显请求的时候会向客户端发送一个ICMP回显应答(echo reply)数据包。流程与上面相似,只是最后判断结束上为目标主机(而不是中间经过的主机或路由器)返回一个ICMP回显应答,则结束。

    Windows中的tracert就是这种实现方式。利用Wireshark分析如下:

    在cmd下输入 tracert www.baidu.com :

    在这里插入图片描述

    每一跳默认发送三个数据包,我们会看到下面这样的输出:

    在这里插入图片描述在这里插入图片描述

    可以看到TTL逐个递增,并且最终到达目的主机180.97.33.107,到达目的主机,目的主机回复,终止。

  • 相关阅读:
    708. Insert into a Cyclic Sorted List
    24. Swap Nodes in Pairs
    877. Stone Game
    EOJ Monthly 2020.7 A. 打字机(前缀和+思维)
    EOJ Monthly 2020.7 B. 线上考试(排列组合)
    【JavaScript】Generator
    【JavaScript】Promise
    【JavaScript】throw 和 try...catch
    【JavaScript】JSON
    【JavaScript】WeakSet
  • 原文地址:https://www.cnblogs.com/cxt-janson/p/11799458.html
Copyright © 2020-2023  润新知