抱歉,您的瀏覽器無法訪問本站
本頁面需要瀏覽器支持(啟用)JavaScript
了解詳情 >

每当我发现请求某台服务器很慢或者连接不上时,总会使用ping命令看下,请求响应是否通,查看网络延迟、丢包率、抖动这些信息,那么它的原理是啥呢?

image-20231201224937062

目前我有着如下几个疑问

  1. Ping的原理是什么?
  2. Ping命令位于OSI网络模型中的那一层?
  3. 为什么有些服务器Ping不通但却可以正常访问?

那么就带着这些问题开始冲浪

Ping的基本原理

我们来看下Ping的描述

Ping命令是一种网络诊断工具,用于测试网络中的设备是否可以在IP网络上与另一台设备进行通信。Ping命令在几乎所有的操作系统中都有,包括Windows、Linux、macOS等。

通常我们使用的格式为:ping [destination] destination可以为IP地址或者域名。

Ping命令基于ICMP(Internet Control Message Protocol)协议来进行数据传输的,而ICMP又是基于OSI的网络层IP协议来实现的,因此ICMP报文是封装在IP包中的。

ip-icmp

当主机A向主机B发送Ping命令时工作流程如下(from GPT)

  1. 发送请求:首先,主机A将创建一个ICMP Echo Request消息。这个消息包含了一些信息,包括类型(值为8),代码(值为0),校验和(发送端计算并填入的一个用于错误检测的值),标识符(用于标识Echo Request和Echo Reply消息的一个值),序列号(用于标识每个发送的Echo Request消息的一个值),以及一些数据(通常是填充数据,使得整个消息达到特定的大小)。
  2. 等待回应:然后,主机A将这个消息发送到主机B的IP地址,并开始计时。主机A等待主机B的响应。
  3. 处理回应:如果网络正常,主机B将收到这个Echo Request消息,然后返回一个ICMP Echo Reply消息。这个回应消息包含了原始的标识符和序列号,以及主机B的一些信息,包括类型(值为0),代码(值为0),校验和,以及数据。
  4. 计算往返时间:当主机A收到Echo Reply消息,它将停止计时。主机A可以通过比较发送请求和接收回应的时间来计算往返时间。
  5. 显示结果:Ping命令将显示这次ping的结果,包括往返时间和是否有数据包丢失。如果Ping命令发送了多个请求(这是默认的行为),那么它还会计算并显示平均往返时间。

如果主机A在一段时间(这个时间可以通过参数设定)内没有收到主机B的回应,那么Ping命令将认为这个请求超时,这可能表示网络有问题,或者主机B没有正常工作。

Ping命令还提供了许多参数,下面是一些常用的参数和例子

参数 作用
-c count 发出count次ping后停止
-i interval 每间隔interval秒后发送ping,默认1秒一次
-s packet size 指定每次ping发送的数据字节数,默认为“56字节”+“28字节”的ICMP头,一共是84字节 包头+内容不能大于65535,所以最大值为65507
1
2
3
4
5
// 每隔0.6秒发送一次ping,总共发送5次
ping -c 5 -i 0.6 baidu.com

// 每次ping发出65536个字节数据
ping -s 65507 baidu.com

为什么有些服务器Ping不通但却可以正常访问?

我们经常会发现有些网站/服务器无法被ping通,但却可以正常通过HTTP/HTTPS访问,这是由于网站方关闭了ICMP协议,所以ping命令无法ping通,那为什么要关闭呢?

核心原因就是为了服务器安全和隐私。

像上面的参数,我们可以简单的组合一下变成攻击手段,例如

ping -i 0.01 -s 65507 baidu.com

每1秒会发出100次,每次请求数据为65535字节(IP协议数据包最大值),就等于50mb的带宽了,很容易占用对方服务器全部带宽流量。这种通常被叫做ICMP/Ping泛洪攻击,不过通常攻击者会伪造ICMP协议的源IP地址,这样发出的Ping命令就不会返回到攻击者这里了。

这样做的目的是为了隐藏攻击者的真实身份,同时也使得攻击更难以被阻止,因为目标主机接收到的ICMP请求来自于大量不同的IP地址。

同时攻击者可以通过Ping命令去进行全网扫描,找到有ping回应的在线服务器,那么就可能将该服务器作为攻击对象,同时通过ping命令返回的数据,可以判断服务器的网络延迟,是否被攻击到宕机等。

所以为了防御攻击和 保证服务器安全,管理员会关闭服务器的ICMP协议。

小结

那么总结一下之前对于ping命令的一些疑问

  1. Ping的原理是什么?

    基于ICMP协议

  2. Ping命令位于OSI网络模型中的那一层?

    ICMP协议位于网络层

  3. 为什么有些服务器Ping不通但却可以正常访问?

    管理员关闭了ICMP协议,为了保护服务器的隐私和安全,防止被攻击