IP切片及重组

分片:就是当一个skb包长度大于传输设备或者链路上物理设备的mtu时,会根据一定的方式进行切割,从而使报文得以发送出去。但是这里需要说明,分片又分为IP和TCP分片两种,由于tcp报文有自己的机制去分片,不需要依赖IP层分片;而对于udp或者icmp等报文,只能依赖IP层去分片。

分片与重组关系:IP协议理论上允许的最大IP数据报为65535字节(16位来表示包总长)。但是因为协议栈网络层下面的数据链路层一般允许的帧长远远小于这个值,例如以太网的MTU(即Maximum Transmission Unit,最大传输单元)通常在1500字节左右。假如我们需要传输一个字节为4600的数据,则我们需要将其分为四片。所以较大的IP数据包会被分片传递给数据链路层发送,分片的IP数据报可能会以不同的路径传输到接收主机,接收主机通过一系列的重组,将其还原为一个完整的IP数据报,再提交给上层协议处理。

IP数据报格式:

把一份IP数据报文分片以后,只有到达目的地才进行重新组装,这里的目的地是指IP报文传送的下一站,而不是最终的目的地,因此分片和重新组装的过程对传输层是透明的。

在IP报头中,16位标识、3位标志、13位段偏移就是用于IP报文的分片与重组的。其中标识字段长度为16比特,用于标识一个IP数据报。也就是说当发送端将某个较大的IP报文分片进行传输时,其中每个分片的标识字段都是相同的,代表这些分片是属于同一个数据报。段偏移字段13比特,用于指示该片在原始数据报中所处的位置。

标志字段有三位,其中第一位未使用;第二位用于指出是否要对数据报分段,称为“请勿分段(DF)”位,如果该位的值设置为1,表示该数据报不能分段。如果必须对数据报分段,而DF位又置为1,则数据报会被丢弃,并向源端发送一个ICMP差错报文;第三位用于指出当前分段后面是否还有更多的分段,如果此位置0,表示当前分段是数据报的最后一个分段。

分片函数:

ip_fragment(int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)))

首先ip_fragment必须处理如下两种情况:

<1>必须切成小块的大数据,要切割大数据就需要分配新的缓冲区,并且在大的缓冲区和小缓冲区见做内存的拷贝。

<2>不需要再分片的数据链表或数组,如果分配的缓冲区又足够的空间新增较抵层的L3头和L2头,则ip_fragment处理这些缓冲区不需要进行内存拷贝。ip层要做的就是

重组函数:

int ip_defrag(struct sk_buff *skb,u32 user)

IP分片的优点是它为上层协议提供了一个透明的传输管道,使上层协议不必关心底层硬件技术,缺点是:在传输过程中,即使丢失其中的一片数据也要重传整个数据报。

时间: 2024-10-17 09:08:43

IP切片及重组的相关文章

Lwip IP包分片重组

1. 开发环境 操作系统:SylixOS 编程环境:RealEvo-IDE3.1 硬件平台:AT9x25开发板 2. 技术实现 SylixOS系统使用的网络协议栈是Lwip协议栈.Lwip是Light Weight (轻型)IP协议,有无操作系统的支持都可以运行.Lwip实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用,它只需十几KB的RAM和40K左右的ROM就可以运行,这使Lwip协议栈适合在低端的嵌入式系统中使用. Lwip协议栈主要关注的是怎么样减少内存的使用和代码的大小

IP 层收发报文简要剖析3--ip输入报文分片重组

在ip_local_deliver中,如果检测到是分片包,则需要将报文进行重组.其所有的分片被重新组合后才能提交到上层协议,每一个被重新组合的数据包文用ipq结构实例来表示 struct ipq { struct inet_frag_queue q; u32 user;//分片来源 __be32 saddr;//原地址 __be32 daddr;//目的地址 __be16 id;//ip报文序列号 u8 protocol;//上层协议号 //这四个字段来自ip首部是为了确定来自哪个ip数据报文

TCP的分段和IP的分片

写在前面: 分组可以发生在运输层和网络层,运输层中的TCP会分段,网络层中的IP会分片.IP层的分片更多的是为运输层的UDP服务的,由于TCP自己会避免IP的分片,所以使用TCP传输在IP层都不会发生分片的现象. 我们在学习TCP/IP协议时都知道,TCP报文段如果很长的话,会在发送时发生分段,在接受时进行重组,同样IP数据报在长度超过一定值时也会发生分片,在接收端再将分片重组. 我们先来看两个与TCP报文段分段和IP数据报分片密切相关的概念. MYU(最大传输单元) MTU前面已经说过了,是链

linux ip 层实现读后感

看了linux IP层的代码,这里做一个简单总结,具体对照上图说明: 下层报文由路径PRE_ROUTING进入IP层,在RT节点经过路由决策将目地为本机的报文通过LOCAL_IN路径送至上层协议.非本机的报文由FOWARDING到达EM节点,而由本地产生的报文在RT节点经过路由决策后将通过LOCAL_OUT进入EM节点.流至EM节点的所有报文将通过POST_ROUTING流出IP层. IP分片和重组是相当重要的,IP重组发生在LOCAL_IN路径上,即对到达本机的报文使用IP重组. IP分片实际

TCP/IP具体解释--TCP的分段和IP的分片

写在前面: 分组能够发生在运输层和网络层.运输层中的TCP会分段,网络层中的IP会分片.IP层的分片很多其它的是为运输层的UDP服务的,因为TCP自己会避免IP的分片,所以使用TCP传输在IP层都不会发生分片的现象. 我们在学习TCP/IP协议时都知道.TCP报文段假设非常长的话,会在发送时发生分段.在接受时进行重组,相同IP数据报在长度超过一定值时也会发生分片,在接收端再将分片重组. 我们先来看两个与TCP报文段分段和IP数据报分片密切相关的概念. MYU(最大传输单元) MTU前面已经说过了

Linux内核--网络栈实现分析(四)--网络层之IP协议(上)

本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7514017 更多请看专栏,地址http://blog.csdn.net/column/details/linux-kernel-net.html 作者:闫明 注:标题中的”(上)“,”(下)“表示分析过程基于数据包的传递方向:”(上)“表示分析是从底层向上分析.”(下)“表示分析是从上向下分析. 简单分析了链路层之后,上升到网络

TCP/IP协议族——IP工作原理及实例详解(上)

 IP协议详解 本文主要介绍了IP服务特点,头部结构,IP分片知识,并用tcpdump抓取数据包,来观察IP数据报传送过程中IP的格式,以及分片的过程. IP头部信息:IP头部信息出现在每个IP数据报中,用于指定IP通信的源端IP地址.目的端IP地址,知道IP分片和重组. IP数据报的路由和转发:IP数据报的路由和转发发生在出目标机器之外的所有主机和路由器上.他们决定数据报是否应该转发以及如何转发. IP服务的特点 IP协议是TCP/IP协议族的动力,它为上层协议提供无状态.无连接.不可靠的

TCP/IP协议族——IP工作原理及实例具体解释(上)

?? IP协议具体解释 本文主要介绍了IP服务特点,头部结构,IP分片知识,并用tcpdump抓取数据包.来观察IP数据报传送过程中IP的格式,以及分片的过程. IP头部信息:IP头部信息出如今每一个IP数据报中,用于指定IP通信的源端IP地址.目的端IP地址,指导IP分片和重组. IP数据报的路由和转发:IP数据报的路由和转发发生在出目标机器之外的全部主机和路由器上.他们决定数据报是否应该转发以及怎样转发. IP服务的特点 IP协议是TCP/IP协议族的动力.它为上层协议提供无状态.无连接.不

第二章、IP协议详解

一.IP服务的的特点 IP协议是TCP/IP协议族的动力,他为上层协议提供的无状态无连接,不可靠的服务. 无状态是指IP通信双方不同步传输数据的状态信息,因此所有的ip数据报的发送,传出和接受都是相互独立的,没有上下文的联系.这种服务最大的缺点就是无法处理乱序和重复的IP数据报.比如,发送端发送出的第N个数据包可能逼第N+1个报文段后到达接收端,而同一个IP数据报也可能经过不同的路径多次到达接收端.IP数据报头部提供了一个标识字段用以唯一的标识一个 IP数据报,但它是被用来处理IP分片和重组的,