当网络不通的情况下,通常会想到ping命令,ping一下,但是ping命令内部如何执行的,可能并不清楚,其实ping是基于ICMP协议进行工作的。

 一、ICMP协议的格式

  ICMP是在RFC 792中定义的互联网协议族之一。通常用于返回的错误信息或是分析路由。ICMP错误消息总是包括了源数据并返回给发送者。 ICMP错误消息的例子之一是TTL值过期。每个路由器在转发数据报的时候都会把IP包头中的TTL值减1。如果TTL值为0,“TTL在传输中过期”的消息将会回报给源地址。 每个ICMP消息都是直接封装在一个IP数据包中的,因此,和UDP一样,ICMP是不可靠的。

  ping是基于ICMP协议的,ICMP全程Internet Control Message Protocol,就是互联网控制报文协议,网络包在异常复杂的网络环境进行传输的时候,常常会遇到各种各样的问题,当遇到问题的时候,总要传出消息来,报告情况,这样才可以调整传输策略。

  ICMP报文是封装在IP包里面的,因为传输的时候,肯定需要源地址和目标地址,它本身非常简单。ICMP报文有很多种类型,最常用的类型是主动请求为8,主动应答为0。

1、查询报文类型

常用的ping就是查询报文,是一种主动请求,并且获得主动应答的ICMP协议,所以,ping包也是符合ICMP协议的格式的,只不过他在后面增加了自己的格式。

对ping的主动请求,进行网络抓包,称为ICMP ECHO REQUEST,同理,主动请求的回复,称为ICMP ECHO REPLY,比起原生的ICMP,这里面多了两个字段,一个是标识符,一个是序号,在选项数据中,ping还会存放发送请求的时间值,来计算往返时间,说明路程的长短。

2、差错报文类型

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

(1)终点不可达

网络不可达、主机不可达、协议不可达、端口不可达、需要设置了分片但设置了不可分片

(2)源站抑制

让源站放慢发送速度

(3)时间超时

超过网络的生存时间还没有到达

(4)路由重定向

也就是下次发送给下一个路由

二、ping:查询报文的使用

ping的发送和接受过程:

具体的执行过程:

假设主机A的IP地址是192.168.1.1,主机B的IP地址是192.168.1.2,他们都在同一个子网。那么当你在主机A上运行“ping 192.168.1.2”后,会发生什么呢?

(1)ping命令执行的时候,源主机首先会构建一个ICMP请求数据包,ICMP数据包内包含多个字段。最重要的是两个,第一个是类型字段,对于请求数据包而言该字段为8;另一个是顺序号,主要用于区分连续ping的时候发出的多个数据包。每发出一个数据包,顺序号会自动加1,为了能够计算往返的时间RTT,它会在报文的数据部分插入发送时间。

(2)由ICMP协议将这个数据包,连同地址192.168.1.2一起交给IP层,IP层将以192.168.1.2作为目的地址,本机IP作为源地址,加上一些其他的信息,构建一个IP数据包。

(3)接下来,需要加入MAC头,如果在本节ARP映射表中查找出IP地址192.168.1.2所对应的MAC地址,由数据链路层构建一个数据帧,目的地址是IP层传过来的MAC地址,源地址则是本机的MAC 地址;还要加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。

(4)主机B收到这个数据帧后,先检查它的目的MAC地址,并和本机的MAC地址对比,如符合,则接收,否则就丢弃,接收后检查该数据帧,将IP包从数据帧中取出来,交给本机的IP层,同样,IP层检查后,将有用的信息提取出来后交给ICMP协议。

(5)主机B会构建一个ICMP应答包,应答数据包的类型字段为0,顺序号为接收到的请求数据包中的顺序号,然后再发送给主机A

分析:

在规定的时间内,源主机如果没有接收到ICMP的应答包,则说明目标主机不可达。

如果接收到了ICMP的应答包,则说明目标主机可达

此时,源主机会检查,用当前时刻减去该数据包最初从源主机上发出的时刻,就是ICMP数据包的时间延迟

扩展:

如果跨网断的话,还会涉及到网关的转发、路由器的转发等等。但是对于ICMP的头来讲,是没什么影响的,会影响的是根据目标IP地址,选择路由的下一跳,还有每经过一个路由器到达一个新的局域网,需要换MAC头里面的MAC地址。

附上原文地址极客时间趣谈网络协议:https://time.geekbang.org/column/article/8445#previewimg

ICMP协议和ping命令的更多相关文章

  1. 计算机网络(5)-----ICMP协议和PING程序

    控制报文协议(Internet Control Message Protocol) 定义 它是TCP/IP协议族的一个子协议,用于在IP主机.路由器之间传递控制消息.控制消息是指网络通不通.主机是否可 ...

  2. UNIX网络编程——利用ARP和ICMP协议解释ping命令

    一.MTU 以太网和IEEE 802.3对数据帧的长度都有限制,其最大值分别是1500和1492字节,将这个限制称作最大传输单元(MTU,Maximum Transmission Unit)      ...

  3. 利用ARP和ICMP协议解释ping命令

    一.MTU 以太网和IEEE 802.3对数据帧的长度都有限制,其最大值分别是1500和1492字节,将这个限制称作最大传输单元(MTU,Maximum Transmission Unit).如果IP ...

  4. 利用ICMP协议的PING命令获取客户端当前网络质量 by徐文棋

    无论在windows下,linux也好,unix也好,都可以通过 Ping命令获得当前设备的网络延迟,延迟是客户端到服务端的网络响应时间.通常延迟越低,反应速度越快 这里使用了SimplePing   ...

  5. Ping命令与ICMP协议

    ICMP协议 ICMP是"Internet Control Message Ptotocol"(Internet控制消息协议)的缩写.它是TCP/IP协议族的一个子协议,用于在IP ...

  6. Windows7/10实现ICMP(ping命令)

    如果觉得本文如果帮到你或者你想转载都可以,只需要标注出处即可.谢谢 利用ICMP数据包.C语言实现Ping命令程序,能实现基本的Ping操作,发送ICMP回显请求报文,用于测试—个主机到只一个主机之间 ...

  7. 解决:Ubuntu12.04下使用ping命令返回ping:icmp open socket: Operation not permitted的解决

    ping命令在运行中采用了ICMP协议,需要发送ICMP报文.但是只有root用户才能建立ICMP报文.而正常情况下,ping命令的权限应为-rwsr-xr-x,即带有suid的文件,一旦该权限被修改 ...

  8. ICMP协议Ping命令的应用

    ICMP的全称是 Internet Control Message Protocol ,它是TCP/IP协议族的一个子协议,属于网络层协议,用于在IP主机.路由器之间传递控制消息.从技术角度来讲,就是 ...

  9. ping命令基于ICMP协议的返回信息分析

    Ping是潜水艇人员的专用术语,表示回应的声纳脉冲,在网络中 Ping 是一个十分好用的 TCP/IP 工具.它主要的功能是用来检测网络的连通情况和分析网络速度.可以利用 PING 命令检查网络连通状 ...

随机推荐

  1. jenkins配置发送邮件时,日志中显示发送成功,但是邮箱没有收到邮件

    遇到这种问题,是因为安装的Email Extension Plugin插件版本与jenkins不兼容, 经试验2.39.3版本可以正常发送邮件,在jenkins主目录中 将2.39.3的文件和文件夹复 ...

  2. SDK介绍

    软件开发工具包(外语首字母缩写:SDK.外语全称:Software Development Kit)一般都是一些软件工程师为特定的软件包.软件框架.硬件平台.操作系统等建立应用软件时的开发工具的集合. ...

  3. bzoj 4195: [Noi2015]程序自动分析【并查集】

    等于有传递性,所以hash一下把等于用并查集连起来,然后再判断不等于是否合法即可 #include<iostream> #include<cstdio> #include< ...

  4. 【杂谈】小记一个ios11的bug

    前段时间,除了apple发布了新的硬件之外,同步还发布了新的操作系统,IOS11,当大家都将注意力聚焦在那个奇怪的刘海该如何适配的时候,笔者的项目在适配IOS11却出现了其他的问题. 众所周知,IOS ...

  5. Drawable新属性

    mSelectEndorseReasonTv.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.toup, 0);新属性替换: Draw ...

  6. JAVA启动参数三:非Stable参数

    前面我们提到用-XX作为前缀的参数列表在jvm中可能是不健壮的,SUN也不推荐使用,后续可能会在没有通知的情况下就直接取消了:但是由于这些参数中的确有很多是对我们很有用的,比如我们经常会见到的-XX: ...

  7. jQuery html操作

    jQuery 拥有可操作 HTML 元素和属性的强大方法. jQuery DOM 操作 DOM = Document Object Model(文档对象模型) jQuery 中非常重要的部分,就是操作 ...

  8. Kuskal/Prim POJ 1789 Truck History

    题目传送门 题意:给出n个长度为7的字符串,一个字符串到另一个的距离为不同的字符数,问所有连通的最小代价是多少 分析:Kuskal/Prim: 先用并查集做,简单好写,然而效率并不高,稠密图应该用Pr ...

  9. ASP.NET CORE 使用 EF CORE访问数据库

    asp.net core通过ef core来访问数据库,这里用的是代码优先,通过迁移来同步数据库与模型. 环境:vs2017,win10,asp.net core 2.1 一.从建立asp.net c ...

  10. Mybatis查询select操作

    先看select标签的属性: 说几点: resultType和resultMap都是用来表示结果集的类型的,resultType用于简单的HashMap或者是简单的pojo对象,而resultSet是 ...