我们常常会遇到网络不通的问题,机器明明就在那里,但你就是连不上去。这种情况该怎么办呢?

ICMP协议的格式

一般情况下,你会想到ping一下,但你知道的ping是如何工作的吗?

ping是基于ICMP协议工作的。ICMP全称是Internet Control Message Protocol,就是互联网控制报文协议。这里的控制是什么意思呢?

网络环境是异常复杂的,当网络包在传输的过程中会遇到各种问题。当遇到问题时不能不声不响,需要报告究竟出了什么问题,以便调整传输策略。这就像军队打仗的时候,都有侦察兵一样,将军需要通过侦察兵掌握敌方的情况。

ICMP报文封装在IP报文里。因为传输的时候需要源IP和目的IP地址。它本身是非常简单的。

ICMP报文有很多类型,不同的类型有不同的代码。最常用的类型是回显请求8和回显应答0。

查询报文类型

常用的ping就是查询报文,是一种发起回显请求,并获得应答的ICMP协议。

差错报文类型

这种类型的报文都是异常情况下发起的,报告产生了什么样的异常情况。

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

终点不可达:数据包没能送到目的地。类型是3,代码里有更详细的解释,网络不可达代码是0,主机不可达代码是1,协议不可达代码是2,端口不可达代码是3。

源站抑制:让源站放慢发送速度。就是接收方认为发送方速度太快了,来不及收取了。

时间超时:网络包的生存时间超过了设定值。

路由重定向:让下次发给另一个路由器。

差错报文,除了前面的IP和ICMP的前8字节不变,后面跟上出错的IP包的IP包头和IP正文的前8个字节。

ping:查询类型报文的使用

我们看下ping的发送和接收过程。

假设主机A的IP是192.169.1.1,主机B的IP是192.168.1.2,它们在同一个子网,那么在主机A上ping主机B的IP会发生什么呢?

执行ping命令的时候,主机A会构造一个ICMP请求包,ICMP数据包包含多个字段。最重要的字段是类型字段和顺序号。请求数据包的类型是8;顺序号是用来区分ping发出的多个数据包,每发送一个请求数据包,顺序号加1。

为了能够计算往返时间RTT,在报文的数据部分会插入发送时间。

然后,ICMP协议将这个数据包连同地址192.168.1.2一起交给IP层。IP层以192.168.1.2作为目的地址,本机IP作为源地址,构建一个IP数据包。

接下来,需要加入MAC头。如果ARP映射表中有192.168.1.2对应的MAC地址,则直接使用;如果没有需要通过ARP查询MAC地址。获得MAC地址后加上MAC头,发送出去。

主机B收到数据帧后,先检查目的MAC地址,和本地的MAC地址对比,如果相同就接收,否则就丢弃。然后检查该数据帧,然后交给IP层,IP层检查后,去掉IP头交给ICMP协议。

主机B会构建一个ICMP应答包,应答包中的类型字段为0,顺序号为收到的请求包中的顺序号。

在规定的时间内,源主机没有收到ICMP应答包,则说明主机不可达;如果收到应答包,就说明主机可达,源主机会用当前时刻减去数据包发出的时间,就是ICMP数据包的往返时间。

经常会遇到一个问题,如果不在控制范围内,很多中间设备时禁止ping 的,ping不通不代表网络不通,可以使用telnet,通过其他协议来测试网络是否通,这种情况不在本篇的讲述范围内。

Traceroute:差错报文类型的使用

Traceroute的一个作用是故意设置特殊的TTL,追踪去往目的地时沿途经过的路由器。

它首先发送一个TTL为1的UDP数据包,如果中间的路由器不只一个,那么数据包在遇到第一个路由器时就丢弃该数据包,返回一个ICMP报文。然后,发送一个TTL为2的UDP数据包,那么第二个路由器会将其丢弃,并返回一个ICMP报文,如此反复,直到到达目的主机。这样Traceroute就拿到了所有路由器IP。当然,有的路由器压根不会回这个ICMP。

怎么知道UDP数据包有没有到达目的主机呢?

Traceroute程序发送一份UDP数据包给目的主机,但它会选择一个可能的值作为目的端口号(大于30000)。该数据报到达时,目的主机的UDP模块会产生一份“端口不可达”的差错ICMP报文。如果数据包没有到达,则是超时。

Traceroute的另一个作用是故意不设置分片,从而确定路径MTU。首先,发送数据包,设置不分片标志,发送第一个包长度正好与出口MTU相等。如果中间遇到窄的关口会无法通过,会返回ICMP差错报文,类型是“需要进行分片但设置了不分片标志”。每次遇到ICMP“不能分片”差错时,就减小分组的长度,知道到达目标主机。

小结:

  • ICMP相当于网络世界的侦察兵。有两种ICMP报文,一种是主动探查的查询报文,一种是报告异常的差错报文。
  • ping使用查询报文,Traceroute使用差错报文。

两个思考题:

1. 当发送的报文出问题的时候,会发送一个ICMP差错报文来报告错误,如果ICMP差错报文也出问题了怎么办?

2. 本节只说了一个局域网内的主机互相ping的情况,如果跨路由器、跨网关的过程会是怎样的?

第7讲 | ICMP与ping:投石问路的侦察兵相关推荐

  1. 底层网络知识详解:从二层到三层-第7讲-ICMP与ping:投石问路的侦察兵

    无论是在宿舍,还是在办公室,或者运维一个数据中心,我们常常会遇到网络不通的问题.那台机器明明就在那里,你甚至都可以通过机器的终端连上去看.它看着好好的,可是就是连不上去,究竟是哪里出了问题呢? ICM ...

  2. icmp报文_用侦察兵的故事趣讲ICMP和Ping,看完想忘都难!

    无论是在宿舍,还是在办公室,或者运维一个数据中心,我们常常会遇到网络不通的问题.那台机器明明就在那里,你甚至都可以通过机器的终端连上去看.它看着好好的,可是就是连不上去,究竟是哪里出了问题呢? ICM ...

  3. 网络协议 5 - ICMP 与 ping:投石问路的侦察兵

    网络协议 5 - ICMP 与 ping:投石问路的侦察兵 原文:网络协议 5 - ICMP 与 ping:投石问路的侦察兵     日常开发中,我们经常会碰到查询网络是否畅通以及域名对应 IP 地址 ...

  4. 92-ICMP与ping:投石问路的侦察兵

    7.ICMP与ping:投石问路的侦察兵 7.1.开篇词 无论是在宿舍,还是在办公室,或者运维一个数据中心,我们常常会遇到网络不通的问题. 那台机器明明就在那里,你甚至都可以通过机器的终端连上去看. ...

  5. 关于ICMP与ping:计算机网络中的侦察兵

    关于ICMP与ping:计算机网络中的侦察兵 本文章主要内容引用自:1.刘超,趣谈网络协议 2.每天学习一个命令:traceroute 查看路由信息 ICMP协议的格式 在日常工作生活中,大家经常会遇 ...

  6. 【计算机网络】网络层 : ICMP 协议 ( ICMP 差错报文 | 差错报文分类 | ICMP 询问报文 | ICMP 应用 | Ping | Traceroute )

    文章目录 一.ICMP 协议 二.ICMP 协议 简介 三.ICMP 五种差错报告报文 四.ICMP 差错报文形成 五.ICMP 差错报文 不发送 情形 六.ICMP 询问报文 七.ICMP 应用 一 ...

  7. C语言实现ICMP协议Ping命令

    From: http://www.360doc.com/content/12/0429/19/1317564_207540510.shtml 大部分人用ping命令只是作为查看另一个系统的网络连接是否 ...

  8. ICMP协议Ping命令的应用

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

  9. 网络笔记(7) ICMP与ping:投石问路的侦察兵

    无论是在宿舍,还是在办公室,或者运维一个数据中心,我们常常会遇到网络不通的问题.那台机器明明就在那里,你甚至都可以通过机器的终端连上去看.它看着好好的,可是就是连不上去,究竟是哪里出了问题呢? ICM ...

最新文章

  1. C语言实现九九乘法表共9行9列,重点考察for循环的掌握情况!
  2. 【项目实战】P2P金融数据指标分析
  3. oracle复制数据库文件不动,复制数据库中需要注意的几点事项
  4. android 设备名称_如何更改您的Android TV的设备名称
  5. 高等数学下-赵立军-北京大学出版社-题解-练习10.4
  6. [蓝桥杯2019初赛]不同子串-substr,模拟
  7. python的类和实例_Python 面向对象编程——类和实例
  8. 几组数据的相关性python_Python数据相关系数矩阵和热力图轻松实现(参数解释)...
  9. 通过寄生组合式继承创建js的异常类
  10. 本地如何使用oracle数据库,使用sqlplus连接oracle本地数据库的方式
  11. PS利用色相/饱和度蒙版改变原有颜色
  12. ant design vue 描述列表Descriptions数据绑定
  13. 求多个数最小公倍数的一种变换算法(未看)
  14. 医号馆建设医联体的核心优势(互联网医疗解决方案)
  15. php.ini中文翻译版--转载
  16. Linux文件和目录
  17. mysql自学笔记九(Navicat Premium 15)
  18. it转正述职报告_it转正述职报告
  19. 最全的dedecms织梦系统安装的方法步骤
  20. CCD、COMS,数字摄像头、模拟摄像头 区别和联系

热门文章

  1. 前端学习之路Electron——弹出框
  2. 情人节 为程序员正名
  3. 推荐一款很好看的Table样式-Tablecloth
  4. 代码迁移_三种类型的代码迁移
  5. ue4 android 虚拟按钮,ue4 创建Android和ios ar应用
  6. 给GitHub的公开信,新的Brave浏览器以及更多新闻
  7. [数据仓库复习] 数据仓库架构
  8. 二部六层电梯程序西门子1200二部六层电梯程序,无需eet可直接仿真使用
  9. Windows Server+IIS+ASP+MSSQL2K+ServU 系统整合安全方案(转)
  10. 低功耗单片机系统的设计策略