IP 数据包分包组包

ops/2024/12/22 2:55:56/

为什么要分包

由于数据链路层MTU的限制,对于较⼤的IP数据包要进⾏分包.

什么是MTU

MTU相当于发快递时对包裹尺⼨的限制.这个限制是不同的数据链路对应的物理层,产⽣的限制. 

• 以太⽹帧中的数据⻓度规定最⼩46字节,最⼤1500字节,ARP数据包的⻓度不够46字节,要在后⾯补填 充位;

• 最⼤值1500称为以太⽹的最⼤传输单元(MTU),不同的⽹络类型有不同的MTU;

• 如果⼀个数据包从以太⽹路由到拨号链路上,数据包⻓度⼤于拨号链路的MTU了,则需要对数据包进 ⾏分⽚(fragmentation);

• 不同的数据链路层标准的MTU是不同的;

MTU对IP协议的影响

• 将较⼤的IP包分成多个⼩包,并给每个⼩包打上标签;

• 每个⼩包IP协议头的16位标识(id)都是相同的;

• 每个⼩包的IP协议头的3位标志字段中,第2位置为0,表⽰允许分⽚,第3位来表⽰结束标记(当前是否 是最后⼀个⼩包,是的话置为1,否则置为0);

• 到达对端时再将这些⼩包,会按顺序重组,拼装到⼀起返回给传输层;

• ⼀旦这些⼩包中任意⼀个⼩包丢失,接收端的重组就会失败.但是IP层不会负责重新传输数据;

分包组包过程中和哪些 IP 报头字段有关联

• 16位标识(id):唯⼀的标识主机发送的报⽂.如果IP报⽂在数据链路层被分⽚了,那么每⼀个⽚⾥⾯的 这个id都是相同的.

• 3位标志字段:第⼀位保留(保留的意思是现在不⽤,但是还没想好说不定以后要⽤到).第⼆位置为1表 ⽰禁⽌分⽚,这时候如果报⽂⻓度超过MTU,IP模块就会丢弃报⽂.第三位表⽰"更多分⽚",如果分⽚ 了的话,最后⼀个分⽚置为1,其他是0.类似于⼀个结束标记.

 • 13位分⽚偏移(framegament offset):是分⽚相对于原始IP报⽂开始处的偏移.其实就是在表⽰当前 分⽚在原报⽂中处在哪个位置.实际偏移的字节数是这个值*8得到的.因此,除了最后⼀个报⽂之 外,其他报⽂的⻓度必须是8的整数倍(否则报⽂就不连续了).

组包时如何保证数据的顺序和完整性?

一、保证数据顺序


1. 利用标识字段


- IP 报头中的标识字段对于来自同一原始数据包的所有分片都是相同的。在组包时,可以依据这个标识来确定哪些分片属于同一个数据包,从而为正确排序提供基础。
- 例如,当接收到多个分片时,首先根据标识字段将它们分类到不同的原始数据包集合中。


2. 依赖片偏移字段


- 片偏移字段指出了每个分片在原始数据包中的相对位置。组包时,可以按照片偏移的值从小到大的顺序对分片进行排列。
- 比如,从片偏移为 0 的分片开始,依次处理后续具有连续片偏移值的分片,确保数据包的各个部分按照正确的顺序组合起来。


 
二、保证数据完整性


 
1. 检查标识和标志字段


- 确认所有属于同一数据包的分片具有相同的标识。如果发现标识不一致的分片,可能意味着存在错误或数据丢失。
- 同时,检查标志字段中的“更多分片”标志位。当接收到一个分片且该标志位为 0 时,表示这是该数据包的最后一个分片。如果在组包过程中一直未收到标志位为 0 的分片,可能存在数据丢失的情况。


2. 计算和验证校验和


- IP 报头中包含校验和字段。在组包时,可以重新计算整个数据包(包括重组后的 IP 报头和数据部分)的校验和,并与接收到的分片的校验和进行比较。如果校验和不一致,说明数据可能在传输过程中被损坏,需要采取相应的纠错措施,如请求重新发送丢失或损坏的分片。


3. 超时机制和重传请求


- 设置合理的超时时间,当在一定时间内没有收到所有属于一个数据包的分片时,认为数据包可能丢失,向发送方发送重传请求。
- 例如,在接收端维护一个定时器,对于每个正在组包的数据包,如果在超时时间内没有完成组包,则触发重传机制,请求发送方重新发送该数据包的所有分片。


http://www.ppmy.cn/ops/120185.html

相关文章

vim/vi常用命令大全

启动和退出Vim 命令/操作作用vim启动Vimvim filename直接打开指定的文件命令模式下,输入 :q退出,q!强制退出:wq保存并退出:wq!保存并强制退出vim中按下a进入编辑模式Esc退出编辑模式进入命令模式new创建新窗口close关闭窗口 光标移动 命令/操作作用h、…

js设计模式(26)

js设计模式(26) JavaScript 中常用的设计模式可以分为几大类,包括创建型模式、结构型模式和行为型模式。以下是它们的分类和常见设计模式的完整列表: 一、创建型模式 这些模式主要关注对象的创建方式,目的是降低系统耦合和复杂性。 工厂模…

C++初阶:STL详解(十)——priority_queue的介绍,使用以及模拟实现

✨✨小新课堂开课了,欢迎欢迎~✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C:由浅入深篇 小新的主页:编程版小新-CSDN博客 一.priority_queue的介绍 优先级队列被实现…

蓝桥杯模块二:数码管的静态、动态实现

模块二训练 1.静态显示 一、数码管电路图 二、电路分析 1.数码管电路分析 端口分公共端和段码,先用公共端控制一个数码管,再用段码实现显示数字。共阳数码管公共端输入高电平,段码输入低电平实现点亮 2.锁存器 Y7控制段码,Y6控…

开源链动 2+1 模式 S2B2C 商城小程序:激活 KOC,开启商业新征程

摘要:本文深入探讨了 KOC 在立体连接中的重要性,以及如何通过开源链动 21 模式 S2B2C 商城小程序发现和找到更多的 KOC。强调了历史积累强关系和快速强化强关系的方法,并阐述了该商城小程序在推动商业发展中的关键作用。 一、引言 在当今竞争…

手机如何五开玩梦幻西游端游?用GameViewer远程手机免费畅玩梦幻西游

用手机就能免费玩梦幻西游端游,还可以随时查看挂机进度! 想要实现这一点,就用网易GameViewer远程,而且不光手机可以玩梦幻西游端游,平板也能免费玩,并为你实现五开玩梦幻西游端游。 那么,通过Ga…

Cilium + ebpf 系列文章- (六)Cilium-BGP与分发-EXTERNAL-IP

一、首先你安装的Cilium需要支持BGP cilium install \--version v1.16.1 \--set ipam.modekubernetes \--set routingModenative \--set ipv4NativeRoutingCIDR"10.0.0.0/8" \--set bgpControlPlane.enabledtrue \--set k8s.requireIPv4PodCIDRtrue 这个命令用于安…

【JVM】双亲委派模型

文章目录 双亲委派模型(面试高频)类加载器工作过程存在意义 双亲委派模型(面试高频) 之所以这个东西面试出场概率高高,最大的原因就是它起的名字很好听 描述了查找 .class 文件的策略。 类加载器 JVM 中进行类加载的…