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. 超时机制和重传请求

  • 设置合理的超时时间,当在一定时间内没有收到所有属于一个数据包的分片时,认为数据包可能丢失,向发送方发送重传请求。

  • 例如,在接收端维护一个定时器,对于每个正在组包的数据包,如果在超时时间内没有完成组包,则触发重传机制,请求发送方重新发送该数据包的所有分片。

相关推荐
无名之逆16 小时前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
大丈夫立于天地间16 小时前
ISIS协议中的数据库同步
运维·网络·信息与通信
Dream Algorithm16 小时前
路由器的 WAN(广域网)口 和 LAN(局域网)口
网络·智能路由器
IT猿手16 小时前
基于CNN-LSTM的深度Q网络(Deep Q-Network,DQN)求解移动机器人路径规划,MATLAB代码
网络·cnn·lstm
吴盐煮_16 小时前
使用UDP建立连接,会存在什么问题?
网络·网络协议·udp
rainFFrain16 小时前
单例模式与线程安全
linux·运维·服务器·vscode·单例模式
GalaxyPokemon16 小时前
Muduo网络库实现 [九] - EventLoopThread模块
linux·服务器·c++
hyshhhh16 小时前
【算法岗面试题】深度学习中如何防止过拟合?
网络·人工智能·深度学习·神经网络·算法·计算机视觉
Hellc00717 小时前
轮询、WebSocket 和 SSE:实时通信技术全面指南(含C#实现)
网络