注: 本文为 “ICMP 协议” 相关文章合辑。
未整理去重。
网络层 IP 数据报、ICMP 协议(含具体实验演示)
陆海潘江小 C 于 2021-04-21 17:43:28 发布
一、前言
对以前学习过的内容进行一个系统的整理,梳理思路,将零散的知识碎片集成一个相对完善的知识体系,这样能够更好地去理解知识。
看完这篇能学到什么呢?
-
IP 数据报格式和首部字段的功能;
-
Cisco 实验验证实际通信过程中 IP 数据报具体内容;
-
ICMP 协议以及报文内容;
-
ICMP 在实际中的应用。
二、IP 数据报
学习一个知识,我们往往倾向于能够直观地感知,而不喜欢抽象的概念,所以这里先放上图片(来源:百度百科)。
先看看 IP 数据报长什么样子,才能更好地理解它。
这张图最清晰直观的,一眼就可以发现 IP 数据报的格式和基本功能内容,下面就来瞧瞧每个区域分别负责什么。
一个 IP 数据报由首部和数据两个部分组成。首部的前部分属于固定部分,占 20 个字节;后面部分属于可变部分,长度时可变的。
首部固定部分主要字段解析:
1、版本
从图中可以看到,版本字段占 4 位。记录着通信双方使用的 IP 协议版本,比如 IPv4、IPv6,目前广泛使用的是 IPv4。
2、首部长度
占 4 位,表示的 单位为 4 字节,比如 1111(十进制的 15)就代表首部长度为 60 字节(15*4=60). 以 4 字节的整数倍划分,不足则填充。最常用的首部长度为 0101(20 字节)。
3、区分服务
占 8 位,用以获得更好的服务。实际中未使用。
4、总长度
即 首部长度和数据长度之和。占 16 位。因此,最大长度可知为 16 位都是 1,就是 65535 字节。
在 IP 层下层数据链路层存在自己的帧格式,帧格式的数据字段最大传送单元(MTU)是 1500 字节。尽可能长的数据报能够提高传输效率,实际中数据报长度很少大于 1500 字节。所以,IP 标准规定:所有主机和路由器的 IP 数据报长度不能小于 576 字节。
如果数据报长度超过 MTU,则将进行分片后再传送,与后面的片偏移相关。然后 总长度就成了分片后每个分片的首部和数据的长度之和。
5、标识
占 16 位。在实际 IP 中,维持了一个计数器,每产生一个数据报,计数其加 1,存放到该字段。IP 是无连接服务,不存在按序接收问题,该标识不是序号,而是 在进行分片之后对相同的数据报进行标识,属于同一个数据报的标识相同,以便到达目的后被重新封装为原来的数据报。
6、标志
占 3 位。目前使用 2 两位有意义的。
最低位:MF(More Fragment)还有分片,MF=0 时说明是最后一个分片。
中间位:DF(Don‘t Fragment)不能分片,DF=0 时才能分片。
7、片偏移
占 13 位。用于记录较长分组中,一个分片在原数据报中的相对位置。片偏移以 8 字节为单位,长度是 8 字节的整数倍。
假设一个数据报总长度为 3820 字节。首部 20 字节和数据 3800 字节。现在要求长度不超过 1420 字节,那么它的每个分片为多少呢?
简单分析一下,数据部分尽可能长的可以分为 1400,1400,1000 三个分片,这样再加上首部满足小于 1420 字节。
分片一:0-1399 字节,因此片偏移 = 0/8=0
分片二:1400-2799 字节,片偏移 = 1400/8=175
分片三:2800-3800 字节,片偏移 = 2800/8=350
很容易就计算出每个分片的片偏移。
8、生存时间
TTL(Time To Live) 占 8 位。最大值 255. 每个数据报都有 TTL,防止被错误路由在网络中不断循环,消耗网络资源。在实际中,TTL 表示的是跳数而不是时间,指明数据报在网络中最多可经过多少个路由器。
9、协议
占 8 位。指明数据报携带的数据是使用什么协议,方便目的主机的 IP 层将数据交给对应的程序处理,这里列举几个。
协议 | ICMP | IGMP | TCP | UDP | OSPF |
---|---|---|---|---|---|
字段值 | 1 | 2 | 6 | 17 | 89 |
10、首部检验和
占 16 位。只校验数据报首部,不包括数据部分。这样可以减少计算量,同时不采用复杂的 CRC 检验码,而是使用简单的 反码算术运算。
反码算术运算:将数据报首部划分为多个 16 位的序列,16 位序列相加之和取反码,写入检验和。接收方再将首部 16 位序列(包含检验和的 16 位)相加之和取反码,结果为 0 则说明数据报正确,否则丢弃。
三、Cisco 模拟器实验
现在做一个简单的实验,模拟两台主机进行通信,然后查看 IP 数据报的格式。
实验如图,现在 PC0 发送 ping 命令给 PC1.
这就是实际中 IP 数据报的格式,与开始介绍的图一致:
这里使用到 ping 命令,自然联想到是基于 ICMP 协议进行通信的。接下来看看 ICMP 协议具体是什么。
四、ICMP 协议
网际控制报文协议就是熟悉的 ICMP 全称。
还是先放一个直观容易理解地图片(来源:百度百科)
ICMP 报文作为 IP 数据报的数据,加上 IP 数据报首部,组成 IP 数据报被发送出去。
前 4 个字节是固定格式:包括类型、代码、检验和三个字段。
ICMP 报文种类有差错报告报文和询问报文,几种常用的报文类型有:
差错报告报文有 5 种类型:
1、终点不可达
当路由器或主机不能交付数据报时,就向发送方发送源点不可达报文。
2、源点抑制
由于拥塞而丢弃数据,就发送源点抑制报文告知发送方降低放松频率。
3、超时
当 TTL 减少至零时,说明目的接收方没有接收数据报,发送超时报文告知发送方。
4、参数问题
接收方收到的数据首部的一些字段不正确时,发送参数问题报文。
5、改变路由(重定向)
发送方按路由表中的默认路由发送数据给目的主机,因为每个路由器都有一个最佳路由到达每个网络。所以如果该路由不是最佳的,路由器就把新的路由信息发送给源主机,告知下次发送时有更好地路由选择。
询问报文有两种类型:
6、回送请求和回答
上面使用到的 ping 命令就是发送了询问报文,测试目的是否可到达。
7、时间戳请求和回答
请某个主机或路由器回答当前的日期时间,可以用来进行时钟同步和测量时间。
五、ICMP 实践应用
在上面的模拟实验也可以看到 ICMP 报文的内容。
使用 ping 命令测试目的主机: