IPv4数据报格式及其语义

IPv4数据报格式及其语义

一、IP数据报的格式如下图所示

版本

首部长度

服务类型

数据报长度

16比特标识

标志

13比特片偏移

寿命

上层协议

首部检验和

32比特源IP地址

32比特目的IP地址

选项(如果有的话)

数据

IPv4数据报格式

二、各部分语义

1)版本(号):4bit,规定了数据包的IP协议版本;通过查看版本号,路由器能够确定如何解释IP数据报的剩余部分

2)首部长度:因为IPV4数据报可包含一些可变数量的选项,所以需要用这4bit来确定首部的长度,以确定IP数据报的数据部分实际从哪里开始。大多数IP数据报不包含选项,所以一般IP数据报具有20字节的首部

3)服务类型:8bit,服务类型包含在首部中以使不同类型的IP数据报能相互区分开来,例如,将实时数据报(如用于IP电话应用)与非实时流量(如FTP)区分开来也许是有用,提供特定等级的服务是一个由路由器管理员决定的策略问题

4)数据报长度:这是IP数据报的总长度(首部加上数据),以字节计,因为该字段长为16bit,所以IP数据报的理论最大长度为65535字节,然而数据报很少有超过1500字节的(因为IP数据还要靠数据链路层运输的,而链路层帧能承载的最大数据量为叫做最大运输单元(Maximum Transmission Unit,MTU))

5)标识、标志、片偏移:

  要理解这三个内容,要先理解一些其他知识

  (1)分片:把IP数据报中的数据分成两个或者更多个较小的IP数据报,用单独的链路层帧封装成较小的IP数据报,每个这些较小的数据报称为片

  (2)为什么要分片:因为每个IP数据报封装在链路层帧中从一台路由器传输到下一台路由器,而链路层帧能承载的最大数据量(最大运输单  元(Maximum Transmission Unit,MTU)是一定的,故链路层帧严格限制着IP数据报的长度;而且发送方和与目的路径上的每段链路可能使用不同的链路层协议,且每种协议可能具有不同的MTU,所以就更有可能需要分片了,以便能够使得数据报能够顺利的传递数据报

  (3)组装:目的主机从相同源收到一系列数据报时,需要确定哪些数据报是分片,如果是分片的话,还要进一步指导何时收到最后一个分片,如何将接收到的分片拼接起来以形成初始的数据报,故IPV4的设计者将标识、标志和片偏移字段放在IP数据报首部中,当生成一个数据报时,发送主机为该数据报设置源和目的地址的同时,再填上标识号

标识:16bit,源主机发送IP数据报的时候,通常为它发送的每个数据报的标识号加1,所以当某个路由器需要对某一个数据报分片时,形成的每个数据报(分片)具有初始数据报的源地址、目的地址、与标识号,这样目的主机就可以判别哪些分片是属于一个初始数据报的

标志:3bit,由于IP是一种不可靠服务,一个或者多个片可能永远到不了目的地,所以为了让目的主机绝对的相信它已经收到了初始数据报的最后一个片,最后一个片的标志比特被设置为0,而所有其他片的标志比特被设置为1

片偏移:13bit,标示数据相对于初始数据报的偏移值,并且偏移值应当被规定以8字节块为单位。所以除了最后一个片的所有初始有效载荷数据的数量应当是8字节的倍数

6)寿命:8bit,寿命(Time-To_Live ,TTL )字段是用来确保数据报不会永远(如由于长时间的路由选择环路)在网络中循环,每当数据报由一台路由器处理时,该字段的值减1。若TTL字段减为0,则该数据报必须丢弃。

7)协议:8 bit,该字段仅当一个IP数据报到达其最终目的地才会有用,改字段指示了IP数据报的数据部分应交给哪个特定的运输层协议,如:值为6应该交给TCP,而值为17表示数据部分要交给UDP ,其他可能值查看   https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml

8)首部检验和: 16bit,首部检验和用于帮助路由器检测收到的IP数据报中的比特错误。首部检验和是这样计算的:将首部中的每2个字节当做一个数,用反码运算对这些数求和;具体到发送方或接收方计算如下:

  在发送数据时,为了计算IP数据包的校验和。应该按如下步骤:
  (1)把IP数据包的校验和字段置为0;
  (2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和;
  (3)把得到的结果存入校验和字段中。
     在接收数据时,计算数据包的校验和相对简单,按如下步骤:
  (1)把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段;
  (2)检查计算出的校验和的结果是否等于零(反码应为16个0);
  (3)如果等于零,说明被整除,校验和正确。否则,校验和就是错误的,协议栈要抛弃这个数据包。

路由器要对每个收到的IP数据报计算其首部检验和,如果数据报首部中携带的检验和与计算得到的检验和不一致,则检验出是个差错,路由器一般会丢弃检测出错误的数据报

9)源和目的IP地址:32bit,当某源生成一个数据报时,在这两个字段中插入发送主机的IP地址和目的地的IP地址,通常源主机DNS查找来决定目的地址

10)选项:32bit,选项字段允许IP首部被扩展。首部选项意味着很少使用,因此决定对每个数据报首部不包括选项字段的信息,这样能够节约开销,但是因为有些数据报有选项,有些数据报没有选项,故导致一台路由器处理一个IP数据报所需的时间变化很大。

11)数据(有效荷载):32bit,这是数据报存在的首要理由!大多数情况下,IP数据报中的数据字段包含要交付给目的地运输层报文段(UDP或TCP)

注:注意到一个IP数据报有总长为20字节的首部(假设无选项)如果一个数据报承载一个TCP报文,则每个(无分片的)数据报共承载了总长40字节的首部(20字节的IP数据报加上20字节的TCP首部)以及应用文报文

三、关于标识、标志、片偏移的例子

  假设一个4000字节的数据报(20字节加上3980字节IP数据有效荷载)到达路由器,且必须被转发到一条MTU为1500字节链路上,该如何进行分片?

  答:初始数据报会被分为3个片,其中的每个片也是一个IP数据报,假定该数据报的发送时,主机给予的标识号为777,三个片的特点如下:

字节

ID

偏移

标志

第一片

1480

 

ID=777

Offset=0

Flag=1

第二片

1480

 

ID=777

Offset=185

Flag=1

第三片

1020(3980-1480*2)

ID=777

Offset=370

Flag=0


注:此时就需要4040个字节来运输初始数据报,所以分片是需要开销的

 

 

 

 

 

 

 

 

 

 

posted on 2019-06-24 22:20 初妍 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/alphabetical/p/11079902.html

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

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

相关文章

华景机器人怎么控制_【华景QQ机器人怎么用】华景QQ机器人好不好_使用技巧-ZOL软件百科...

发布日期:2016年02月21日 Release 2 && Release 3新增功能和优化及修复修复严重崩溃问题。全面支持emoji表情。修复某些用户不能登录。轻量级重包处理。优化消息显示。修复一个数组越界错误。修复一个数组下标不能为0错误。加快消息处理速度。UI线程与消息处…

Java命令行界面(第9部分):parse-cmd

parse-cmd库由单个类ParseCmd.java组成,该类是“用于在Java应用程序中定义和解析命令行参数的Java类。” 该库托管在Google Code存档上 ,因此可以随时关闭 。 该JAR似乎也可以在GitHub上使用 。 这篇文章介绍了如何使用parse-cmd 0.0.93处理Java中的命令…

Pytorch--Tensor, Numpy--Array,Python--List 相互之间的转换

1、 Python--List Numpy--Array list = [[1, 2, 4, 8], [0.1, 0.4, 0.9, 0.8]] list_np = np.array(list) print(list_np的维度:,list_np.shape) print(list_np的类型:,type(list_np))运行结果: 2、Python--List Pytorch--Tensor test = [[1, 2, 4, 8], [0.1, 0.4, 0…

Redis的各项功能解决了哪些问题?

Redis是什么 官方简介解释到:Redis是一个基于BSD开源的项目,是一个把结构化的数据放在内存中的一个存储系统,你可以把它作为数据库,缓存和消息中间件来使用。 同时支持strings,lists,hashes,set…

join left semi_HIVE--left semi join

实验:hive> select * from b1;OK1 003 201705111 004 201705121 005 201705132 006 201705143 007 20170515Time taken: 0.041 secondshive> select * from b2;OK1 005 201705132 006 …

java permgen_Java 8:从PermGen到元空间

java permgen您可能已经知道,现在可以下载JDK 8 Early Access 。 这使Java开发人员可以尝试Java 8的某些新语言和运行时功能。这些功能之一是完全删除自Oracle自JDK 7发行以来就宣布的Permanent Generation(PermGen)空间。例如,自…

总结

写在前面 课程名称:软件工程原理及方法 课程链接:https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 作业要求:https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2/homework/3393 团队名称:求莫名堂 请…

Pytorch GRU(详解GRU+torch.nn.GRU()实现)

pytorch GRU 目录 pytorch GRU 一、GRU简介1 二、GRU简介2 三、pytorch GRU 3.1 定义GRU ()

同步装饰器来替换线程安全类

您知道什么是线程安全吗? 如果没有,下面是一个简单的示例。 所有类都必须是线程安全的,对吗? 并不是的。 其中一些必须是线程安全的? 又错了。 我认为它们都不必是线程安全的,而它们都必须提供同步的装饰器…

creo减速器建模实例_3.16减速器箱体附件建模

本节内容主要介绍了减速器箱体附件建模,视频时长24分32秒。本节主要通过阵列,拉伸,孔等命令完成创建,操作时注意孔的类型的选择,以及定位基准的选择,学习时要掌握其减速器附件的设计。简要操作步骤&#xf…

回文数

问题 A: 回文数 时间限制: 1 Sec 内存限制: 32 MB提交: 1705 解决: 512[提交][状态][讨论版]题目描述 我们把从左往右和从右往左念起来相同的数字叫做回文数。例如,75457就是一个回文数。当然某个数用某个进制表示不是回文数,但是用别的进制表示可能就…

Pytorch RNN(详解RNN+torch.nn.RNN()实现)

目录 一、RNN简介 二、RNN简介2 三、pytorch RNN 3.1 定义RNN()

git ssh创建分支_【ssh简单版git-server 1】自建git-server

环境:centos和ubuntu系统都可以CentOS release 6.7git version 1.7.1git-server 192.168.50.108git-client 192.168.50.112备注:基于linux系统下做ssh模式的gitserver,需要ssh免密钥,因为git用户是禁止登录的,clone时没…

使用js将后台返回的数据转换成树形结构

将类似如下数据转换成树形的数据: [{ id: 1, name: 1, },{ id: 2, name: 1-1, parentId: 1 },{ id: 3, name: 1-1-1, parentId: 2 },{ id: 4, name: 1-2, parentId: 1 },{ id: 5, name: 1-2-2, parentId: 4 },{ id: 6, name: 1-1-1-1, parentId: 3 },{ id: 7, name:…

HMM及维特比算法

参考 HMM:https://blog.csdn.net/sinat_25346307/article/details/79119366 Viterbi算法:https://blog.csdn.net/shenxiaoming77/article/details/79228378 一、HMM定义 以词性标注为例说明 图1 词性标注任务1、问题:如图1所示&#xff0c…

java 大文件 处理_用Java处理大文件

java 大文件 处理我最近不得不处理一组包含历史逐笔交易的外汇市场数据的文件,并很快意识到使用传统的InputStream都无法将它们读取到内存中,因为每个文件的大小都超过4 GB。 Emacs甚至无法打开它们。 在这种特殊情况下,我可以编写一个简单的…

python项目结构目录结构采用的是_python 项目目录结构设置

python 项目目录结构设置为项目设置目录结构是为了将功能类似的文件放置在同一目录内,增强项目的可读性和可维护性。如果一个python项目功能单一,代码量很小,那就没必要设置的这么复杂。下图是一个示例项目的目录结构:1&#xff0…

HMM和CRF 条件随机场详解

转载于 https://blog.csdn.net/qq_42901761/article/details/104206799 这位大神ffffatgoose总结的很好

使用Spring Cloud Config作为外部化配置

关于连续交付 ,最重要的实践之一是只构建一次二进制文件,并在不同的环境(开发,测试,验收等)中使用该二进制文件 。 这意味着最有可能需要外部化应用程序的配置 。 对于Spring Boot应用程序,将其…

51nod1040 最大公约数之和,欧拉函数或积性函数

1040 最大公约数之和 给出一个n&#xff0c;求1-n这n个数&#xff0c;同n的最大公约数的和。比如&#xff1a;n 6时&#xff0c;1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6&#xff0c;加在一起 15 看起来很简单对吧&#xff0c;但是n<1e9&#xff0c;所以暴力是不行的…