ICMP 协议的格式

ICMP全称Internet Control Message Protocol, 互联网控制报文协议。

ICMP报文是封装在IP报文里面的。

ICMP属于网络层(IP)协议. 发送不涉及到传输层,没有端口的概念。ping 是基于 ICMP 协议工作的。

ICMP包有一个8字节长的包头, 其中前4个字节是固定的格式:

  • 包含8位类型字段

  • 8位代码字段

  • 16位的校验和

  • 后4个字节根据ICMP包的类型而取不同的值

ICMP报文有很多类型, 常用的:

  • 主动请求为8

  • 主动请求的应答为0

查询报文类型

ping就是查询报文, 是一种主动请求, 并且获得主动应答的ICMP协议。

ping发的包也是符合ICMP协议格式的, 只不过它在后面增加了自己的格式。

ping的主动请求, 网络抓包, 称为ICMP ECHO REQUEST。主动请求的回复, 称为ICMP ECHO REPLY。

与原生的ICMP相比多了个两个字段:(见上图)

  • 标识符(用作区分)
  • 序号(比如派出去10个, 回来10, 就说明前方不错. 如果派出去10个, 回来2个, 说明情况不妙)
  • 选项数据中: 还会发送请求的时间值

差错报文类型

异常情况发起的, 来报告发生了不好的事情.** ICMP的差错报文类型**

除了前面还是IP, ICMP的前8字节不变, 后面则跟上出错的那个IP包的IP头和IP正文的前8个字节,参看图片ICMP 协议格式

常见类型:

  • 3 终点不可达
  • 4 源抑制
  • 11 超时
  • 5 重定向

终点不可达 3

具体不可达原因代码:

  • 0: 网络不可达: 找不到地方

  • 1: 主机不可达: 找到地方没这个人

  • 2: 协议不可达: 找到地方, 找到人, 口号没对上

  • 3: 端口不可达:找到地方, 找到人, 口号对上, 事情没对上.

  • 4: 需要进行分片, 但设置了不分片位:走到一半, 山路狭窄, 想换小车, 但是禁止换小车, 没法送到了.

源站抑制 4

让源站放慢发送速度。

时间超时 11

超过网络包的生存时间还是没到。

路由重定向 5

让下次发给另一个路由器,不需要绕路。

ping: 查询报文类的使用

  • 主机A的IP地址是192.168.1.1

  • 主机B的IP地址是192.168.1.2

  • 在主机A上运行ping 192.168.1.2

    • 源主机构建一个ICMP请求数据包

    • ICMP数据包内包含多个字段:

      • 类型字段, 这里为8

      • 顺序号, 用于区分连续ping的时候发出的多个数据包. 每发出一个请求数据包, 顺序号就会自动加1. 为了能够计算往返时间RTT, 它会在报文的数据部分插入发送时间.

    • ICMP协议将这个数据包连同地址192.168.1.2一起交给IP层. IP层将以如下信息构建一个IP数据包

      • 192.168.1.2作为目的地址

      • 本机IP地址作为源地址

      • 加上一些其他控制信息

    • 接着,需要加入MAC头

      • 如果在本机ARP映射表中查找出IP地址192.168.1.2所对应的MAC地址, 则可以直接使用.

      • 如果没有, 需要发送ARP协议查询MAC地址

    • 获得MAC地址后, 由数据链路层构建一个数据帧, 依据以太网的介质访问规则, 将它们传送出去.

      • 目的地址是IP层传过来的MAC地址

      • 源地址是本机的MAC地址

      • 附加一些控制信息

  • 主机B收到这个数据帧

    • 先检查它的目的 MAC 地址,并和本机的 MAC 地址对比,如符合,则接收,否则就丢弃。
    • 接收后检查该数据帧,将 IP 数据包从帧中提取出来,交给本机的 IP 层。
    • IP 层检查后,将有用的信息提取后交给 ICMP 协议。
    • 主机 B 会构建一个 ICMP 应答包,应答数据包的类型字段为 0,顺序号为接收到的请求数据包中的顺序号,然后再发送出去给主机 A。

在规定的时候间内,源主机A如果没有接到 ICMP 的应答包,则说明目标主机不可达;如果接收到了 ICMP 应答包,则说明目标主机可达。此时,源主机A会检查,用当前时刻减去该数据包最初从源主机上发出的时刻,就是 ICMP 数据包的时间延迟。

这只是最简单的,同一个局域网里面的情况。如果跨网段的话,还会涉及网关的转发、路由器的转发等等。但是对于 ICMP 的头来讲,是没什么影响的。

Traceroute:差错报文类型的使用

程序 Traceroute,是个“大骗子”。它会使用 ICMP 的规则,故意制造一些能够产生错误的场景。

Traceroute 的故意设置特殊的 TTL,来追踪去往目的地时沿途经过的路由器。
Traceroute 的参数指向某个目的 IP 地址,它会发送一个 UDP 的数据包。将 TTL 设置成 1,也就是说一旦遇到一个路由器或者一个关卡,就表示它“牺牲”了。接下来,将 TTL 设置为 2。第一关过了,第二关就“牺牲”了,那我就知道第二关有多远。如此反复,直到到达目的主机。这样,Traceroute 就拿到了所有的路由器 IP。

Traceroute 程序会选择一个不可能的值作为 UDP 端口号(大于 30000)发送一份 UDP 数据报给目的主机,当该数据报到达时,将使目的主机的 UDP 模块产生一份“端口不可达”错误 ICMP 报文。如果数据报没有到达,则可能是超时。UDP 是无连接的,如果不让目的主机返回一份 ICMP 报文,我们压根不知道数据报中间发生了什么。

Traceroute 还有一个作用是故意设置不分片,从而确定路径的 MTU。如果中间遇到窄的关口会被卡住,会发送 ICMP 网络差错包,类型为“需要进行分片但设置了不分片位”。每次收到 ICMP“不能分片”差错时就减小分组的长度,直到到达目标主机。

参考资料:

趣谈网络协议(极客时间)链接:
http://gk.link/a/106nW


GitHub链接:
https://github.com/lichangke/LeetCode
知乎个人首页:
https://www.zhihu.com/people/lichangke/
CSDN首页:
https://me.csdn.net/leacock1991
欢迎大家来一起交流学习

[趣谈网络协议学习] 07 ICMP与ping:投石问路的侦察兵相关推荐

  1. [趣谈网络协议学习] 03 DHCP与PXE:IP是怎么来的, 又是怎么没的?

    如何配置 IP 地址? 在linux中可以使用ifconfig, 也可以使用ip addr. 设置好了以后, 用这两个命令, 将网卡 up 一·下, 就可以开始工作了. 使用 net-tools: s ...

  2. [趣谈网络协议学习] 08 世界这么大,我想出网关:欧洲十国游与玄奘西行

    MAC头与IP头 MAC头 目标 MAC 地址 源 MAC 地址 协议类型:说明里面是 IP 协议 IP头 详情可参见 IP数据报格式详解 版本号:占用4位二进制数,表示该IP数据报使用的IP协议版本 ...

  3. 趣谈网络协议1-为什么学习网络协议

    来自极客时间<趣谈网络协议> 学习过程遇见问题:一看觉得懂,一问就打鼓,一用就糊涂. 1.为什么要学习网络协议 一般编译过程: 词法分析: 词法分析是编译的第一阶段.词法分析器的主要任务是 ...

  4. 《趣谈网络协议》学习笔记 DAY03

    内容摘录自极客时间课程<趣谈网络协议>,如有侵权,请及时联系删除. 目录 软件定义网络SDN OpenFlow和OpenvSwitch实现SDN OpenFlow协议 OpenvSwitc ...

  5. 《趣谈网络协议》学习笔记 DAY08

    内容摘录自极客时间课程<趣谈网络协议>,如有侵权,请及时联系删除. 目录 RPC协议综述 远程调用需要解决的5个问题 协议约定问题 RPC调用标准 传输问题 ONC RPC的类库 服务发现 ...

  6. 《趣谈网络协议》学习笔记DAY15

    内容摘录自极客时间课程<趣谈网络协议>,如有侵权,请及时联系删除. 目录 零星知识点 如何打通公有云和私有云 QUIC的特性 http中的keepalive 参考 零星知识点 如何打通公有 ...

  7. 《趣谈网络协议》学习笔记 DAY04

    内容摘录自极客时间课程<趣谈网络协议>,如有侵权,请及时联系删除. 云中的网络安全 共有云上的虚机,为了达到安全的目的,建议只开放需要的端口,并将其他端口关闭,然后配置安全措施对开放的端口 ...

  8. 《趣谈网络协议》学习笔记DAY10

    内容摘录自极客时间课程<趣谈网络协议>,如有侵权,请及时联系删除. 目录 基于JSON的RESTful接口协议 服务端无状态化 服务发现 小结 参考 基于JSON的RESTful接口协议 ...

  9. 《趣谈网络协议》学习笔记 DAY06

    内容摘录自极客时间课程<趣谈网络协议>,如有侵权,请及时联系删除. 目录 云中网络的隔离 GRE(Generic Routing Encapsulation) GRE的不足 VXLAN(V ...

  10. 《趣谈网络协议》学习笔记 DAY02

    内容摘录自极客时间课程<趣谈网络协议>,如有侵权,请及时联系删除. 目录 云计算中的网络 虚拟网卡 虚拟网卡连接到云中 共享与互通 隔离 参考 云计算中的网络 虚拟网卡 Linux上通过T ...

最新文章

  1. glsl-BufferObject- change
  2. 推荐一个XNA的学习站点
  3. Java中vector的用法
  4. VTK:网格之OBBDicer
  5. 阿里云服务器 搭建单体redis 以及踩坑
  6. android静态方法如何测试,android – 如何使用mock()和spy()测试静态方法
  7. 模板vs定制 门店小程序该如何选择?
  8. boost::stable_vector简单解析
  9. Problem D: 顺序串的基本运算
  10. 无法获取未定义或 null 引用的属性“title”_JDK中四种对象引用类型
  11. codeforces 1B 模拟
  12. Python:批量转换图片格式
  13. java实现行政区域划分_java解析中国行政区域并在页面显示实现动态逐级筛选
  14. GD32F103串口DMA收发
  15. CCFCSP 201712-1 最小差值
  16. 稳压电源: 电路图及类型
  17. Android Q 修改Fingerprint
  18. 【matlab】【Datcom】气动解算软件win10报错解决办法及运行交互示例
  19. 计算机网络-网络层(网络层功能概述,异构网络互联,路由与转发,SDN基本概念)
  20. r语言 tunerf函数_R语言 | 一网打尽高质量统计分析与机器学习包

热门文章

  1. 网页中有大量图片加载很慢,用什么方法进行优化
  2. 【ZT】记住这些,或许可以救你一命!!【强力推荐帖!】
  3. 软件测试的系统代码,软件测试工程师管理系统代码
  4. 国内手机号码11位的原因
  5. html页面如何嵌入cms,制作好的网页模板如何放入网站CMS中?
  6. java循环26个字母_java基础 26个英文字母循环输出 13个字母空一行
  7. reid 比赛(全国人工智能大赛)
  8. [2021江西省赛高校组]wp
  9. 347. Top K Frequent Elements
  10. C#:实现一个将字符串转换为整数的方法