计算机网络:网络层 - 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.rhkb.cn/news/348133.html

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

相关文章

大型语言模型(LLMs)的后门攻击和防御技术

大型语言模型(LLMs)通过训练在大量文本语料库上,展示了在多种自然语言处理(NLP)应用中取得最先进性能的能力。与基础语言模型相比,LLMs在少样本学习和零样本学习场景中取得了显著的性能提升,这得…

----几种接口的使用---

Compareable接口 对于给数组中的变量成员排序,我们能想到用sort,根据成员之间的大小进行排序,那么如果数组中的成员是对象的话,单单只是用sort去排序肯定是步成功的,因为并不知道要根据什么去排序, 这时要…

【漏洞复现】海洋CMS /js/player/dmplayer/dmku/ SQL注入漏洞复现(CVE-2024-29275)

0x01 产品简介 海洋CMS是一套专为不同需求的站长而设计的内容管理系统,灵活、方便、人性化设计、内容的专业网站。海洋CMS基于PHPMySql技术开发,完全开源免费、无任何加密代码。简单易用是最大的特色,可快速建立一个海量 0x02 漏洞概述 海…

虚拟机开启网络代理设置

前言: 不管是物理主机还是实验环境中的VMware虚拟机,有时候总要访问一些镜像网站或者资源网站拉取一些学习资料,但由于国内外网络环境的差异和网络安全的问题。总是会被阻拦。物理机相对比较容易一些,今天我们来说一说虚拟机应该…

SpringBoot+Vue网上购物商城系统(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 系统角色对应功能 用户商家管理员 系统功能截图

Java面试八股之构造方法有哪些特性

构造方法有哪些特性 方法名与类名相同:构造方法的名称必须与它所在的类名称完全相同,包括大小写。 无返回类型:构造方法没有返回类型声明,连void也不需要。虽然没有明确的返回类型,但它隐式地返回了新创建的实例的引…

C语言调用so/dll动态库

文章目录 windows系统linux系统windows 与 linux下 C 调用动态库的差异 C语言调用动态链接库 windows系统 windows系统下&#xff0c;C语言调用win下的动态库dll&#xff0c;使用头文件<windows.h>。 准备基础C代码 lauf.c #include <stdio.h>// 定义函数&#x…

Hbase布隆过滤器

Hbase布隆过滤器 说在前面 重要思想&#xff1a; 1.时间换空间&#xff1a;降低内存使用率 --> 降低数据查询时间 2.空间换时间&#xff1a;提高数据查询速率 --> 保存在内存中

Web前端大作业:基于html+css+js的仿淘宝首页前端项目(内附源码)

文章目录 一、项目介绍二、项目展示三、源码展示四、源码获取 一、项目介绍 这个项目是一个Web前端大作业,目的是让学生们通过实践仿设计淘宝官网的前端页面,来全面锻炼他们的HTML、CSS和JavaScript编程能力,以及产品需求分析、界面设计、交互设计等软实力。 淘宝作为国内最大…

UML交互图-协作图

概述 协作图和序列图都表示出了对象间的交互作用&#xff0c;但是它们侧重点不同。序列图清楚地表示了交互作用中的时间顺序&#xff0c;但没有明确表示对象间的关系。协作图则清楚地表示了对象间的关系&#xff0c;但时间顺序必须从顺序号获得。序列图常常用于表示方案&#…

Springboot 开发-- 集成 Activiti 7 流程引擎

引言 Activiti 7是一款遵循BPMN 2.0标准的开源工作流引擎&#xff0c;旨在为企业提供灵活、可扩展的流程管理功能。它支持图形化的流程设计、丰富的API接口、强大的执行引擎和完善的监控报表&#xff0c;帮助企业实现业务流程的自动化、规范化和智能化。本文将为您详细介绍 Ac…

JVM的几种常见垃圾回收算法

引言&#xff1a; Java Virtual Machine&#xff08;JVM&#xff09;作为Java程序运行的核心&#xff0c;其垃圾回收&#xff08;Garbage Collection, GC&#xff09;机制在内存管理中起着至关重要的作用。垃圾回收算法是JVM性能优化的重要方面。本文将详细介绍几种常见的垃圾回…

【网络安全的神秘世界】磁盘空间告急?如何解决“no space left on device”的困扰

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 磁盘空间告急&#xff1f;如何解决“no space left on device”的困扰 &#x1f64b;‍♂️问题描述 错误信息 "write /var/lib/docker/tmp/GetIma…

【文档智能】包含段落的开源的中文版面分析模型

github&#xff1a;https://github.com/360AILAB-NLP/360LayoutAnalysis 权重下载地址&#xff1a;https://huggingface.co/qihoo360/360LayoutAnalysis 一、背景 在当今数字化时代&#xff0c;文档版式分析是信息提取和文档理解的关键步骤之一。文档版式分析&#xff0c;也…

iOS--oc对象,类,和元类本质

iOS--oc对象&#xff0c;类&#xff0c;和元类本质 前言实例对象的具体结构自定义类对象的结构继承关系 类信息的存放对isa、superclass总结 前言 最近在学习runtime的过程中&#xff0c;发现其中消息发送-动态方法解析-消息转发中涉及到了大量的类与对象的底层知识&#xff0…

Comfyui容器化部署与简介

目前使用 Stable Diffusion 进行创作的工具主要有两个&#xff1a;Stable Diffusion WebUI 和 ComfyUI。本文重点介绍ComfyUI的部署使用。 ComfyUI 可定制性很强&#xff0c;可以让创作者搞出各种新奇的玩意&#xff0c;通过工作流的方式&#xff0c;也可以实现更高的自动化水平…

录屏快捷键在哪?3个快捷键,教会你快速录屏

在数字化时代&#xff0c;录屏功能已经变得日益重要&#xff0c;无论是工作汇报、教学演示还是游戏分享&#xff0c;我们都需要借助录屏工具来捕捉屏幕上的精彩瞬间。而录屏快捷键&#xff0c;作为一种高效的录屏操作方式&#xff0c;能够极大地提升我们的录屏效率。那么&#…

echarts地图添加外边框(散乱地图块添加区域边界线)

需求&#xff1a; 蓝色边是街道地图&#xff0c;也是实际有用的地图&#xff0c;可以点击拖动之类&#xff0c;由于太散乱&#xff0c;现在增加一个灰色边表示外面区县&#xff08;不可点击&#xff09;&#xff0c;让他看起来是一个整体 下面这个图是我最后做出来的案例 难…

JavaWeb6 Tomcat+postman请求、响应

Web服务器 对HTTP协议操作进行封装&#xff0c;简化web程序开发 部署web项目&#xff0c;对外提供网上信息浏览服务 Tomcat 轻量级web服务器&#xff0c;支持servlet&#xff0c;jsp等少量javaEE规范 也被称为web容器&#xff0c;servlet容器 Springboot有内置Tomcat nginx…

阅文集团CEO侯晓楠:建立10亿生态扶持基金,为好内容搭建舞台

6月12日&#xff0c;由安徽省文化和旅游厅、安徽省文学艺术界联合会、黄山市人民政府指导&#xff0c;阅文集团、黄山旅游发展股份有限公司主办的2024阅文创作大会在黄山召开。 据「TMT星球」了解&#xff0c;大会总结了过去一年阅文在“AIIP”业务升级思路下创作生态和IP领域…