网络层——IP数据报详解

article/2025/9/16 4:50:21

IP数据报格式

在这里插入图片描述

各个字段的分析:

  1. 版本 4位
       指IP协议的版本,通信双方使用的IP协议版本必须保持一致。主要用两个版本IPV4、IPV6
  2. 首部长度 4位
      4位表示的最大十进制数是15。注意,首部长度字段所表示数的单位是32位(也就是4个字节)!

 Q 为什么单位是4个字节?

 A 首先IP首部固定长度最少为20字节。那么假设单位表示的是1位,那么首部长度最多能表示15位,显然不符合首部长度要求;假设单位表示的是1个字节,那么首部长度最多能表示15个字节,显然也不符合首部长度要求!

  因为IP首部固定长度是20字节,因此首部长度字段的最小值是5(二进制表示为0101)。而当首部长度达到最大值1111时(十进制时15),首部长度达到最大值15个32位字长,也就是60字节

  那么如果IP分组的首部长度不是4字节(32位)的整数倍时,必须利用最后的填充字段进行填充!

  1. 区分服务 8位

    一般情况并不使用。

  2. 总长度 16位
      总长度首部和数据之和得到长度,单位为字节。总长度字段为16位,因此数据报最大长度为
    2 16 − 1 = 65535 ( 单 位 : 字 节 ) 2^{16}-1 = 65535(单位:字节) 2161=65535()
    但是!最小IP分组首部长度为20字节,那么最大封装数据报长度为65515字节

  IP层下的数据链路层协议规定了一个数据字段的最大长度,称为最大传送单元MTU(Maximum Transfer Unit)
  当一个IP数据报封装成链路层的帧时,数据报的长度(首部加上数据部分)一定不能超过下面的数据链路层所规定的MTU值
  常见以太网规定其MTU值就是1500字节,如果所传送的数据报长度超过数据链路层的MTU值,就必须把过长的数据报进行分片处理

 虽然使用尽可能长度IP数据报会使传输效率得到提高(IP数据报首部长度站数据报总长度比例会更小);但是数据报更短也有好处数据报越短路由器转发的速度就越快

IP协议规定,所有主机和路由器必须能够接收长度不超过576字节的数据报

  这是假定上层交下来的数据长度(不包括首部)有512字节加上IP首部60字节,另外加上4字节的富余量,得到576字节。

   ​那么,如果需要发送长度超过576字节的数据报时,则需要分片,分片前应当先了解目的主机能否接受所要发送的数据报长度。

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

  1. 标识 16位
      它用于数据报各分片最终被重装成来原来的数据报。它是一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段目的主机将相同标识字段值的各分片数据报最后进行正确地重装(合片)

  2. 标志 3位
    只有两位有意义:

    • 最低位标志MF(More Fragment)MF=1表示后面还有分片的数据报;MF=0表示这个数据报中的最后一片
    • 中间标志位DF(Don’t Fragment)DF=1表示不允许分片DF=0表示允许分片。为什么会不允许分片?因为要保持数据的完整性
  3. 片偏移 13位
      较长的分组分片后,某片在原分组中的相对位置是有片偏移来表示的。片偏移以8个字节为偏移单位,也就是说每个分片的长度一定是8字节(64位)的整数倍

    Q 为什么每个分片的偏移单位是8字节(64位)?

    A 因为片段偏移字段比总长度字段即16比特(并且2^3是8)短3比特。片偏移以8个字节为偏移单位,即每个分片的长度一定是8字节的整数倍。

    在这里插入图片描述

  设IP数据报分组总长(包括首部和数据报)为L,待转发链路的MTU位M。如果L>M并且DF=0,则可以进行分片。因为一个最大分片可封装的数据(字节)大小应该是8的倍数

​ 所以一个分片中最多能包含数据长度d为
d = r o u n d [ ( M − 20 ) / 8 ] ∗ 8 d=round[(M-20)/8] * 8 d=round[(M20)/8]8
​ 那么需要总片(分组)数n为:
n = c e i l [ ( L − 20 ) / d ] n=ceil[(L-20)/d] n=ceil[(L20)/d]
​ 那么每片的片偏移字段值(注意这是分组后当前分组第一个字节的序号)Fi为:
F i = d / 8 ∗ ( i − 1 ) ( 1 < = i < = n ) F_i = d/8 * (i-1)\quad \quad (1<=i<=n) Fi=d/8(i1)(1<=i<=n)
每片的总长则需要分开讨论,最后一块和前面的可能不一样:
L i = d + 20 ( 1 < = i < n ) L_i = d + 20\quad \quad (1<=i<n) Li=d+20(1<=i<n)

L i = L − ( n − 1 ) d ( i = n ) L_i=L-(n-1)d \quad \quad (i=n) Li=L(n1)d(i=n)

  1. 生存时间 8位
      生存时间字段常用的英文缩写是TTL(Time to Live),表明数据报在网络中的寿命。
      该字段目的是为了防止无法交付的数据报无限制地在互联网中兜圈圈!消耗互联网可用资源!!
      每经过一个一个路由器时,就把TTL减去在路由器所消耗掉的一段时间。若数据报在路由器消耗的时间小于一秒,就把TTL减一,当TTL值减为0时,则丢弃这个数据报并且会送ICMP报文!

  2. 协议 占8位
      指出报文所携带的数据使用了什么协议,以便使目的主机的IP层直到应该将数据报交给哪个协议进行处理。

    在这里插入图片描述

  3. 首部校验和 16位
      这个字段只检验数据报的首部,不包括数据部分。每经过一个一个路由器,路由器都需要重新计算一下首部校验和(一些字段,如生存时间、标志、片偏移等都可能发生变化)。
      为了进一步减少校验和的工作量,IP首部的校验和不采用复杂的CRC校验码,而采用下面的简单计算方法:

    • 发送方:

      • IP数据报首部划分为许多16位字的序列,并把校验和字段置为0

      • 反码算术运算把所有16位字相加

        反码运算规则:从低位到高位逐位逐列进行计算,0和0相加得到0,0和1相加得到1,但1和1相加是0并且产生一个进位1,加到下一列。若最高位相加后产生进位,则最后得到的结果要加1

      • 将得到的==和的反码写入校验和字段==。

    • 接收方

      • 将首部的所有16位字(包括校验和)使用反码算术运算相加一次
      • 将得到的和取反码,得到的就是结果。如果结果是0,那么就可以保留这个数据报;否则即认为出现差错,并将数据报丢弃。

    校验和计算得到结果位0也不一定说明数据报是对的!应该要交给上层进一步确定报文是否有误

  4. 源地址 32位

  5. 目的地址 32位

  6. IP数据报首部可变部分

    • 选项字段用来支持排错、测量以及安全等措施,内容很丰富。
    • 此字段的长度可变,从1~40个字节不等,取决于所选择的项目。
    • 某些选项项目只需要1个字节,它只包括1个字节的选项代码。但还有些选项需要多个字节,这些选项一个个拼接起来,中间不需要有分隔符,最后用全0的填充字段补齐成为4字节的整数倍。

 Q 为什么要填充成4字节的整数倍?

 A 这是由首部长度字段所决定的!因为首部长度字段的单位是32个字(也就是4个字节)!


http://chatgpt.dhexx.cn/article/DwBXMfW2.shtml

相关文章

IP数据报

文章目录 前言一、IP数据报的格式1.IP数据报2.数据报中各个字段的意义 二、ICMP&#xff08;Internet控制报文协议&#xff09;1.报文格式2.常见应用 三、ARP协议四、路由表 前言 在前面的学习中我们学习了数据的封装和解封装&#xff0c;了解了封装是从发送端由上向下一层一层…

IPv4数据报的首部格式

版本&#xff1a;占4比特&#xff0c;表示IP协议的版本&#xff0c;通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议版本号为4 首部长度占4比特&#xff0c;表示IP数据报首部的长度。该字段的取值以4字节为单位。最小十进制取值为5&#xff0c;表示IP数据报首部只有…

EXE4J 错误提醒 Pleasedefine EXE4J_JAVA_HOME to point to an installes 64-bit JDK or JRE

EXE4J 错误提醒 Please define EXE4J_JAVA_HOME to point to an installed 64-bit JDK or JRE 首先查看上一步的提醒&#xff0c;这里显示支持的版本为最小1.8到最大11&#xff0c;而我环境变量配置为13&#xff0c;版本过高 解决办法 1、添加符合版本的jdk 2、升级exe4j …

首次使用exe4j遇见的问题

exe4j安装注册&#xff1a; https://www.cnblogs.com/jepson6669/p/9211208.html 问题一、安装exe4j 问题和解决方法描述&#xff1a; 大概是这个意思&#xff0c;安装这个exe4j需要jvm&#xff0c;你的电脑上要有jdk和jre&#xff0c;并且这个jdk版本必须是1.8~11之间的64…

exe4j下载和使用(超详细)

1、下载exe4j 链接: 点击下载 提取码: b3cy 1.1、安装步骤就不说了&#xff0c;按照提示一步一步进行即可 2、这里使用的jar包是maven项目打包出来的jar PS&#xff1a;注意 这里针对的是maven项目打包成的jar&#xff0c;如果是普通Java项目打包成的jar 请参考别的文章2.1…

exe4j 打包 jar 文件为 exe 文件(GUI程序)

exe4j 打包 jar 文件为 exe 文件&#xff08;GUI程序&#xff09; 1、资源分享2、把项目打包成 exe 文件2.1 把项目打包成 jar 包&#xff08;用 fatjar 打包项目&#xff09;(1) 把 net.sf.fjep.fatjar_0.0.32.jar 包放入 eclipse\plugins 目录下(2) 完成第一步后&#xff0c;…

exe4j打成的exe文件运行时弹窗this executable was created with an evaluation version of exe4j问题解决

其实这是因为没有激活造成的,激活码网上很多,这里给一个L-g782dn2d-1f1yqxx1rv1sqd 点击welcome页的右下角的License, Name和Company随便输,然后输入激活码确认就可以了

exe4j下载安装

exe4j下载安装 exe4j下载exe4j安装exe4j激活exe4j使用 exe4j下载 exe4j下载地址 1.点击exe4j下载地址 2.点击Setup Executable (55 MB) ZIP Archive (75 MB) 进行下载 exe4j安装 1.双击 exe4j_windows-x64_7_0.exe开始安装 2.点击运行按钮 3.点击Next按钮 4.选择 I ac…

exe4j打包问题解决方案

在我们想要打包java文件时候&#xff0c;由于编译版本与运行环境的问题困扰我们许久&#xff1a;java.lang.UnsupportedClassVersionError: Os/Os 已由 Java 运行时的更新版本&#xff08;类文件版本 56.0&#xff09;编译&#xff0c;此版本的 Java 运行时仅识别最高 52.0 的类…

exe4j中,报错:This executable was created with an evaluation version of exe4j

运行exe4j工具打包好的.exe文件&#xff0c;报错&#xff1a;This executable was created with an evaluation version of exe4j 由于是新下载安装的exe4j工具&#xff0c;没有进行注册&#xff01;所以导致报这个错&#xff01; 在使用exe4j时&#xff0c;如果exe4j没有注册…

SpringBoot 2.x 使用 exe4j 打包成 exe 可执行文件(附带启动传参)

1.下载安装exe4j 官网地址: exe4j Download 2.注册exe4j 启动exe4j后 点击右下角 Change License 填写用户名公司与注册码 ​​​​​​​ 注册码列表自行百度 3.准备打包文件 创建一个文件夹 文件夹内包含 整个jdk 项目jar包 ico图标 4.运行exe4j开始打包 步骤一 …

exe4j完成Java转exe 自带jre

当用户电脑上没有安装Java环境时&#xff0c;我(们)交付程序时&#xff0c;还需要提交一份jre exe4j支持选择自带的jre&#xff1b;但是好像不支持选择精简的jre&#xff0c;会导致生成的exe不能正常运行 知道怎样用精简jre转exe的朋友请留言…orz&#xff0c;我之前提到了怎…

exe4j打包工具使用

前言&#xff1a;用于将eclipse中的项目打包成.exe形式。 eclipse中的项目打包成jar形式&#xff1a;eclipse项目右键–>Export–>java–>Runnable JAR file–>Next→Export destination(选择jar包导出路径)&#xff0c;Library handing(选择第三项 Copy…&#xf…

利用 exe4j 将 JAR 包制成免安装 JDK 的 EXE 文件

利用 exe4j 将 JAR 包制成免安装 JDK 的 EXE 文件 exe4j 的工作原理EXE 制作教程 将 JAR 包制成能在 Windows 上直接运行的 EXE 文件&#xff0c;是很多 Java 爱好者喜欢做的事情。虽然这不是对 JAR 包的商业用法&#xff0c;不过很多人都希望能学以致用&#xff0c;而不仅仅是…

EJ.Technologies.Exe4j 8.0-key

exe4j 是一个 Windows 启动器生成器&#xff0c;在您购买 install4j 时免费提供。如果您想在没有安装程序的情况下创建 Java 启动器&#xff0c;exe4j 很有用。exe4j 是一个简单易用的软件应用程序&#xff0c;它允许程序员快速创建 EXE 格式的 Java 应用程序并将它们集成到 Wi…

exe4j 压缩java代码到无JRE环境的电脑上运行

exe4j_6.0下载&#xff08;x86\x64\注册机&#xff09;&#xff1a; https://pan.baidu.com/s/1oFzif5ZVswbgbBkKHc8HFQ 打包步骤&#xff1a; 再次偷一下懒&#xff0c;使用别人的内容&#xff0c;原文&#xff1a;https://blog.csdn.net/qq_20473985/article/details/531862…

exe4j 关闭命令行窗口运行

exe4j 运行关闭命令行窗口 java 程序打包成 jarexe4j 将jar转为 exe 文件exe4j 关闭未注册弹窗信息exe4j 设置UI启动&#xff0c;关闭黑框 使用 java swing 做个小软件&#xff0c;为了使用方便&#xff0c;使用 exe4j 将 jar 包转成了 exe 文件&#xff0c;可以直接双击运行&a…

使用exe4j打包exe文件

如何使用exe4j把jar打包成exe文件 最近&#xff0c;做了几个javafx的项目&#xff0c;想要把jar包打成exe的可执行软件&#xff0c;下面时我使用exe4j打包的方法 1. 第0步&#xff1a;去官网下载 exe4j 2. 第一步&#xff1a;Welcome 这个地方最好要注册一下&#xff0c;如…

EXE4J 使用教程

一、背景 exe4j 可以很容易吧一个 jar 打包成 exe。但是对于一些刚接触 java 或者刚接触 exe4j 的 朋友来说&#xff0c;看看这个教程还是很有帮助的。 二、下载地址 Exe4j 下载地址&#xff1a;http://dl.dbank.com/c0owlopqf8 三、打包步骤 1、 从上面网址下载 exe4j 安装文件…

exe4j将jar包打成exe(添加jar、jdk、dll)

最近用Java写了一个小工具&#xff0c;想将它达成exe执行文件&#xff0c;到时候直接放某个目录下&#xff0c;一执行就能跑啦。 用到的工具&#xff1a; 1、写好的项目&#xff1a;可以是java项目&#xff0c;也可以是java web项目 2、能够打jar的工具&#xff1a;我用的MyEcl…