IP 数据包分包组包

news/2024/10/4 0:15:31 标签: tcp/ip, 网络, 服务器

为什么要分包

由于数据链路层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.niftyadmin.cn/n/5689166.html

相关文章

利用 notepad++ 初步净化 HaE Linkfinder 规则所提取的内容(仅留下接口行)

去掉接口的带参部分 \?.*去掉文件行 .*\.(docx|doc|xlsx|xls|txt|xml|html|pdf|ppt|pptx|odt|ods|odp|rtf|md|epub|css|scss|less|sass|styl|png|jpg|jpeg|gif|svg|ico|bmp|tiff|webp|heic|dds|raw|vue|js|ts|mp4|avi|mov|wmv|mkv|flv|webm|mp3|wav|aac|flac|ogg|m4a).*(\r\…

Python 课程23-LibROSA

前言 LibROSA 是一个用于音频分析的 Python 库,特别擅长音乐信号处理和音频特征提取。它提供了广泛的工具来处理音频文件,包括加载、变换、特征提取、可视化等功能。LibROSA 在音乐信息检索(MIR)、机器学习中的音频预处理和音频信…

CentOS常用命令收集

系统相关 重置root密码 1. 通过GRUB菜单重置 重启系统进入GRUB菜单,按e键编辑启动参数。找到以linux16开头的行,更改ro为 rw init/sysroot/bin/sh按Ctrl X启动系统进入后执行以下命令:chroot /sysroot passwd root touch /.autorelabel完…

论文推荐 |【Agent】自动化Agent设计系统

论文标题: Automated Design of Agentic Systems 论文地址: https://arxiv.org/abs/2408.08435 GitHub地址: https://github.com/ShengranHu/ADAS 自动化代理设计在性能和通用性方面显著超越了手动方法。 • 引入了自动化代理系统设计&am…

【Ubuntu】PlantUML工具 | 安装 | 语法 | 使用工具画序列图

🌱 PlantUML是一个通用性很强的工具,可以快速、直接地创建各种图表。 目录 1 安装 2 使用PlantUML画序列图 ① 语法 ②示例和效果 利用简单直观的语言,用户可以毫不费力地绘制各种类型的图表。PlantUML 是一个开源项目,支持快速绘制:• 时序图• 用例图• 类图• 对

Python知识点:如何使用Flink与Python进行实时数据处理

开篇,先说一个好消息,截止到2025年1月1日前,翻到文末找到我,赠送定制版的开题报告和任务书,先到先得!过期不候! 如何使用Flink与Python进行实时数据处理 Apache Flink是一个流处理框架&#xf…

【easypoi 一对多导入解决方案】

easypoi 一对多导入解决方案 1.需求2.复现问题2.1校验时获取不到一对多中多的完整数据2.2控制台报错 Cannot add merged region B5:B7 to sheet because it overlaps with an existing merged region (B3:B5). 3.如何解决第二个问题处理: Cannot add merged region …

Git面试题总结

1.列举工作中常用的几个git命令? 初始化git仓库 :git init 新增文件的命令:git add file或者git add . 提交文件的命令:git commit –m或者git commit –a(直接提交) 查看工作区状况:git status –s(简洁形式查看)…