目录
IP协议报头格式

• 16位标识(id): 唯⼀的标识主机发送的报⽂. 如果IP报⽂在数据链路层被分⽚了, 那么每⼀个⽚⾥⾯
的这个id都是相同的.
• 3位标志字段: 第⼀位保留(保留的意思是现在不⽤, 但是还没想好说不定以后要⽤到). 第⼆位置为1
表⽰禁⽌分⽚, 这时候如果报⽂⻓度超过MTU, IP模块就会丢弃报⽂. 第三位表⽰"更多分⽚", 如果
分⽚了的话, 最后⼀个分⽚置为0, 其他是1. 类似于⼀个结束标记.
• 13位分⽚偏移(framegament offset): 是分⽚相对于原始IP报⽂开始处的偏移. 其实就是在表⽰当
前分⽚在原报⽂中处在哪个位置. 实际偏移的字节数是这个值 除以 8 得到的. 因此, 除了最后⼀个
报⽂之外(之前如果都是8的整数倍,最后⼀⽚的偏移量也⼀定是8的整数倍), 其他报⽂的⻓度必须
是8的整数倍(否则报⽂就不连续了).
• 注意:⽚偏移(13位)表⽰本⽚数据在它所属的原始数据报数据区中的偏移量(以8字节为单位)
分片与组装的过程
分片和组装都是网络层干的事
分片
1. 检查MTU限制:
◦ 当⼀个IP数据报的⼤⼩超过了⽹络的MTU(最⼤传输单元)限制时,就需要进⾏分⽚。MTU是 数据链路层对IP层数据包进⾏封装时所能接受的最⼤数据⻓度。
2. 分割数据报:
◦ IP层将原始的IP数据报分割成多个较⼩的⽚段。
◦ 对于每个⽚段,IP层会设置相应的标识(Identification)、偏移量(Fragment Offset)和标志位(Flags)等字段。
◦ 标识字段⽤于标识属于同⼀个数据报的不同分⽚,确保所有分⽚能够被正确地重新组装。
◦ 偏移量字段指⽰了当前分⽚相对于原始数据报的起始位置,以8字节为单位。
◦ 标志位字段包含了3个位,其中MF(More Fragment)位⽤于指⽰是否还有更多的分⽚,DF (Do Not Fragment)位⽤于指⽰数据报是否允许进⾏分⽚。
3. 添加IP头部:
◦ 每个分⽚都会加上⾃⼰的IP头部,与完整IP报⽂拥有类似的IP头结构,但MF和Fragment Offset 等字段的值会有所不同。
4. 发送分⽚:
◦ 分⽚在传输过程中独⽴传输,每个分⽚都有⾃⼰的IP头部,并且各⾃独⽴地选择路由。
组装
1. 接收分⽚:
◦ 当⽬的主机的IP层接收到这些分⽚后,会根据标识字段将属于同⼀个数据报的所有分⽚挑选出来。
2. 排序与组装:
◦ 利⽤⽚偏移字段,IP层会对属于同⼀个数据报的分⽚进⾏排序。
◦ 当所有的分⽚都到达并正确排序后,IP层会将这些分⽚重新组装成⼀个完整的IP数据报。
3. 传递给上层协议:
◦ 组装好的IP数据报会传递给上层的协议进⾏处理。
接收⽅如何得知⾃⼰收到的报⽂分⽚了?
接收方收到一个IP数据报后,会检查以下两个条件:
-
如果
MF位为1:这明确表示还有后续分片,当前数据报是一个分片。 -
如果
分片偏移值大于0:这表示当前分片的数据并非从原始数据报的开头开始,那么它肯定是一个分片。
只要满足以上两个条件中的任意一个,接收方就知道当前收到的是一个分片。
特例: 如果一个数据报没有被分片(即它本身就是完整的),那么它的 MF=0且 分片偏移=0。
接收⽅如何得知⾃⼰收到的分⽚收全了?
接收方会检查是否已经收到了一个“最后的分片”,并且从开头到这个最后分片之间的所有数据都已经到位。
-
关键标志:收到一个
MF=0的分片。这表示这是最后一个分片。 -
数据连贯性:根据已收到的所有分片的分片偏移和数据长度,接收方可以计算出整个原始数据报应有的总长度。它会检查从偏移量0开始,到这个最后分片结束为止的整个数据区域是否已经被填满,中间没有“空洞”。
当且仅当收到了 MF=0的分片,并且重组缓冲区中从0到该分片结束的所有数据都已连续存在时,接收方才认为分片已经收全,可以开始重组。
接收⽅如何组合形成完整的报⽂?
组合过程相对直接:
-
按偏移量排序:在重组缓冲区中,接收方会根据每个分片的分片偏移值,将它们的数据部分按顺序拼接起来。
-
例如,偏移量为0的分片数据放在最前面。
-
接着是偏移量为(第一个分片数据长度/8)的分片,依此类推。
-
-
拼接数据:直接将各个分片的数据块按顺序连接起来。由于IP分片时,每个分片(除了最后一个)的数据长度一定是8字节的倍数,所以拼接时边界是对齐的,不需要特殊处理。
-
重构IP头部:重组完成后,会生成一个完整的IP数据报。这个新数据报的IP头部以第一个分片(偏移量为0的那个分片)的IP头部为蓝本,并进行以下修改:
-
总长度:更新为原始完整数据报的总长度。
-
标志:
MF位设置为0。 -
分片偏移:设置为0。
-
头部校验和:根据新的头部信息重新计算。
-
-
递交上层:将这个重组后的、完整的IP数据报传递给传输层(如TCP或UDP)进行处理。
分片组装示意图




4万+

被折叠的 条评论
为什么被折叠?



