聊聊ICMP协议及ping过程

  • 在当我们判断网络是否连通时,使用最多的命令是ping,traceroute,其是基于ICMP协议实现,那么ICMP协议是什么?

ICMP协议

ICMP(Internet Control Message Protoco)协议是TCP/IP协议栈中的网络层的一个协议,ICMP是Internet控制报文协议,用于在IP主机、路由器之间传递控制消息。(控制消息是指:网络通不通、主机是否可达、路由是否可用等网络本身的消息)这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

ICMP实际上是IP的一个组成部分,必须由每个IP模块实现。ICMP报文通常被IP层或更高层协议(TCP或UDP)使用。一些ICMP报文把差错报文返回给用户进程。

ICMP是TCP/IP模型中网络层的重要成员,与IP协议、ARP协议、RARP协议及IGMP协议共同构成了TCP/IP模型中的网络层。

ping和tracert是两个常用网络管理命令:

  • ping用来测试网络可达性。
  • tracert用来显示到达目的主机的路径。

ping和tracert都利用ICMP协议来实现网络功能,它们是把网络协议应用到日常网络管理。

虽然ICMP是网络层协议,但是它不像IP协议和ARP协议一样直接传递给数据链路层,而是先封装成IP数据包然后再传递给数据链路层。所以在IP数据包中如果协议类型字段的值是1的话,就表示IP数据是ICMP报文。IP数据包就是靠这个协议来区分不同的数据包。


ICMP报文格式

ICMP报文包含在IP数据报中,属于IP的一个用户,IP头部就在ICMP报文的前面,所以一个ICMP报文包括IP头部、ICMP头部和ICMP报文。

聊聊ICMP协议及ping过程_第1张图片

类型:标明ICMP报文的作用和格式,4位。

代码:表明报文的类型,4位。

校验和:检验报文是否有误,8位。


ICMP报文类型

ICMP协议主要通过Type和Code的组合来标明报文的类型。

(1)请求响应

一台主机向一个节点发送一个Type=8的ICMP报文,如果途中没有异常(例如被路由器丢弃、目标不回应ICMP或是传输失败),则接收方就会返回一个Type=0的ICMP报文。

(2)目标(网络、主机、协议)不可到达、源抑制和超时报文

  • 目标不可达中这几种情况的报文类型都是一样的,接收方返回一个Type=3,Code=3的报文,就是端口不可达,即访问了一个不存在的端口。
  • 源抑制充当一个控制流量的角色,其通知主机减少数据报流量,由于ICMP没有恢复传输的报文,所以只要停止该报文,主机就会逐渐恢复传输速率。
  • 超时报文:无连接方式网络问题(数据报会丢失)、长时间在网络游荡而找不到目标、拥塞导致主机在规定时间内无法重组数据报分段,以上就会触发ICMP超时报文的产生。在超时报文中的代码域有两种取值:Code=0:传输超时;Code=1:重组分段超时。

ping过程

在Linux中ping命令用于检测主机,执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该消息,因而得知该主机运行正常。

ping是利用ICMP报文检测网络连接。

ICMP ping就是向目标主机发送ICMP信息报文,目标主机回应ICMP信息报文或差错报文,ping程序根据这些收到的ICMP报文以知道目标主机的可达性。

那么当在同一网段内与跨网段的ping的这两种情况是怎样的?

假设主机A的IP为:1.1.1.1
主机B的IP为:1.1.1.3

同一网段内

若主机A要去ping主机B,那么主机A就要封装二层报文,它先会先查看自己MAC地址表,若其中没有B的MAC地址,其就会向外发送一个ARP广播包:

以太网目的MAC 源MAC OP 发送端以太网MAC 发送端IP地址 目的MAC 目的IP
AA-AA-AA-AA-AA-AA 00-50-56-C0-00-01 1.1.1.1 00-00-00-00-00-00 1.1.1.3

交换机会收到这个报文,其中交换机有学习MAC地址的功能,所以交换机会检索自己有无保存主机B有MAC,若有,就返回给主机A,若没有,就会向所有端口发送ARP广播,其它主机接收到后,发现所发送的ARP广播中不是找自己的,就会丢弃该报文。直到主机B收到该报文后,主机B会立即响应,以主机A所发送的ARP报文格式返回给主机A。

以太网目的MAC 源MAC OP 发送端以太网MAC 发送端IP地址 目的MAC 目的IP
00-50-56-C0-00-01 00-50-56-C0-00-03 1.1.1.3 00-50-56-C0-00-01 1.1.1.1

这时我们可见主机A已经学习到了主机B的MAC,并将其封装到ICMP协议的二层报文中向主机B发送。

报文格式:

目的地址 源地址 ... 源 IP 目的IP
00-50-56-C0-00-03 00-50-56-C0-00-01 1.1.1.1 1.1.1.3 Echo request

当主机B接收到这个报文后,按同样的格式将返回一个值给主机A

目的地址 源地址 ... 源 IP 目的IP
00-50-56-C0-00-01 00-50-56-C0-00-03 1.1.1.3 1.1.1.1 Echo answer

这就是同一网段内ping的过程

不同网段ping过程

假设有两个主机A和B,主机A要ping主机B,但是发现主机A和主机B的IP不在同一网段,如同上文所说的同一网段内ping步骤一样,先发送一个ARP广播,让其学到网关的MAC,再封装ICMP报文给网关路由器。

目的地址 源地址 ... 源 IP 目的IP
00-50-56-C0-00-02 00-50-56-C0-00-01 1.1.1.1 2.1.1.3 Echo request

当路由器接收到主机A发送的ICMP报文后,发现主机A本身的目的地址是其本身的MAC地址,根据目的IP1.1.1.3的路由表项,得到一个出口指针,去掉之前的MAC头部后使用自己的MAC地址向主机B发送。

目的地址 源地址 ... 源 IP 目的IP
00-50-56-C0-00-01 00-50-56-C0-00-02 2.1.1.3 1.1.1.1 Echo answer

你可能感兴趣的:(网络,服务器,运维,网络协议,tcp/ip)