计算机网络:网络层 - IPv4数据报 ICMP协议

计算机网络:网络层 - IPv4数据报 & ICMP协议

    • IPv4数据报
      • [版本 : 首部长度 : 区分服务 : 总长度]
      • [标识 : 标志 : 片偏移]
      • [生存时间 : 协议 : 首部检验和]
      • [可变部分 : 填充字段]
    • ICMP协议


IPv4数据报

一个IPv4数据报,由首部数据两部分组成:

在这里插入图片描述

而首部又分为两部分:

在这里插入图片描述

上图中,首部又分为固定部分可变部分固定部分的长度为20 byte,而可变部分的长度在0 byte40 byte之间。每一行占32 bit也就是4 byte。接下来就讲解这个首部各个字段的含义。


[版本 : 首部长度 : 区分服务 : 总长度]

在这里插入图片描述

  • 版本

4 bit,表示该IP数据报使用的版本,目前广泛使用的IP协议版本号为4

  • 首部长度

由于可变部分的存在,IPv4数据报的首部长度是不确定的,所以需要额外的字段来标识整个首部的长度。首部长度4 bit4 bit可以表示的最大数字为二进制1111,也就是15。但是IPv4数据报的最大长度为60 byte,这是4 bit好像不够用啊。

其实首部长度字段的值,是以4 byte为单位的,也就是说如果首部长度的值为15,表示有15 * 4 = 60 byte,这样4 bit刚好可以表示最大的首部长度。另外的,由于首部长度单位的限制,所以IPv4数据报首部的长度必须为四字节的整数倍

  • 区分服务

8 bit,用于提供不同等级的服务,也就是说IPv4数据报的服务分了多个等级,可以通过该字段来选择不同等级。大部分情况下不使用这个字段。

  • 总长度

16 bit指明首部和数据部分的总长度,单位为byte。由于只占16 bit,所以整个IPv4数据报总长度不超过665535 byte。当然一般来数据报的长度是数据链路层的MTU限制的。


[标识 : 标志 : 片偏移]

那么一个数据报的内容超过了MTU该怎么办?此时就要进行分片操作,将一个数据报分为多个小份的数据报

假设现在有一个长度为3820 byte的数据报,首部长度为20 byte,现在MTU限制为1420 byte,那么我们就要把这个3820 byte的打数据报分片为多个小的数据报。

如下图:

在这里插入图片描述

我们把这个数据报分片为了三个小数据报,第一个数据报的长度为20 + 1400,第二个数据报的长度为20 + 1400,第三个数据报的长度为20 + 1000,其中20表示每个分片后数据报的首部。而分片的规则为:优先填满前面的数据报,而不是将数据平均分配到每个数据报中

将一个数据报分片后,会产生以下问题:

  1. 接收方如何知道这些分片后数据报来源于同一个数据报
  2. 接收方如何知道自己是否收到了所有分片
  3. 接收方如何知道这些分片的顺序

IPv4数据报首部中的第二行字段,就是用来解决分片的问题的:

在这里插入图片描述

  • 标识

16 bit,这是一个计数器,用于区分不同的数据报,或者辨别相同的数据报。

比如说发送方前一个发送的数据报的标识 = 12345的数据报,那么发送方发送的下一个数据报的标识就应该是12345 + 1 = 12346。这样接收方就可以辨别出这是两个不同的数据报。

但是如果把一个数据报分片为多个数据报,那么分片出来的所有数据报,共用一个标识字段。此时接收方收到多个分片后,就可以判断出来这些分片原本属于同一个数据报。

  • 片偏移

13 bit,其用于指出一个数据报在分片后再原数据报中的相对位置。片偏移以8 byte为单位

比如刚才的案例中:

在这里插入图片描述

对于分片1,其第一个字节为0片偏移 = 0 / 8 = 0
对于分片2,其第一个字节为1400片偏移 = 1400 / 8 = 175
对于分片3,其第一个字节为1800片偏移 = 2800 / 8 = 350

由于片偏移只能是整数,所以数据报总长度必须是8 byte的整数倍

  • 标志

3 bit,三个比特位单独解析,从低位到高位分别是MF位,DF位,和保留位。其中保留位是保留给以后使用的,目前没有意义,保留位必须为0

MF(More Fragment)位,用于表示该数据报后面还有没有分片。一个数据报被分片后,除去最后一个分片外,所有的分片的MF = 1,表示这个分片后还有分片;而最后一个分片的MF = 0,表示该分片已经是最后一个分片了。

MF位结合片偏移,可以用于确认是否接收到了所有的分片。当接收方接收到了MF = 0
的分片,就说明已经收到了末尾的分片,随后获取该分片的片偏移从而得知前面总共有多少数据,再检测自己之前收到的数据,就可以知道自己是否受到了所有分片了。

DF(Don't Fragment )位,该位表示一个数据报是否允许分片,如果DF = 0表示允许分片,如果DF = 1表示不允许分片。

=如果一个数据报的长度超过了MTU,并且DF = 1不允许分片,此时会直接丢弃这个数据报,并向上层发送错误信息,表示该数据报不能传递

再回到这个案例:

在这里插入图片描述

接下来我画一个表格,表示这三个分片的各字段值,假设分片前标识 = 12345

数据报标识MFDF保留位片偏移
分片前123450000
分片1123451000
分片212345100175
分片312345000350

[生存时间 : 协议 : 首部检验和]

在这里插入图片描述

  • 生存时间

8 bit,又叫做TTL(Time TO Live),该字段由源主机设置,路由器每次转发时TTL要减一。当TTL = 0时,路由器不再转发该报文,而是将其丢弃,即生存时间到期了。

  • 协议

b bit,用于表示数据部分的内容使用了何种协议,常见协议字段取值如下:

在这里插入图片描述

  • 首部检验和

16 bit,用于检验数据报的首部是否发生错误,注意只检验首部,不会检验数据部分

以下是计算 IP 数据报首部校验和的步骤:

  1. 将首部所有字段视为 16 位字,并进行二进制求和(简单来说就是把首部看为16比特一组)
  2. 对求和结果进行进位运算
  3. 对求和结果进行按位取反

举例:

假设一个 IP 数据报的首部如下:

字段二进制
版本40100
首部长度50101
服务类型00000
总长度1000000 0000 0110 0100
标识12340000 0100 1011 0110
标志0000
片偏移00 0000 0000 0000
生存时间80000 1000
协议60000 0110
首部校验和00000 0000 0000 0000
源地址192.168.1.11100 0000 1010 1000 0000 0001 0000 0001
目的地址10.0.0.10000 1010 0000 0000 0000 0000 0000 0001

注意:上表中的首部检验和值是固定的,因为目前还在计算首部检验和,该字段在计算前视为0

  1. 将首部所有字段视为 16 位字,并进行二进制求和:
0100 0101 0000 0000 [版本+首部长度+服务类型]
0000 0000 0110 0100 [总长度]
0000 0100 1011 0110 [标识]
0000 0000 0000 0000 [标志+片偏移]
0000 1000 0000 0110 [生存时间+协议]
0000 0000 0000 0000 [首部检验和]
1100 0000 1010 1000 [源地址前16]
0000 0001 0000 0001 [源地址后16]
0000 1010 0000 0000 [目的地址前16]
0000 0000 0000 0001 [目的地址后16]

对以上所有数进行加法运算得到:

0001 0001 1101 1100 1010

可以看到,我们原先的所有数都是16位,这里变成了17位,即发生了进位,此时就要进行第二步进位运算。

  1. 对求和结果进行进位运算:
0001 0001 1101 1100 1010

拆出后16位:0001 1101 1100 1010,多出的位是0001,也就是1。对于进位,我们的处理方式为:将其重新加到后16位中

也就是:

0001 1101 1100 1010
+
0000 0000 0000 0001

结果为:

0001 1101 1100 1011

注意:该部分在第二次计算后,有可能还会发生进位,此时要重复该过程,直到没有进位

  1. 对求和结果进行按位取反:

最后把结果取反:

1110 0010 0011 0100

这个值就是首部检验和

接收方接收到数据报后,只需要以相同的方式进行计算,如果结算结果为0,说明首部没有发生错误。如果为非0,说明发生了错误,丢弃该报文

流程图如下:

在这里插入图片描述

剩下的目的地址源地址很好理解,不做讲解。

[可变部分 : 填充字段]

在这里插入图片描述

可选字段用来填入一些选项,可以用来支排错,测量等各种安全措施,但是实际上很少被使用。我们不过多讲解该字段。

对于填充,这是因为可选字段的长度不确定,而数据报的首部长度必须是4 byte的整数倍,这个填充字段,就是为了把可选字段填充到4 byte的整数倍的


ICMP协议

ICMP(Internet Control Message Protocol,互联网控制报文协议)是 TCP/IP 协议族中的一个重要组成部分,它负责在网络设备之间传递控制信息,例如错误报告、状态信息等。

ICMP报文被封装在IP数据报的数据部分,但是其是属于IP层的协议,而不是高层协议

ICMP报文格式:

在这里插入图片描述

字段长度描述
类型8 位标识 ICMP 报文的类型,例如错误报告、查询等。
代码8 位对类型字段的进一步解释,例如错误的具体原因。
校验和16 位用于校验 ICMP 报文本身的完整性。

而第二行这个区域,会根据不同类型的报文,而有不同的格式。

ICMP报文主要分为两类:ICMP 差错报告ICMP 询问报文

而这两个类型又被细分为更多的类型,在此我举例一部分:

  • 终点不可达:当主机或路由器不能交付数据报时,就向源点发送终点不可达报文,再根据代码字段来描述更加具体的原因。

在这里插入图片描述

以上示例中,路由器R1受到数据报后,不知道如何转发,于是丢弃数据报,发送终点不可达

  • 源点抑制:当主机或路由器因为阻塞而丢弃数据报时,就向源点发送源点抑制报文

在这里插入图片描述

以上示例中,主机H2发送拥塞,丢弃报文后向源点发送源点抑制报文

  • 时间超过:当IP数据报中的RTT减为0时,丢弃该数据报,向源点发送时间超过报文

在这里插入图片描述

以上示例中,数据报在经过R2RTT = 0,,丢弃该数据报,向源点发送时间超过报文

  • 参数问题:当主机或路由接收到IP数据报后,会检测其中的校验和字段,如果发现错误,就丢弃该报文,并向源点发送参数问题报文

在这里插入图片描述

以上示例中,当路由器R1收到IP数据报后,检测其中的校验和字段,如果发现首部出现错误,就丢弃该报文,并向源点发送参数问题报文

  • 改变路由:当主机或路由收到数据报后,发现可以通过更好的路线传送,就丢弃该报文,并向源点发送改变路由报文

在这里插入图片描述

以上示例中,当路由器R1收到IP数据报后,发现可以通过R4更快传送,就丢弃该报文,并向源点发送改变路由报文。


以上只是一部分示例,以上全部示例中,各个类型的ICMP 差错报告报文对应的类型字段的值如下:

类型终点不可达源点抑制时间超过参数问题改变路由
字段值3411125

对于ICMP 询问报文,也有部分类型字段取值:

类型回送请求/回答时间戳请求/回答
字段值8 / 013 / 14

对于询问报文,就不再举例了。

讲完了ICMP的首部,再来看看ICMP数据部分其实ICMP差错报告报文的数据部分格式也是固定的

格式如下:

在这里插入图片描述

取出IP数据报的首部,以及数据部分的前八个字节,构成ICMP的数据部分。

主要是要在ICMP报文中体现一些重要信息,以便源点分析具体原因。而大部分重要信息都在首部中,所以存储了IP数据报的首部。另外的IP数据报的数据部分的前八个字节,还包含一些运输层端口相关信息,也被纳入ICMP的数据部分。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/27376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 越来越火爆

Python 越来越火爆 Python 在诞生之初,因为其功能不好,运转功率低,不支持多核,根本没有并发性可言,在计算功能不那么好的年代,一直没有火爆起来,甚至很多人根本不知道有这门语言。 随着时代的…

递归解析 LXML 树并避免重复进入某个节点

1、问题背景 我们在使用 LXML 库解析 MathML 表达式时,可能会遇到这样一个问题:在递归解析过程中,我们可能会重复进入同一个节点,导致解析结果不正确。例如,我们希望将以下 MathML 表达式解析为 Python 表达式&#x…

【数据结构初阶】--- 栈和队列

栈 栈的定义 栈:只允许在一端进行插入或删除的操作 事实上,线性表和链表都可以实现栈,但栈的特点更符合用顺序表实现 顺序表的队尾相当于栈顶,对栈放入数据,相当于顺序表的下标arr[index] x,而栈弹出数…

什么是无头浏览器以及其工作原理?

如果您对这个概念还不熟悉,那么使用无头网络浏览器的想法可能会让您感到不知所措。无头浏览器本质上与您熟悉的网络浏览器相同,但有一个关键区别:它们没有图形用户界面 (GUI)。这意味着没有按钮、选项卡、地址栏或视觉显示。 相反&#xff0c…

硬盘几个关键指标你一定要知道!

硬盘是数据中心中存储数据的重要部件,其关键指标影响硬盘的性能、可靠性和适用性。以下是一些常见的硬盘关键指标,并附上详细解释和举例: 容量(Capacity) 解释:硬盘的容量指其能存储数据的总量,…

CPN Tools学习——时间和队列【重要】

-Timed Color Sets 时间颜色集 -Token Stamps 令牌时间戳 -Event Clock 全局/事件/模拟时钟 -Time Delays on Transitions过渡的时间延迟 - List Color Set列表颜色集 - Queue排队 1.时间颜色集 在定时CPN模型令牌中有: (1)象征性的颜…

银河麒麟系统项目部署

使用服务器信息 软件:VMware Workstation Pro 虚拟机:ubtun 内存:20G 虚拟机连接工具: MobaXterm Redis连接工具: RedisDesktopManager 镜像:F:\Kylin-Server-10-8.2-Release-Build09-20211104-X86_64…

js: 百度云BOS 分片上传

百度云BOS存储后怎么查看或下载呢? // 1) 查看登录到百度智能云控制台 – 对象存储BOS”服务–选择一个Bucket,进入后可以查看该Bucket下的所有文件和文件夹。 2)下载OS浏览器端不支持批量下载,可以通过以下方式下载文件(使用BOS桌…

WindTerm使用SSH密钥连接阿里云实例,服务器设置SSH密钥登录

安装Windterm 地址https://github.com/kingToolbox/WindTerm/releases 下载完放到文件夹就可以打开 阿里云开启密钥对 打开阿里云ecs控制台 https://ecs.console.aliyun.com/keyPair/region/cn-wulanchabu 网络与安全->密钥对,创建密钥对,创建成…

记一次 .NET某工控视觉自动化系统 卡死分析

一:背景 1. 讲故事 今天分享的dump是训练营里一位学员的,从一个啥也不会到现在分析的有模有样,真的是看他成长起来的,调试技术学会了就是真真实实自己的,话不多说,上windbg说话。 二:WinDbg …

hbase安装部署

1,下载依赖包 最近的版本下载镜像 https://mirrors.aliyun.com/apache/hbase/ 比较旧的版本下载 https://archive.apache.org/dist/hbase 2,解压压缩包 3,更改配置 3-1 修改hbase-env.sh 必须加 JAVA_HOME export JAVA_HOME/usr/jdk64/jdk…

前端技术回顾系列 11|TS 中一些实用概念

在微信中阅读,关注公众号:CodeFit。 创作不易,如果你觉得这篇文章对您有帮助,请不要忘了 点赞、分享 和 关注 我的公众号:CodeFit,为我的持续创作提供动力。 上文回顾:泛型在类和接口中的应用 上一篇文章我们回顾了 泛型 在 类 和 接口 中的应用。 通过使用泛型,我们…

动态规划-简单多状态dp问题 -- 按摩师

动态规划-简单多状态dp问题 – 按摩师 文章目录 动态规划-简单多状态dp问题 -- 按摩师题目重现算法流程示例代码 题目重现 题目链接:按摩师 - 力扣 一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时…

IINA for Mac v1.3.5 音视频软件 安装教程(保姆级)

Mac分享吧 文章目录 效果一、准备工作二、开始安装1、双击运行软件,将其从左侧拖入右侧文件夹中,等待安装完毕2、应用程序显示软件图标,表示安装成功 三、运行测试1、打开软件,测试2、查看版本号 **安装完成!&#xf…

C#——结构体详情

结构体 结构体也被称为结构类型(“structure type”或“struct type”),它是一种可封装数据和相关功能的值类型,在语法上结构体与类(class)非常相似,它们都可以用来封装数据,并且都…

【C语言】递归复杂度与链表OJ之双指针

【C语言】递归复杂度与链表OJ之双指针 🔥个人主页:大白的编程日记 🔥专栏:数据结构 文章目录 【C语言】递归复杂度与链表OJ之双指针前言一.递归复杂度1.1递归时间复杂度1.2递归空间复杂度 二.链表OJ之双指针2.1倒数第K个节点2.2链…

FastJson与JackSon 的碰撞。服务发送方与服务接收方字段不一致问题

情景再现 对接文档人家要求字段为 于是乎 咱就在服务的发送方定义参数字段为 服务接收方接收的类型为 later。。。。。 服务接收方接收到的参数字段 就不变成了fOrgId。跟外部系统对接就提示参数错误 原因 :lombok 在做set get的时候自动 无论你字段的首字母是大…

我与Python的一夜情

期末突击看这篇才够味! 环境搭建 首先就是相关工具的安装,直接搜就好,但是还是贴个网址吧: Welcome to Python.orghttps://www.python.org/ 然后就是根据自己的系统选择咯: 谁能闲来无事送我个mac玩玩 Windows的一…

哈喽GPT-4o——对GPT-4o 写论文的思考与看法

目录 几小时即可完成一份1万字论文的编写1、改写降重2、同义词替换降重3、避免连续相同4、缩写扩写降重5、关键词汇替换降重6、句式变换降重7、逻辑重组8、综合改写9、数据呈现方式变更10、概念解释降重 大家好,我是哪吒。 在ChatGPT4o对话框中输入:写一…

遥控玩具车电机驱动应用中的双H桥驱动芯片

遥控玩具车的基本工作原理是通过无线电遥控器发送信号,这些信号被玩具车内的接收器接收并解码,从而控制玩具车的运行。根据车身外型的不同,可以分为:普通的私家房车、越野车、货柜车、翻斗车等等。遥控器的操作,如前进…