网络层 - ICMP 应该是你最熟悉的协议了
ICMP 协议
在之前网络层的介绍中,我们知道 IP 提供一种无连接的、尽力而为的服务。这就意味着无法进行流量控制与差错控制。因此在 IP 数据报的传输过程中,出现各种的错误是在所难免的,为了通知源主机 IP 数据报传输过程中遇到的问题,因此设计了因特网控制报文协议(ICMP)。
虽然说 ICMP 协议将 IP 协议封装在内部,所以大多数人将 ICMP 视为传输层的协议,但实际上 ICMP 是 IP 协议的重要组成部分,所以将其放在网络层更为合适。
ICMP 的报文一般有两种,查询报文和查询报文。
查询报文:例如我们在使用 ping 命令,子网掩码查询,时间戳查询等情况时,都会发送查询报文。
差错报文:而差错报文是在当对应的路由器或者终端设备收到查询报文后,产生了一系列问题。把出现的问题,回复给发起者的报文就是差错报文。
但考虑到整体网络资源的占用上,在如下情况下,是不会产生差错报文的:
- 差错报文不会产生差错报文 - 防止 ICMP 无限产生和传送差错报文
- 目的地址是广播或多播的 IP 数据包
- 链路层广播的数据包
- 不是 IP 分片的第一片 - IP 是尽力而为,自然不需要可靠性
- 源地址不是某个主机的数据包
ICMP 类型
由于 ICMP 本身就是为了弥补 IP 协议不可靠的特性,起到排错目的,所以它的 Header 并不复杂。
正如图中所示的,对于 ICMP Header 来说,比较重要的就是 Type (8 bit)和 Code (8 bit) 字段,用来表示各种错误的情况。
其中完整的介绍可以参考这篇 wiki,下面就介绍上常用的部分。
Type | code | Description |
---|---|---|
0 | 0 | Echo 回复报文,如 Ping 命令的回复报文。 |
3 | 0 | 网络不可达 |
3 | 1 | 主机不可达 |
3 | 3 | 协议不可达 |
3 | 4 | 端口不可达 |
3 | 6 | 网络不知道 |
3 | 7 | 主机不知道 |
8 | 0 | Echo 请求报文,如 Ping 命令的请求报文。 |
13 | 0 | 时间戳请求报文 |
下面我们抓个包,来看一下。
Ping 命令测试网络连通性
这里在主机上 Ping 下百度,通过 Wireshark 抓到的数据包如下:
先看一下 Echo Request 包,对应 Type 为8,Code 为0:
Echo Reply 包 - Type 为 0,Code 为 0:
Traceroute 测试网络连通性
在 IP 协议中,为了防止出现环路而设置了 TTL 字段。该字段也在 traceroute 中起到了很大的作用,通过设置 TTL 的数值,来获取数据报的传递过程。
TTL:当 IP 数据包进行传送时,每经过一个路由器,TTL 指就会减一,当 TTL = 0 时,该 IP 数据报会被丢弃。
下面就来了解下 Traceroute 的通信过程,用到的拓扑如下:
当主机收到目的主机的 IP 后,会给目的主机发送一个 TTL = 1 的 UDP 数据包。
而经过第一个路由器后,TTL - 1 变成 0.这时路由器会把数据报丢弃,然后把丢弃的数据包的 IP 头部封装起来,回复主机一个差错报文。如下:
这个过程主机会发三次,也就是说会产生 3 个 TTL =1 的 UDP,如下
接着会在再次发送 3 个 TTL = 2 的 UDP 报文,如下
第二个路由器,会再次向主机发送一个差错报文,如下:
这里需要注意的:由于第二台路由器已经相当于是目的地,所以将数据包拆到传输层,但由于传输层上的端口标识了应用层的应用,而在该路由器上不在该应用,进而回复了端口不可达的报文。
也就是说当接受到端口不可达的回包时,会停止发送,由于图中只经过 2 个路由器,所以截止发送到 TTL = 2.
并且我们可以从 TTL = 2 的回复差错报文看出,只有两个差错报文。其中有个差错报文出现了丢失,并且没有给主机回复差错报文丢失的情况
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了