计算机网络:网络层 —— IPv4 数据报的首部格式

news2024/11/7 9:34:10

文章目录

      • IPv4数据报的首部格式
        • IPv4数据报分片
        • 生存时间 TTL字段
        • 协议字段
        • 首部检验和字段

IPv4数据报的首部格式

IPv4 数据报的首部格式及其内容是实现 IPv4 协议各种功能的基础。

TCP/IP 标准中,各种数据格式常常以32比特(即4字节)为单位来描述

![[IPv4数据报的首部格式.png]]

  • 固定部分:每个 IPv4 数据报都必须要包含的部分

  • 某些 IPv4 数据报的首部,除了包含 20 字节的固定部分,还包含一些可选的字段来增加 IPv4 数据报的功能

  • 版本:长度为 4 个比特,用来表示 IP 协议的版本,通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议的版本号为4(即IPv4)

  • 首部长度:长度为4个比特,该字段的取值以4字节为单位,用来表示IPv4数据报的首部长度(总是4的整数倍)。

    • 最小取值为二进制的 0101,即十进制的5,再乘以4字节单位,表示IPv4数据报首部只有20字节固定部分

    • 最大取值为二进制的 1111,即十进制的15,再乘以4字节单位,表示IPv4数据报首部包含20字节固定部分和最大40字节可变部分

  • 可选字段:长度从1字节到40字节不等,用来支持排错测量以及安全措施等功能。虽然可选字段增加了 IPv4 数据报的功能,但这同时也使得 IPv4 数据报的首部长度成为可变的,这就增加了因特网中每一个路由器处理 IPv4 数据报的开销。实际上,可选字段很少被使用

  • 填充:用来确保 IPv4 数据报的首部长度是4字节的整数倍,使用全0进行填充。当首部长度(20字节固定部分+可变部分)的长度不是 4字节 整数倍时,填充相应数量的全0字节,以确保 IPv4 数据报的首部长度是 4字节 的整数倍。

  • 区分服务长度为 8 个比特,用来获得更好的服务该字段在旧标准中叫作服务类型,但实际上一直没有被使用过。1998年,因特网工程任务组IETF把这个字段改名为区分服务。利用该字段的不同取值可提供不同等级的服务质量。只有在使用区分服务时该字段才起作用,一般情况下都不使用该字段

  • 总长度长度为16个比特,该字段的取值以字节为单位,用来表示IPv4数据报的长度(首部长度+数据载荷长度)。最大取值为二进制的 16 个比特1,即十进制的65535(很少传输这么长的IPv4数据报)

  • 源IP地址:长度为32比特,用来填写发送 IPv4 数据报的源主机的 IPv4 地址。

  • 目的IP地址:长度为32比特,用来填写接收 IPv4 数据报的目的主机的 IPv4 地址。

IPv4数据报分片

IPv4 数据报中的标识标志片偏移部分,共同用于IPv4数据报分片

![[IPv4数据报分片.png]]

当 IPv4 数据报长度超过 MTU(最大传输单元,Maximum Transmission Unit) 时,无法封装成帧,需要将原 IPv4 数据报分片为若干个更小的IPv4数据报,再将分片后的IPv4数据报封装成帧

  • 标识长度为 16 个比特,属于同一个IPv4数据报的各分片数据报应该具有相同的标识。IP 软件会维持一个计数器,每产生一个 IPv4 数据报,计数器值就加1,并将此值赋给标识字段。

  • 标志

    • 最低位(More Fragment,MF)

      • MF = 1,表示本分片后面还有分片
      • MF = 0,表示本分片后面没有分片
    • 中间位(Don’t Fragment,DF)

      • DF = 1,表示不允许分片
      • DF = 0,表示允许分片
    • 最高位为保留位,必须设置为0

  • 片偏移长度为13个比特,该字段的取值以8字节为单位,用来指出分片IPv4数据报的数据载荷偏移其在原IPv4数据报的位置有多远

某个 IPv4 数据报总长度为 3820 字节,采用 20 字节固定首部,根据数据链路层要求,需要将该 IPv4 数据报分片为长度不超过 1420 字节的数据报片:

![[IPv4数据报分片例.png]]

  1. 确定原始数据报的大小:原始 IPv4 数据报的总长度是 3820 字节。其中包括 20 字节的 IP 首部。

  2. 计算有效载荷的大小有效载荷的大小 = 总长度 - IP首部长度 = 3820 - 20 = 3800 字节。

  3. 确定每个分片的最大大小:根据题目要求,每个分片的大小不能超过 1420 字节。每个分片包含 20 字节的 IP 首部和最多 1400 字节的有效载荷。

  4. 计算所需的分片数量

    • 第一分片:从第 0 到第 1399 字节(共1400字节)
    • 第二分片:从第 1400 到第 2799 字节(共1400字节)
    • 第三分片:从第 2800 到第 3799 字节(共1000字节)
  5. 设置分片信息

    • 分片标识 (Identification):保持不变,设为 23333。

    • MF标志位 (More Fragments):除最后一个分片外的所有分片都设为1,表示还有更多分片。最后一个分片设为0。

    • DF标志位 (Don’t Fragment):所有分片都设为0,因为已经进行了分片操作。

    • 片偏移 (Fragment Offset):以8字节为单位,第一个分片为0,第二个分片为 1400 8 = 175 \frac{1400}8 = 175 81400=175 第三个分片为 2800 8 = 350 \frac{2800}8 = 350 82800=350

  6. 总结分片信息

分片编号总长度(字节)标识MFDF片偏移
120 + 140023333100
220 + 14002333310175
320 + 10002333300350

通过以上步骤,我们可以将原始的 3820 字节 IPv4 数据报成功地分成三个符合要求的分片。

生存时间 TTL字段

生存时间(Time To Live,TTL):长度为 8 个比特,最大取值为二进制的11111111,即十进制的 255。该字段的取值最初以秒为单位。因此,IPv4 数据报的最大生存时间最初为 255 秒。路由器转发 IPv4 数据报时,将其首部中该字段的值减去该数据报在路由器上所耗费的时间,若结果不为 0 就转发,否则就丢弃。

生存时间字段后来改为以“跳数”为单位路由器收到待转发的IPv4数据报时,将其首部中的该字段的值减1,若结果不为0就转发,否则就丢弃

生存时间字段可以防止被错误路由的IPv4数据报无限制地在因特网中兜圈

![[生存时间 TTL字段.png]]

协议字段

协议长度为8个比特,用来指明 IPv4 数据报的数据载荷是何种协议数据单元PDU

常用的一些协议和相应的协议字段值

协议名称协议字段值
ICMP1
IGMP2
TCP6
UDP17
IPv641
OSPF89
首部检验和字段

首部检验和长度为16个比特,用于检测 IPv4 数据报在传输过程中其首部是否出现了差错。IPv4数据报每经过一个路由器,其首部中的某些字段的值(例如生存时间 TTL、标志以及片偏移等)都可能发生变化,因此路由器都要重新计算一下首部检验和。

首部检验和的计算方法:

![[首部检验和的计算方法.png]]

上述检验和的计算方法不仅用于IP协议,还用于运输层的用户数据报协议 UDP 和传输控制协议 TCP,常被称为因特网检验和(Internet Checksum)。这种检验和的检错性能虽然不如 CRC 循环冗余校验,但更易用软件实现。

首部检验和计算的重点在于二进制反码求和的运算,两个数进行二进制反码求和的运算规则是从低位到高位逐列进行计算:

  • 0 和 0 相加是 0
  • 0 和 1 相加是 1
  • 1 和 1 相加是 0,但要产生一个进位 1,加到下一列
  • 若最高位相加后产生进位,则最后得到的结果要加 1
  • 将最终结果取反码,得到检验和。

由于网际层并不向其高层提供可靠传输的服务,并且计算首部检验和是一项耗时的操作,因此在 IPv6 中,路由器不再计算首部检验和,从而更快转发IP数据报

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

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

相关文章

基于SSM演出道具租赁系统的设计

管理员账户功能包括:系统首页,个人中心,用户管理,商家管理,道具类型管理,道具出租管理,租赁订单管理,道具归还管理,系统管理 商家账号功能包括:系统首页&…

《使用Gin框架构建分布式应用》阅读笔记:p272-p306

《用Gin框架构建分布式应用》学习第15天,p272-p306总结,总35页。 一、技术总结 1.TDD(test-driven development) 虽然经常看到TDD这个属于,从本人的工作经历看,实际开发中用得相对较少。 2.unitest(单元测试) go语言开发中&a…

三种SPI机制的了解及使用

文章目录 1.SPI机制概念2.Java SPI2.1 创建一个项目,并创建如下模块2.2 db-api模块2.3 mysql-impl模块2.4 oracle-impl模块2.5 main-project模块 3.Spring SPI4.Dubbo SPI 1.SPI机制概念 SPI全程Service Provider Interface,是一种服务发现机制。 SPI的…

【Linux系统编程】第四十弹---深入理解操作系统:信号捕捉、可重入函数、volatile关键字与SIGCHLD信号解析

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、捕捉信号 1.1、内核如何实现信号的捕捉 1.2、内核态与用户态 1.3.1、用户态(User Space) 1.3.2、…

【面试】数组中 Array.forEach()、Array.map() 遍历结束后是否改变原数组

forEach 、map 同理 数组内元素是 基本数据类型 时, 1.1. 直接给 item赋值,是 不会改变原数组 的(如图中1), 1.2. 通过 原数组索引赋值 是会改变原数组的(如图中2)数组内元素是 复杂数据类型 时…

List<T>属性和方法使用

//author:shark_ddd using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;//使用函数来减少长度namespace List_T {class Student{public string Name { get; set; }public int Age { get; set; …

liunx CentOs7安装MQTT服务器(mosquitto)

查找 mosquitto 软件包 yum list all | grep mosquitto出现以上两个即可进行安装,如果没有出现则需要安装EPEL软件库。 yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm查看 mosquitto 信息 yum info mosquitto安装 mosquitt…

视频去水印软件哪个好?这些软件值得一试

无论是社交媒体上的短视频,还是专业网站上的长视频,去除视频中的水印成为了许多人的需求。 选择一款合适的视频去水印软件,可以帮助我们轻松去除视频中的不必要标记,保持视频的完整性和美观。 那么,视频去水印软件哪…

qt QDoubleSpinBox详解

1、概述 QDoubleSpinBox是Qt框架中的一个控件,专门用于浮点数(即小数)的输入和调节。它提供了一个用户界面元素,允许用户在预设的范围内通过拖动滑块、点击箭头或使用键盘来递增或递减浮点数值。QDoubleSpinBox通常用于需要精确数…

在基于AWS EC2的云端k8s环境中 搭建开发基础设施

中间件下载使用helm,这里部署的都是单机版的 aws-ebs-storageclass.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata:name: aws-ebs-storageclass provisioner: kubernetes.io/aws-ebs parameters:type: gp2 # 选择合适的 EBS 类型,如 gp2、io1…

MATLAB与STK互联:仿真并获取低轨卫星与指定区域地面站的可见性数据

MATLAB控制STK实现:仿真并获取低轨卫星与指定区域地面站的可见性数据 本次仿真主要参考了多篇文献和网站,包括但不限于:《Using MATLAB for STK Automation》、CSDN博文: 拜火先知的博客_CSDN博客-笔记、AGI官网有关MATLAB的内容…

docker engine stopped

1)环境:win 10 2)docker安装时已经已经安装了虚拟机 3)启用网络适配器 4)启用docker服务(依赖服务LanmanServer) 5)全都弄好了,docker还是打不开,没办法了&a…

天翼网关 3.0 兆能 ZNHG600 获取超级密码改桥接

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 前不久朋友家断网,喊了宽带师傅修完之后,光猫就从桥接模式变成了路由模式。虽然对于日常上网来说区别不大,但这条宽带有公网 IP,通过光猫拨号的话&#xff0…

C语言常见进制 (二进制、八进制、十进制、十六进制)详解

C语言常见进制的详解 放在最前面的前言:1、分类2、二进制(2.1)二进制的解释说明(2.2)关于二进制的计算(2.3) 二进制转换为八进制(2.4) 二进制转换为十进制 3、八进制&…

在 .NET 8 Web API 中实现 Entity Framework 的 Code First 方法

本次介绍分为3篇文章: 1:.Net 8 Web API CRUD 操作.Net 8 Web API CRUD 操作-CSDN博客 2:在 .Net 8 API 中实现 Entity Framework 的 Code First 方法https://blog.csdn.net/hefeng_aspnet/article/details/143229912 3:.NET …

初识动态规划(由浅入深)

🤓 动态规划入门与进阶指南 📘 动态规划(Dynamic Programming, DP)是一种非常经典的📐算法方法,特别适合用来解决那些有大量重复计算的问题🌀。它可以将复杂的问题拆分为小问题🧩&a…

【STM32】SD卡

(一)常用卡的认识 在学习这个内容之前,作为生活小白的我对于SD卡、TF卡、SIM卡毫无了解,晕头转向。 SD卡:Secure Digital Card的英文缩写,直译就是“安全数字卡”。一般用于大一些的电子设备比如:电脑、数码相机、AV…

《JVM第5课》虚拟机栈

无痛快速学习入门JVM,欢迎订阅本免费专栏 Java虚拟机栈(Java Virtual Machine Stack,简称JVM栈,又称Java方法栈)是 JVM 运行时数据区的一部分,主要用于支持Java方法的执行。每当一个新线程被创建时&#xf…

Java Executor RunnableScheduledFuture 总结

前言 相关系列 《Java & Executor & 目录》《Java & Executor & RunnableScheduledFuture & 源码》《Java & Executor & RunnableScheduledFuture & 总结》《Java & Executor & RunnableScheduledFuture & 问题》 涉及内容 《…

软考(中级-软件设计师)数据库篇(1101)

第6章 数据库系统基础知识 一、基本概念 1、数据库 数据库(Database ,DB)是指长期存储在计算机内的、有组织的、可共享的数据集合。数据库中的数据按一定的数据模型组织、描述和存储,具有较小的冗余度、较高的数据独立性和扩展…