【计算机网络系列】网络层④:详解IP数据包的格式

2023-11-06

IP数据报的格式

IP数据报的格式说明协议IP都具有什么功能。在协议IP的标准中,描述首部格式的宽度是32位(即4字节)。下图是IP数据报的完整格式。
image.png
从上图可看出,一个IP数据报由首部数据两部分组成。首部的前一部分长度是固定的,共20字节,是所有IP数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。下面介绍首部各字段的意义。

IP数据报首部的固定部分中的各字段

版本:占4位,指协议IP的版本。

  • 通信双方使用的协议IP的版本必须一致。
  • 两种版本:IPv4和IPv6。

首部长度:占4位,可表示的最大十进制数值是15。

请注意,首部长度字段所表示数的单位是32位字长(1个32位字长是4字节)。

  • IP首部的固定部分是20字节,
    • 因此首部长度字段的最小值是5(即二进制表示的首部长度是0101)。
    • 而当首部长度字段为最大值1111时(即十进制的15),就表明首部长度达到最大值:15个32位字长,即60字节。
  • 当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。因此IP数据报的数据部分永远在4字节的整数倍时开始,这样在实现协议IP时较为方便。
  • 首部长度限制为60字节的缺点是有时可能不够用,但这样做是希望用户尽量减少开销
  • 最常用的首部长度是20字节,不使用任何可选字段。

区分服务:占8位,用来获得更好的服务。

  • 这个字段在旧标准中叫作服务类型,但实际上一直没有被使用过。1998年IETF把这个字段改名为区分服务DS(DifferentiatedServices)。
  • 只有在使用区分服务时,这个字段才起作用。
  • 在一般的情况下都不使用这个字段。

总长度:总长度指首部和数据之和的长度,单位为字节

  • 总长度字段为16位,因此数据报的最大长度为 2 16 − 1 = 65535 2^{16}-1=65535 2161=65535字节。然而实际上传送这样长的数据报在现实中是极少遇到的。

在IP层下面的每一种数据链路层协议都规定了一个数据帧中的数据字段的最大长度,这称为最大传送单元MTU(Maximum Transfer Unit)。

  • 当一个IP数据报封装成链路层的帧时,此数据报的总长度(即首部加上数据部分)一定不能超过下面的数据链路层所规定的MTU值。

例如,最常用的以太网就规定其MTU值是1500字节。

  • 若所传送的数据报长度超过数据链路层的MTU值,就必须把过长的数据报进行分片处理

虽然使用尽可能长的IP数据报会使传输效率得到提高,但数据报短些也有好处。IP数据报越短,路由器转发的速度就越快。为此,协议IP规定,在互联网中所有的主机和路由器必须能够接受长度不超过576字节的数据报。当主机需要发送长度超过576字节的数据报时,应当先了解一下,目的主机能否接受所要发送的数据报长度。否则,就要进行分片。

这是假定上层交下来的数据长度有512字节,加上最长的IP首部60字节,再加上4字节的富余量,就得到576字节。

在进行分片时,数据报首部中的“总长度”字段是指分片后的每一个分片的首部长度与该分片的数据长度的总和。


标识(identification):占16位。

  • IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。
  • 当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报片的标识字段中。

相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。


标志(flag):占3位,但目前只有两位有意义。

  • 标志字段中的最低位记为MF(More Fragment)。
    • MF=1即表示后面“还有分片”的数据报。
    • MF=0表示这已是若干数据报片中的最后一个。
  • 标志字段中间的一位记为DF(Don’t Fragment),意思是“不能分片”。
    • 只有当DF=0时才允许分片。

片偏移:占13位。

  • 片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对于用户数据字段的起点,该片从何处开始。
  • 片偏移以8个字节为偏移单位。这就是说,除最后一个数据报片外,其他每个分片的长度一定是8字节(64位)的整数倍。

【例】一个数据报的总长度为3820字节,其数据部分为3800字节长(使用固定首部),需要分片为长度不超过1420字节的数据报片。因固定首部长度为20字节,因此每个数据报片的数据部分长度不能超过1400字节。于是分为3个数据报片,其数据部分的长度分别为1400,1400和1000字节。原始数据报首部被复制为各数据报片的首部,但必须修改有关字段的值。下图给出分片后得出的结果。
image.png
下表是本例中数据报首部与分片有关的字段中的数值,其中标识字段的值是任意给定的。具有相同标识的数据报片在目的站就可无误地重装成原来的数据报。
image.png
现在假定数据报片2经过某个网络时还需要再进行分片,即划分为数据报片2-1(携带数据800字节)和数据报片2-2(携带数据600字节)。那么这两个数据报片的总长度、标识、MF、DF和片偏移分别为:820,12345,1,0,175620,12345,1,0,275


生存时间:占8位,生存时间字段常用的英文缩写是TTL(Time To Live)

  • 表明这是数据报在网络中的寿命。
  • 由发出数据报的源点设置这个字段。其目的是防止无法交付的数据报无限制地在互联网中兜圈子,因而白白消耗网络资源。
  • TTL的意义是指明数据报在互联网中至多可经过多少个路由器
  • 路由器在每次转发数据报之前就把TTL值减1。若TTL值减小到零,就丢弃这个数据报,不再转发。因此,TTL的单位是跳数
  • 数据报能在互联网中经过的路由器的最大数值是255。
  • 若把TTL的初始值设置为1,就表示这个数据报只能在本局域网中传送。

协议:占8位

  • 协议字段指出此数据报携带的数据使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个协议进行处理。
  • 常用的一些协议和相应的协议字段值如下:

image.png


首部检验和:占16 位。

  • 这个字段只检验数据报的首部不包括数据部分。这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和,所以首部需要检验。

不检验数据部分可减少计算的工作量。

  • IP首部的检验和不采用复杂的CRC检验码,而采用下面的简单计算方法:
    • 在发送方,先把IP数据报首部划分为许多16位字的序列,并把检验和字段置零。用反码算术运算把所有16位字相加后,将得到的和的反码写入检验和字段。
    • 接收方收到数据报后,把首部的所有16位字再使用反码算术运算相加一次。将得到的和取反码,即得出接收方检验和的计算结果。
    • 若首部未发生任何变化,则此结果必为0,于是就保留这个数据报;否则即认为出差错,并将此数据报丢弃。

下图说明了IP数据报首部检验和的计算过程。

image.png


源地址:占32位。

  • 发送IP数据报的主机的IP地址。

目的地址:占32位。

  • 接收IP数据报的主机的P地址

IP数据报首部的可变部分

IP 数据报首部的可变部分就是一个选项字段。选项字段用来支持排错测量以及安全等措施,内容很丰富。此字段的长度可变,从1字节到40字节不等,取决于所选择的项目。

  • 某些选项项目只需要1字节,它只包括1字节的选项代码。
  • 而有些选项需要多个字节,这些选项一个个拼接起来,中间不需要有分隔符,最后用全0的填充字段补齐为4字节的整数倍。

增加首部的可变部分是为了增加IP数据报的功能,但这同时也使得IP数据报的首部长度成为可变的。这就增加了每一个路由器处理数据报的开销。

实际上这些选项很少被使用。很多路由器都不考虑IP首部的选项字段,因此新的IP版本IPv6就把IP数据报的首部长度做成固定的了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【计算机网络系列】网络层④:详解IP数据包的格式 的相关文章

  • 设计模式精讲-抽象工厂方法模式

    设计模式 抽象工厂方法模式 定义 示例 应用场景 优点 定义 提供一个创建一系列相关或互相依赖对象的接口 而无需指定它们具体的类 定义和图不理解的 可以先看下面的示例 回头再去理解 示例 以数据库为例 1 变化的部分 Mysq Oracle
  • 在LDAP中使用角色(Role)和组(Group)来管理用户

    LDAP 轻量级目录服务器 越来越被广泛的使用 特别是在管理海量用户信息和管理身份认证信息的时候 LDAP被国内大多数企业所使用 从中国电信 中 国移动 新浪 和许多省市政府部门都使用LDAP来管理用户身份的信息 下面重点介绍在LDAP中管
  • 【JavaEE】多线程(四)

    多线程 四 在开始讲之前 我们先来回顾回顾前三篇所讲过的内容 线程的概念 并发编程 多进程 比较重 频繁创建销毁 开销大 Thread的使用 创建线程 继承Thread 实现Runnable 继承Thread 匿名内部类 实现Runnabl
  • 第2讲 Hi3861的WiFi实验-AP模式

    引言 在本文中 带大家编写一个程序 测试Hi3861的WiFi AP模式 进一步熟悉相关API的使用 请先按照本专栏第一讲中的第四部分准备好实验环境 一 编写程序 首先 打开 DevEco Device Tool 在鸿蒙项目 hispark
  • 查看php已安装扩展命令

    php m
  • 模型训练时间计算

    一 时间戳计算 记录当前时间 或者用 time perf counter 精度更高 import time t0 time time t0 time perf counter 记录结束时间 t1 time time t1 time perf

随机推荐

  • C# winform使用StreamWriter的方式将dataTable导出到Excel

    代码笔记 public void Export2Excel if this GridView logData Rows Count gt 0 SaveFileDialog saveFileDialog new SaveFileDialog
  • 【HAL库】STM32F103输出固定数量的PWM波形

    目的 用STM32F103ZET6的TIM1 CH1输出10个脉冲 实现方法主要有两种 一种用中断计数 一种用主从定时器门控方式 一 中断计数 首选需要选择合适的IO口 我选的是PE9 对应TIM1 CH1 然后在STM32CUBEMX里面
  • C++继承和多态特性

    文章目录 前言 1 什么是面向对象的继承特性 2 C 继承中的权限管控 3 继承体系下子类和父类的关系 4 派生类和基类的构造析构关系 5 派生类和基类的同名成员问题 6 子类和父类的类型兼容规则 7 继承的优势与不良继承 8 组合介绍以及
  • windows10家庭版远程桌面连接报错:CredSSP加密oracle修正

    原地址 https www cnblogs com lindajia p 9021082 html Windows10远程桌面连接 报错信息 网上找到方法 但是奈何是 Win10家庭版 不能使用这个办法 具体操作可以看最后的引用链接 策略路
  • 【应急响应】后门攻击检测指南&Rookit&内存马&权限维持&WIN&Linux

    文章目录 Windows实验 常规后门 网络对外连接查看 自启动测试 隐藏账户 映像劫持 屏保 登录 Linux实验 常规后门 Rootkit后门 GScan rkhunter 权限维持后门 GScan rkhunter Web层面 通用系
  • 秋叶大神的Stable Diffusion整合包

    前段时间在研究Stable Diffusion本地化部署 但是对于新手小白来说算是比较难得 不过没关系 我在B站发现了秋叶大神的Stable Diffusion整合包 我在用很方便 必须分享出来 Stable Diffusion整合包下载地
  • 基于vue的页面加载动画

    基本原理是 在window加载之前 渲染出加载动画 页面渲染完成后 移除加载动画即可 在vue项目中一般只需二步 第一步 写css和dom 在vue项目的index html中引入css 第二步 在app vue created中移除加载动
  • pytorch_lighting

    1 pytorch lighting 简介 1 1 pytorch lighting 是什么 1 1 1 pytorch lightning 是什么 PyTorch Lightning 是一个开源的 PyTorch 加速框架 它旨在帮助研究
  • vue+Element-ui实现树形组件、表格树

    需求 要做出如下图所示的 树形表格 也就是数据之间有父子类关系的这种 可以点击展开 收缩 像上图这样的表格树 实现 1 使用树形组件 在学习树形表格之前 肯定得先搞懂普通的树形组件是怎么搞的 然后将其套到表格中就好了 请参考ElementU
  • linux real时间,【整理】RT-linux 实时Linux RealTime Linux

    折腾 整理 数控系统 操作系统 期间 看提到了RT linux 去研究看看 RT linux Vanilla kernel的问题 Linux kernel在spinlock irq上下文方面无法抢占 因此高优先级任务被唤醒到得以执行的时间并
  • 力扣刷题:两数相加

    给你两个 非空 的链表 表示两个非负的整数 它们每位数字都是按照 逆序 的方式存储的 并且每个节点只能存储 一位 数字 请你将两个数相加 并以相同形式返回一个表示和的链表 你可以假设除了数字 0 之外 这两个数都不会以 0 开头 输入 l1
  • Android Studio Proxy Setting 设置(详细图文说明)

    Android Studio代理设置 Android Studio Proxy Setting 设置 在很多时候编译依赖的相关库文件都是需要墙出去的 所以我们得学会怎么翻 具体可以查查网上很多详细的攻略 这里只介绍墙完后Android St
  • 【深入理解C++】空类对象所占用的空间大小

    文章目录 1 须知 2 空类对象所占用的空间大小 3 一个类继承空类 4 空类作为另一个类的成员 1 须知 类本身是没有大小的 类的大小指的是类的对象所占的大小 如果用 sizeof 运算符对一个类型名操作 得到的是具有该类型实体的大小 2
  • 移植4- uboot之网卡驱动移植

    linux 中 网络分为许多层 网卡处理物理与DATA LINK层 linux驱动就是将DATALINK层的数据包送到TCP IP层进行处理 主要是通过struct net device这个结构 struct net device实现了支持
  • 字符串转化使用String.valueOf(value) 代替 “ “ + value

    文章目录 把其它对象或类型转化为字符串时 使用String valueOf value 比 value 的效率更高 把其它对象或类型转化为字符串反例 int num 520 value String strLove num 把其它对象或类型
  • 2023年超全前端面试题-背完稳稳拿offer(欢迎补充)

    HTML CSS相关 HTML5 HTML5新特性 增强了表单 input新增了一些type color 定义调色板 tel 定义包含电话号码的输入域 email 定义包含email地址的输入域 search 定义搜索域 number 定义
  • innodb索引概念

    author skate time 2013 04 09 总结记录下innodb的索引概念 以备查看 innodb索引分类 聚簇索引 clustered index 1 有主键时 根据主键创建聚簇索引 2 没有主键时 会用一个唯一且不为空的
  • Qt+Pyhton实现麒麟V10系统下word文档读写功能

    目录 前言 1 C 调用python 1 1 安装Python开发环境 1 2 修改Qt工程配置 1 3 初始化Python环境 1 4 C 调用Python 函数 1 5 常用的Python接口 2 python虚拟环境 2 1Pytho
  • python 编码规范-代码的整体布局

    代码的整体布局主要囊括了代码在整体结构上应该注意的事项 缩进 空格 制表符 Python 在语法上使用缩进来确定代码块的开始和结束 对于每一级缩进 应为 4 个空格 并且不要混用空格与制表符 缩进本身是一种语法上的限制 是强制性的 有的ID
  • 【计算机网络系列】网络层④:详解IP数据包的格式

    IP数据报的格式 IP数据报的格式说明协议IP都具有什么功能 在协议IP的标准中 描述首部格式的宽度是32位 即4字节 下图是IP数据报的完整格式 从上图可看出 一个IP数据报由首部和数据两部分组成 首部的前一部分长度是固定的 共20字节