专栏首页程序猿的那点事ICMP协议与ping命令

ICMP协议与ping命令

前言

在网络中ping是一个十分强大的TCP/IP工具。它的作用主要为:

(1)用来检测网络的连通情况和分析网络速度;

(2)根据域名得到服务器IP;

(3)根据ping返回的TTL值来判断对方所使用的操作系统及数据包经过路由器数量。

我们通常会用它来直接ping IP地址,来测试网络的连通情况。

Ping 的原理是 ICMP 协议.

简介

ICMP 的全称是 Intent Control Message Protocol, 中文过来就是 互联网控制报文协议。它是互联网协议族的核心协议之一。它用于TCP/IP网络中发送控制消息,提供可能发生在通信环境中的各种问题反馈,通过这些信息,使管理者可以对所发生的问题作出诊断,然后采取适当的措施解决。 在IP通信中,经常有数据包到达不了对方的情况。原因是,在通信途中的某处的一个路由器由于不能处理所有的数据包,就将数据包一个一个丢弃了。或者,虽然到达了对方,但是由于搞错了端口号,服务器软件可能不能接受它。这时,在错误发生的现场,为了联络而飞过来的信鸽就是ICMP 报文。在IP 网络上,由于数据包被丢弃等原因,为了控制将必要的信息传递给发信方。ICMP 协议是为了辅助IP 协议,交换各种各样的控制信息而被制造出来的。

ICMP的主要功能: 1.确认IP包是否成功送达目标地址。 2.通知在发送过程当中IP包被废弃的具体原因。

ICMP协议的格式

ICMP报文主要分为两种类型:

  • 查询报文
  • 差错报文

查询报文 (Echo Request与 Echo Reply)

定义:发送端主动发起请求,并且获取到应答。

常见应用:Ping

Ping 就是主动请求,获取到主动应答。但是 Ping 是在原生的 ICMP 中添加了自定义格式区域。例如 Ping 中放了发送的请求时间,以此计算出路程。所以,其实在 Ping 的报文中会加入序号,以用来区分数据包,从而提高计算时间或者路程的准确性。

差错报文

ICMP差错报文的几个例子:终点不可达为3,源抑制为4,超时为11,重定向为5

(1)终点不可达

网络信息不能到达终点,就会给发送端发送一个目的不可到达的信息。告诉发送端可能是设备故障而引起关闭(情况之一)。然后这种又可以再次细分: A、网络不可达 — 代码为 0, B、主机不可达 — 代码为 1. C、协议不可达 — 代码为 2. D、端口不可达 — 代码为 3. E、需要分段 - 代码为 4.( 必须把数据分段才能去到终点

(2)源站抑制

发送端发送大量数据时,可能会导致网络( 路由器 )过载,此时过载处可以向发送端发送源抑制的消息,让他降低发送速度。

(3)时间超时

网络包超过设置的在网络中的生存时间,还没有达到。

(4)路由重定向

定义数据包的路由规则。因为大部分的时候,路由规则是通过相关协议算法生成的,有些时候重新定义过之后,会让这个数据包绕的更远。

ICMP实现之ping命令

ping 命令用来在IP 层次上调查与指定机器是否连通,调查数据包往复需要多少时间。为了实现这个功能,ping 命令使用了两个ICMP 报文。

1.向目标服务器发送回送请求。 首先,向目标服务器发出回送请求(类型是8,代码是0)报文(同2)。在这个回送请求报文里,除了类型和代码字段,还被追加了标识符和序号字段。标识符和序号字段分别是16 位的字段。ping 命令在发送回送请求报文时,在这两个字段里填入任意的值。对于标识符,应用程序执行期间送出的所有报文里填入相同的值。对于序号,每送出一个报文数值就增加1。而且,回送请求的选项数据部分用来装任意数据。这个任意数据用来调整ping 的交流数据包的大小。

2.返回回送回答。 计算机送出的回送请求到达目标服务器后,服务器回答这一请求,向送信方发送回送请求(类型是0,代码是0)(同3)。这个ICMP 回送回答报文在IP 层来看,与被送来的回送请求报文基本上一样。不同的只是,源和目标IP 地址字段被交换了,类型字段里填入了表示回送回答的0。也就是,从送信方来看,自己送出的ICMP 报文从目标服务器那里象鹦鹉学舌那样原样返回了。 送信方的计算机可以通过收到回送回答报文,来确认目标服务器在工作着。进一步,记住发送回送请求报文的时间,与接收到回送回答报文的时间一比较,就能计算出报文一去一回往复所需要的时间(同4)。但是,收到的回送回答报文里写的只是类型和代码的话,发送方计算机将无法判断它是否是自己发出去请求的回答。因此,前面说到的标识符和序号字段就有它的意义了。将这两个值与回送回答报文中的相同字段值一比较,送行方计算机就能够简单地检测回送回答是否正确了。执行ping 命令而调查的结果没什么问题的话,就将目标服务器的IP 地址,数据大小,往复花费的时间打印到屏幕上。

3.用ping 命令不能确定与对方连通的原因大致有三个。 1)目标服务器不存在;2)花在数据包交流上的时间太长ping 命令认为超时;3)目标服务器不回答ping 命令。如果是原因2),通过ping 命令的选项来延长到超时的等待时间,就能正确显示结果了。如果原因是1)或3)的话,仅凭ping 命令的结果就不能判断是哪方了。正如这样,ping 命令不一定一定能判断对方是否存在。

ping的简单使用

ping -t

不间断地ping指定计算机,直到管理员中断。

ping -a

ping -a解析计算机名与NetBios名。就是可以通过ping它的IP地址,可以解析出主机名。

ping -n count

发送 count 指定的 ECHO 数据包数。默认值为 4

ping -l length

发送包含由 length 指定的数据量的 ECHO 数据包。默认为 32 字节;最大值是65,527。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Wifi自动连接评分机制

    今天了解了一下Wifi自动连接时的评分机制,总结如下: WifiConnectivityManager的初始化: /frameworks/opt/net/w...

    用户7557625
  • Android开发必须知道的adb命令大全

    用户7557625
  • Android P中WIfi P2P代码结构

    从FrameWork层开始,Wifi P2P和Wifi的代码就开始分开了,当然只是在Wifi目录下新建了一个p2p文件夹来单独存放p2p的相关代码。下面我们来看...

    用户7557625
  • 网络协议 5 - ICMP 与 ping:投石问路的侦察兵

        日常开发中,我们经常会碰到查询网络是否畅通以及域名对应 IP 地址等小需求,这时候用的最多的应该就是 ping 命令了。 那你知道 ping 命令是怎么...

    北国风光
  • 基于 FPGA 的数字表示

    在FPGA系统中有两个基本准则非常重要,分别为:数字表示法和代数运算的实现。本博文主要介绍数字表示。   参考文献:数字信号处理的FPGA实现(第3版)中文版 ...

    碎碎思
  • 这么写参数校验(validator)就不会被劝退了~

    很痛苦遇到大量的参数进行校验, 在业务中还要抛出异常或者不断的返回异常时的校验信息, 在代码中相当冗长, 充满了 if-else 这种校验代码, 今天我们就来学...

    黄泽杰
  • 这么写参数校验(validator)就不会被劝退了~

    很痛苦遇到大量的参数进行校验,在业务中还要抛出异常或者不断的返回异常时的校验信息,在代码中相当冗长,充满了if-else这种校验代码,今天我们就来学习sprin...

    良月柒
  • 金额跳动动画效果

    Dwyane
  • Java 虚拟机:JVM是怎么实现invokedynamic的?(上)

    这一天,先进分子牵着一头鹿进来,说要参加赛马。咱部里的老学究 Java 就不同意了呀,鹿又不是马,哪能参加赛马。

    码农架构
  • PHP变量类型测试函数的使用:五、is_array的用法

    刚讲完PHP变量类型测试函数【is_string】的用法,今天来讲讲PHP变量类型测试函数【is_array】的用法。

    大脸猫

扫码关注云+社区

领取腾讯云代金券

,,