概述

不管是开发中,还是电脑日常使用,常常遇到网络不通的问题。这时你就会习惯性的使用一个命令ping,查看问题出在哪里,那它是如何工作的哪?

ICMP协议

ICMP就是互联网控制报文协议,网络包在复杂的网络环境传输时,常常遇到各种各样的问题。当遇到问题的时候,总不能让这个网络包死的不明不白,要传出消息来,报个情况,是怎么死的,为什么死的,这样才可以调整传输的策略。所以ICMP的功能主要有两种,确认IP包是否成功到底目标地址,通知在发送过程中IP被丢弃的原因。

ICMP报文是封装在IP包里的,一个ICMP报文包括IP报头,ICMP报头和ICMP报文,若IP报头中的协议字段为1时,说明是一个ICMP报文。

类型:占一个字节,标识ICMP报文的类型,不同类型有不同的代码,它有分为两大类,一类为差错报文,一类为查询报文。

代码:与类型字段一起标识ICMP报文的详细类型。

校验和:检验报文在传输过程中是否出现差错,和IP报头中的校验和是一样的。

查询报文类型

ping就是查询报文,一种主动的请求,并且获得主动应答的ICMP协议。ping发起请求命令,会发送一个ICMP Echo Request给对端,请求得到回复,就叫ICMP Echo Reply,它对比原生的ICMP,多了两个字段,一个是标识符,一个是序号。并且ping命令会统计响应时间和TTL(生存周期)来计算往还时间,说明路程的长短。

假定我们在一个子网内,主机A的IP为192.168.6.1,主机B的IP为192.168.6.2,。在主机A运行ping 192.168.6.2

  1. ping命令执行的时候,源主机会构建一个ICMP请求的数据包。里头有两个重要的字段,就是我们前面说的标识符和序号,对于请求数据包而言该字段的类型为8(回送请求),另一个就是顺序号,区分连续ping的时候发出的多个数据包,每发出一个请求数据包,顺序号会自动加1,并且会在报文的数据部分插入发送时间。
  2. ICMP协议将这个数据包连同192.168.6.2交给IP层,IP层将会以192.168.6.2作为目标地址,本机IP地址作为源地址,还有一些控制信息构建为一个IP数据包
  3. 加入MAC头,先判断一下是不是在一个子网内,如果是就在ARP映射表中查找IP地址192.168.6.2对应的MAC地址,则可以直接使用。如果没有,就要发送ARP协议查询MAC地址,获取MAC地址后。构建一个数据帧在附加上一些控制信息,依据以太网的介质访问规则,将数据包发送出去。
  4. 192.168.6.2收到这个数据帧后,检查下MAC目标地址,和本机的MAC地址对比,符合就接收,不符丢弃。检查该数据帧,将IP数据包从帧中提取出来,交给本机IP层,IP层检查完后,有用信息提取后交给ICMP协议。
  5. 192.168.6.2收到后,会构建一个ICMP应答包,应答的类型字段为0,顺序号为接收到的请求包的序号,发给主机192.168.6.1
  6. 在规定时限内,源主机也就是192.168.6.1没有接到ICMP的应答包,就说明目标主机不可达,如果接收到ICM应答包,则说明目标主机可达。然后检查当前时刻减去该数据最初从源主机发出的时刻,也就是ICMP数据包的时间延迟。

注意:有很多中间设备都是禁止ping的,并不是说网络不通。这个时候我们就要使用其他协议来检查网络是否通畅,如telnet等

差错报文类型

这是ICMP协议的另一个报文种类,差错报文中常用的类型主要有5种。终点不可达,端口不可达,源点抑制,超时,参数问题,改变路由

  1. 假定主机A给主机B发送一个邮件,网络传输中要经过很多台路由器,若R1接到邮件后,发生了故障,不知道下一步该发给哪个路由设备或那台主机设备,这封邮件也就没法到达主机B,这时路由R1就会把数据包丢弃并向主机A发回一个终点不可达的数据报文。这时数据报文,类型标号为3,表示是不可达的错误类型。
  2. 目标系统收到一个IP数据报某个服务请求时,本地没有此服务,会向源头返回ICMP端口不可达信息。
  3. 假定主机A给主机B发送一个视频,主机A传输非常快,主机B接收慢的话,可能导致数据都拥塞在某一台设备上,这台设备解决不了拥塞问题,会给源主机发送一个源点抑制报文反馈给源主机,告诉源主机数据拥塞了,在发送就会丢数据,告诉他放慢发送数据。类型标号为4,
  4. 如果超过网络包生存周期还是没到,就是超时,主机A给主机B发送一个数据报文时,该数据报文在网络会有一个TTL生存时间字段,没经过一台路由,TTL字段就会减1,路由器收到数据报文后TTL字段值减1后为0的话,该路由器就会把数据包丢弃并向主机A发送一个ICMP超时报文,类型是为11
  5. 当路由器后目标追收到数据报的首部中有的字段值不正确时,就会丢弃数据报,向源点发送参数问题的报文,类型为12
  6. 路由器改变路由报文发送给主机,让主机知道下次应将数据报文发送给另外的路由器。类型为5

traceroute

traceroute的应用就是差错报文类型使用,它的目的就打印出可执行的程序主机,一直到目标主机之前要经历多少路由器,也就是路由追踪。traceroute使用ICMP的规则,故意制造一些能产生错误的场景,就是故意设置特殊的TTL,追踪去往目的地时沿途经过的路由器。

======================================================

如发现错误,请及时留言,lz及时修改,避免误导后来者。感谢!!!

转载于:https://www.cnblogs.com/dslx/p/10809500.html

PING命令与ICMP协议相关推荐

  1. c语言实现icmp协议ping命令,利用ICMP协议实现ping命令

    一.实现原理 ping利用ICMP协议包来侦测另一个主机是否可达.Ping的原理是使用了类型码为8的ICMP回送请求包,收到请求的主机则用类型码为0的ICMP回应报文.如果应答包和请求包的标示号.序号 ...

  2. 【计算机网络】(5)ping的过程分析+icmp协议

    目录 一.ping 1.1 过程分析 1.2 ICMP协议 1.2.1 iptables简要介绍 1.2.2 路由追踪 1.3 常用选项 1.4 ping一台服务器ping不通的原因和解决方法 1.5 ...

  3. ping命令使用什么协议

    几乎每一名网工及弱电工程师都遇到过网络不通的情况,通常判断标准是以外网连通性及 Ping 测试得出结果,而 ping 属于 ICMP 协议中的一个工具.ping 是为了测试另一台主机是否可达,发送一份 ...

  4. ping 原理与ICMP协议---转

    http://blog.csdn.net/inject2006/article/details/2139149 ping 的原理 ping 程序是用来探测主机到主机之间是否可通信,如果不能ping到某 ...

  5. ping 原理与ICMP协议

    2019独角兽企业重金招聘Python工程师标准>>> ICMP(Internet Control Message Protocol) http://blog.csdn.net/in ...

  6. ssh命令、ping命令、traceroute 命令所使用的协议

    在Node reboot or eviction: How to check if yourprivate interconnect CRS can transmit network heartbea ...

  7. Ping命令及其协议

    今天一师弟,问我说:"师兄一个网络地址我可以用浏览器访问,为什么不能ping通呢?" 答:"ping命令,用于路由和主机之间的连通测试,即局域网内:而浏览器访问地址则能够 ...

  8. 全面掌握ping命令(三) ping命令防火墙设置

    Ping命令利用ICMP协议工作,ICMP是一个比较复杂的协议,功能强大,也经常被黑客利用来攻击网络上的路由器和主机,所以目前的很多网络设备或防火墙都提供了禁用ICMP协议的功能.如Windows系统 ...

  9. ICMP协议Ping命令的应用

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

最新文章

  1. DeepMind 打造 AI 游戏系统,可以玩扑克、国际象棋、围棋等,战斗力爆表
  2. java常用类型转换
  3. 在Visual Studio中使用命令行参数进行调试
  4. Making the impossible: 3 nodes intercontinental replication--转载
  5. keepalived热备 keepalived+LVS Haproxy
  6. 标准梯度—lhMorpGradient
  7. Deep Q-learning
  8. 百度地图java批量获得经纬度_从百度地图API接口批量获取地点的经纬度
  9. xampp 中 mysql的相关配置
  10. win7查看隐藏文件_win7系统如何隐藏文件 win7系统隐藏文件步骤【介绍】
  11. B - 吉哥系列故事——完美队形II HDU - 4513 (马拉车)
  12. MySQL-第三篇SQL语句基础(2)数据库约束
  13. c++ sort排序函数
  14. php纯真ip调用,使用php调用纯真IP数据库信息的解析组件
  15. 亚马逊成功的四个关键因素
  16. vTestStudio:变体Variant初理解
  17. C 关于unsigned int compzero = ~0;与unsigned int compzero = 0xFFFF; 的区别!
  18. 【华为OD机试真题 JS】叠积木
  19. 由《创业时代》想到的
  20. Keil C51中code、data、bdata、idata、xdata、pdata的解释

热门文章

  1. 优启通VIP版(EasyU)_v3.7.2023.0323
  2. Global Enqueue Services Deadlock --WFG的诊断
  3. 一组数据证明 歪果仁根本不用PC玩游戏
  4. 西克DFS60E-S4AB00500增量编码器
  5. SpringBoot启动dubbo出现com.alibaba.dubbo.common.bytecode.Wrapper12: inconsistent stack height -1异常
  6. 视频有水印怎么办?视频去水印软件推荐
  7. Js将字符串转换成对象或数组en
  8. php 汉字转拼音类
  9. Unity3D《太空战机》如何给战机加上防护罩
  10. Unity3D开发:为地形添加水源和效果