计算机网络:网络层 - 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.mfbz.cn/a/703138.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

服务架构的设计原则

墨菲定律与康威定律 在系统设计的时候,可以依据于墨菲定律 任何事情都没有表面上看起来那么简单所有的事情都会比你预计的时间长可能出错的事总会出错担心的某一个事情的发送,那么它就更有可能发生 在系统划分的时候,可以依据康威定律 系…

【QT5】<知识点> QT常用知识(更新中)

目录 一、更改文本颜色和格式 二、QT容器类 三、字符串与整数、浮点数之间的转换 四、QString常用功能 五、SpinBox的属性介绍 六、滑动、滚动、进度条和表盘LCD 七、时间、日期、定时器 一、更改文本颜色和格式 动态设置字体粗体:QFont对象的setBold方法动态…

5.在Nginx中管理目录并允许浏览器中浏览和下载目录的文件

nginx.conf文件配置 charset utf-8; 防止文件名称为乱码。 autoindex on; 开启目录列表展示。 root /usr/local/software; 文件管理目录,浏览器浏览文件所在目录。

C++|哈希应用->位图

目录 一、概念 1.1原理分析: 1.2效率分析: 二、模拟实现 2.1位图框架初始化空间 2.2映射 2.3清零 2.4判断 2.5测试代码 三、位图扩展应用 一、概念 位图,本质上也是一个数组,通过哈希思想构造的一种数据结构&#xff0c…

每日复盘-202406012

今日关注: 这几天市场打板情绪环境转好,轻仓试错 20240612 六日涨幅最大: ------1--------605258--------- 协和电子 五日涨幅最大: ------1--------605258--------- 协和电子 四日涨幅最大: ------1--------301036--------- 双乐股份 三日涨幅最大: --…

vuInhub靶场实战系列--Kioptrix Level #4

免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关。 目录 免责声明前言一、环境配置1.1 靶场信息1.2 靶场配置 二、信息收集2.1 主机发现2.1.1 netdiscover2.1.2 arp-scan主机扫描 2.2 端口扫描2.3 指纹识别2.4 目…

大模型 - Langchain-Chatchat小白本地部署踩坑血泪史

环境介绍 windows 11python 3.9.9显卡 GTX970 4G显存 (可怜巴巴)内存 24G 一、下载 Langchain-Chatchat 注意:这里先不要执行依赖下载,如果项目是通过 PyCharm 打开,就不要着急下载依赖,跟着往下面走&am…

Linux基础IO【II】

今天,我们接着在上一篇文章的基础上,继续学习基础IO。观看本文章之前,建议先看:Linux基础IO【I】,那,我们就开始吧! 一.文件描述符 1.重新理解文件 文件操作的本质:进程和被打开文件…

Linux crontabs定时执行任务

文章目录 前言一、安装二、服务1. 启动crond服务2. 关闭crond服务3. 重启crond服务4. 设置crond开机启动5. 禁用crond开机启动6. 查看crond是否开机启动7. 重新载入配置8. 查看crond运行状态 三、使用1. 查看当前用户的crontab2. 编辑用户的crontab3. 删除用户的crontab的内容 …

Python第二语言(十、Python面向对象(上))

目录 1. 标记变量的基础类型 2. 初识对象 2.1 使用对象组织数据 3. 成员变量 3.1 类和类成员的定义 3.2 成员变量和成员方法使用 3.3 成员方法的定义语句 4. 类和对象class Clock: def ring(self): 4.1 创建类对象的语法:对象名 类名称() 4.2 用生活中的…

访问方法(反射)

文章目录 前言一、访问成员方法的方法二、Method类 1.常用方法2.实操展示总结 前言 为了实现在某类中随时可以调用其他类的方法,java.lang.reflect包中提供了Method方法类来实现该效果。每一个Method对象代表着一个方法,利用Methoc对象可以操纵相应的方法…

【需求设计】软件概要设计说明怎么写?概要设计说明书实际项目案例(63页Word直接套用)

软件概要设计说明书书写要点可以归纳为以下几个方面,以确保文档的准确性、完整性和可读性: 引言 目的:介绍编写该文档的目的、主要内容及目标读者。 背景:说明被开发软件的名称、项目提出者、开发者等背景信息。 需求概述&#xf…

【FreeRTOS】创建第一个多任务程序

创建第1个多任务程序 韦东山 Freertos学习 第一个多任务程序创建 1. 目标 创建两个任务,任务A运行Led_Test,任务B运行LCD_Test。 硬件平台:DShanMCU-F103开发板 2. 接口函数 创建任务的API函数 不同操作系统有不同的创建API函数 FreeRTOS&…

全网首发-Docker被封后的代理设置教程

最近上交、科大以及阿里的一些docker镜像,好像都因为不可控力导致无法访问。 所以,之前好多正常的一些镜像的打包都会报错: 比如: #1 [internall load build definition from Dockerfile#1transferring dockerfile:972B done#1 D…

5.2 参照完整性

5.2.1 外键约束 语法格式&#xff1a;constraint < symbol > foreign key ( col_nam1[, col_nam2... ] ) references table_name (col_nam1[, col_nam2...]) [ on delete { restrict | cascade | set null | no action } ] [ on update { restrict | cascade | set nu…

水帘降温水温

不同环境下的水帘啊&#xff0c;使用水温是不一样的&#xff0c;夏天使用水疗的水有两种&#xff0c;一个是常温的循环水&#xff0c;20~26左右&#xff0c;另外一个呢&#xff0c;就是深井水&#xff0c;重点是啥呢&#xff1f;就是无论我们用哪一种&#xff0c;能够把温度降到…

新版Win11强制开启Bitlocker已实锤,难道真就治不了它了?(含自制工具下载)

网管小贾 / sysadm.cc 满院芳草绿&#xff0c;几树梨花香。 如此大一座院落中&#xff0c;唯范贤一人正自斟自饮悠闲地品着茶。 忽闻得一阵微风拂面&#xff0c;似乎有人在呼喊他…… “哥……哥㖿……原来你在这儿啊……哎哟……” 范贤转过脸去&#xff0c;正想看看来者何…

【虚拟现实】二、主要的AR/VR硬件设备

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 2.1 微软HoloLens 微软HoloLens是一款领先的混合现实设备&#xff0c;结合了AR和VR的元素&#xff0c;允许用户…

计算机科学(学习笔记三)

内容来源&#xff1a;计算机科学 指令和程序 指令&#xff1a;指示计算机要做什么的代码&#xff0c;多条指令共同组成程序。 计算机指令长度 由于早期计算机每个字只有8位&#xff0c;指令只占4位&#xff0c;意味着只能有16个指令&#xff0c;这远远不够。 现代计算机有两…

北交字节联合提出ClassDiffusion: 使用显式类别引导的一致性个性化生成。

在个性化生成领域, 微调可能会引起过拟合导致模型无法生成与提示词一致的结果。针对这个问题&#xff0c;北交&字节联合提出ClassDiffusion&#xff0c;来提升个性化生成的一致性。 通过两个重要观察及理论分析提出了新的观点:一致性的损失是个性化概念语义偏移导致的, 还…