详解 ipv4 数据报头格式

2024-04-23 14:18
文章标签 数据 详解 报头 格式 ipv4

本文主要是介绍详解 ipv4 数据报头格式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ipv4 头部数据格式

在这里插入图片描述
IPv4数据报,头部大小可变,4位的IHL字段被限制为15个32位字(60)字节。一个典型的IPv4头部包含20字节。源地址和目的地址的长度位32位。第二个32位字的大部分用于IPv4分片功能。头部校验和有助于确保头部字段被正确发送到目的地。

在这里插入图片描述

版本(Version)

版本字段指定了IP数据报中使用的IP协议版本,占四位。如国协议是IPV4,则值为0100。

头部长度(Header Length)

头部长度字段指示IP数据报头部的总长度,IP数据报头部的总长度以4字节为单位,该字段占4位。当报头中无选项字段时,报头的总长度为5,也就是5×4=205×4=20字节(此时,报头长度的值为0101)。这就是说IP数据报头部固定部分长度为20字节。当IP头部长度为1111时,头部的固定长度为15×4=6015×4=60字节。但报头长度必须是32位(四字节)的整数倍,如果不是,需要在选项字段的填充(PAD)字段中补0凑齐。

区分服务(Differentialted Services)

最开始IP数据报的这个字段为优先级和服务类型字段,又称为服务类型(ToS)字段,用于表示数据报的优先级和服务类型,占八位。它包括一个3位长度的优先级、4位长度的标志位。标志位分别是D(Delay延迟)、T(Throughput吞吐量)、R(Reliability可靠性)和C(Cost开销),分别表示延迟、吞吐量、可靠性和开销值,用来获得更好的服务。最高1位未用。
1998年IETF在RFC2474中把IP数据报中ToS字段改名为服务字段,同样为8位,前6位构成DSCP(Different Services Code Point,区分服务码点),是IP优先级和服务类型字段的组合,定义了0~63共64个优先级。最后两位未使用。无论是哪种版本,该字段只有在使用区分服务时才起作用,如果没有区分服务,则该字段值为0。

总长度(Total Length)

总长度字段标识整个IP数据报的总长度,包括报头和数据部分,整个IP数据报的总长度以字节为单位,该字段占16位。由此可得出,IPv4数据报的最大长度为216−1216−1字节即65535字节(64KB)。
说明:在网络层下面的每一种数据链路层都有自己的格式,其中包括表示数据字段的最大长度,这称为最大传送单元(Maximum Transfer Unit,MTU)。当一个数据报封装成链路层的帧时,此数据报的总长度(包括报头和数据部分)一定不能超过下面的数据链路层的MTU值

标识(Identification)

标识字段用于表示IP数据报的标识符,占16位,每个IP数据报有一个唯一的标识符。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给整个标识字段。但整个标识并不是序号,因为IP是无连接服务,数据报不存在按序接受的问题。当数据报由于长度超过下面数据链路层的MTU(最大传输单元)值而必须分段的时候,这个标识符的值就被复制到所有的数据报分段的标识字段中。相同的标识字段的值分段后的各数据报分段最后能正确地组装成原来的数据报。

标志(Flags)

标志字段用以指出该IP数据报后面是否还有分段,也就是这个字段是分段标志,占3位。目前只有前两位有意义:最低位记为MF(More Fragment),如果MF=1,则表示后面还有分段,如果MF=0表示这已是某个数据报的最后一个分段;中间一位记为DF(Don’t Fragment),当DF=1时表示不允许分段,DF=0表示允许分段;最高1位没有使用。

段偏移(Fragment Offset)

段偏移字段用以指出该分段在数据报中的相对位置,也就是说,相对于用户数据字段的起点,该分段从何处开始,占13位。若有分段,段偏移以8字节为偏移单位,即每个分段的长度一定是8字节(64位)的整数倍。第一个分段偏移值就是0 0000 0000 0000,如果第一个分段一共是64字节,则0 0000 0000 1001,相当于10进制数的9,因为从第9个“8字节”数据块开始的。如果没有分段,则该字段值为0。

生存时间(Time To Live)

生存时间字段用来标识IP数据报在网络中传输的有效期,以秒来计数,占8位。最初的设计是以秒为单位,没经过一个路由器时,就在TTL(Time To Live)中减去数据报在路由器消耗掉的一段时间。若数据报在路由器消耗的时间小于1s,就把TTL值减1。TTL的建议值是32s,最长是28−1=25528−1=255s。现在通常认为这个TTL是指数据报允许经过的路由器数,每经过一个路由器,则TTL减1,当TTL值为0时,就丢弃这个数据报。设定生存时间是为了防止数据报在网络中无限制地循环转发。

协议(Protocol)

协议字段用来标识此IP数据报在传输层所采用的协议类型(如TCP、UDP或ICMP等等),以便使目的主机的IP层直到应将数据部分上交给哪个处理过程,占8位。如TCP的协议号是6,等于二进制的0000 1010,UDP的协议号是17,等于二进制的0001 0001。

校验和(Checksum)

校验和字段用来检验IP数据报的报头部分(不包括“数据”部分)在传输端到接收端后是否发生了变化,占16位。这是因为数据报每经过一个路由器,路由器都要重新计算一下报头检验和(因为一些字段,如生存时间、标识、段偏移等都可能发生变化),不检验数据部分可减少计算的工作量。

检验和的计算方法

利用校检和字段检验报头部分数据正确性的基本原理是:先在发送端校检和字段中填上一个特定的值,然后在接收端把包括校检和字段在内的报头部分进行二进制反码求和,再取反,如果结果为0,则表示报头部分在传输过程中没有发生变化,否则表示在传输过程中出现了差错。从以上可以看出,这里最关键的是在发送端计算出这个校检和的值。步骤如下:

  1. 把IP数据报报头中的校检和字段置0。
  2. 把头部看成由16位(2字节)为单位的数字组成,对每16位的二进制反码进行求和。如报头长度不是16位的整数倍数,则用0填充到16位的整数倍数。若此时校验和字段值为0,可以不计,因为0的反码仍为0。
  3. 以上得到的结果就是我们要求的校验和字段值,系统自动将其填入IP数据报报头的检验和字段中。
  4. 在接收端中,同样按照以16位为单位,对IP数据报报头部分进行二进制反码求和,再取反,如果结果为0,表示报头部分在传输过程中没有发生变化,否则表示发生了差错。但要注意,此时因位校验和字段已不再是0了,而是等于除了检验和字段外的其他字段的反码之和。现在在对校验码和字段值取反求和,再与其他字段的反码之和(相当于原来“校验和”字段的值)相加,结果肯定是全为1,因为这两个值互为反码;再取反后,结果肯定为0。这就是校验和的基本原理。

例子

假设有3个数(为了简便,在此均用4位表示):2(0010)、3(0011)、C(代表校验和字段值),计算C,即求2和3的反码之和,得到9(1001)。现在假设把这3个数(2,3,C)传送到接收端。在接收端也要对这3个数进行反码求和。因为2和3这两个的反码之和我们在计算C时已经计算过了,就是9(1001),现在只需要对C(校验和字段值)进行求反,得到6(0110)。把1001和0110相加,得到15(1111)。再取反,得到0(0000)。这就是这3个数在传输过程中没有出现差错的情况下得到的,这就是校验和的校验原理。
源地址/目的地址(Source Address/Destination Address)

源地址/目的地址这两个字段分别表示该IP数据报发送者和接受者的IP地址,各占32位。在这个数据报传送过程中,无论经过什么路由,无论如何分段,此两字段一直保持不变。

选项(Option)

选项字段支持各种选项,提供扩展余地。根据选项的不同,该字段时可变长,从1字节到40字节。用来支持拍错、测量以及安全等措施。作为选项,用户可以使用,也可以不使用它们。但作为IP协议的组成部分,所有实现IP协议的设备都必须能处理IP选项。在使用选项的过程中,如果造成了IP数据报的报头不是32位的整数倍,这时需要后面的填充字段凑齐。如果恰好是整数倍,则不需要填充字段。

这篇关于详解 ipv4 数据报头格式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/929025

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Java中的.close()举例详解

《Java中的.close()举例详解》.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,:本文主要介绍Java中的.... 目录当你遇到以下三种情况时,一定要记得使用 .close():用法作用举例如何判断代码中的 input