公告

微信

欢迎大家私信交流

Skip to content

ping的原理

ping 是一个用于测试网络连接和延迟的常用命令行工具。

工作原理基于ICMP(Internet Control Message Protocol,互联网控制消息协议)协议。

IP包结构

ICMP包被封装在IP包中传输,一个典型的IP包结构如下:

  1. IP头部(20字节) 第一个16位:
    • 版本号(4位)
    • 头部长度(4位)
    • 服务类型(8位) 第二个16位:
    • 总长度(16位) 第三个16位:
    • 标识(16位) 第四个16位:
    • 标志(3位)
    • 片偏移(13位) 第五个16位:
    • 生存时间TTL(8位)
    • 协议(8位) 第六个16位:
    • 头部校验和(16位) 第七和第八个16位:
    • 源IP地址(32位) 第九和第十个16位:
    • 目的IP地址(32位)
  2. ICMP包(变长) ICMP头部(第一个16位):
    • 类型(8位)
    • 代码(8位) ICMP头部(第二个16位):
    • 校验和(16位) ICMP数据部分:
    • 标识符(16位)
    • 序号(16位)
    • 数据(可选)

执行ping命令时,实际上是在发送类型为8(Echo请求)的ICMP包,接收类型为0(Echo响应)的ICMP包。

基本原理

发送 ICMP 数据包

  • ICMP 主要类型包括(查询报文类型/差错报文类型):
    • 类型 0/8: Echo 响应/请求
    • 类型 3: 目标不可达
    • 类型 5: 重定向
    • 类型 11: 超时
    • ……
  • ping 命令会向目标主机发送 ICMP Echo Request(类型 8)数据包
  • 包含序列号和时间戳等信息

接收 ICMP Echo Reply 响应

  • 目标主机收到请求后会返回 ICMP Echo Reply(类型 0)数据包
  • 包含相同的序列号和时间戳

计算往返时间(RTT)和获取网络信息

  1. 往返时间(RTT)
    • 发送 Echo 请求时记录发送时间戳
    • 接收 Echo 响应时记录接收时间戳
    • 两者时间差即为 RTT
  2. 路由信息
    • 通过设置 TTL 值递增
    • 收集中间路由器返回的 ICMP Time Exceeded 消息
    • 可以追踪数据包经过的路由路径
  3. MTU 信息
    • 通过设置 DF(Don't Fragment)标志
    • 当包大小超过链路 MTU 时
    • 路由器会返回 ICMP Fragmentation Needed 消息
    • 据此可以探测路径 MTU
  4. 网络拥塞情况
    • 通过连续 ping 观察 RTT 变化
    • RTT 波动大表示网络不稳定
    • 丢包率高表示网络拥塞
  5. 目标主机状态
    • 能收到 Echo Reply 表示目标在线
    • 收到 Destination Unreachable 表示目标不可达
    • 可以粗略判断目标主机状态
  • 通过发送和接收时间戳的差值计算往返时间
  • 显示丢包率等网络质量指标

常见参数

  • -c count: 指定发送次数
  • -i interval: 指定发送间隔
  • -s size: 指定数据包大小
  • -t ttl: 设置生存时间

应用场景

  1. 测试网络连通性
  2. 检测网络延迟
  3. 排查网络故障
  4. 评估网络质量

注意事项

  1. 某些防火墙可能会屏蔽 ICMP 包
  2. ping 不等于端口可访问
  3. 需要管理员权限(Windows)

上次更新于: