IP分片与组装

Posted 我要出家当道士

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IP分片与组装相关的知识,希望对你有一定的参考价值。

  摘要

      下面将主要介绍ip的分包与组包;分包的思路很简单,难点在于组包的逻辑设计。

  IP分片的原因

      简单的来说,数据链路层规定了物理网络的最大传输单元 MTU,这个值体现了设备的网络收发能力,该值因设备而异,默认值为 1500 个字节。网络层收到传输层的数据报后需要先判断往哪个网卡发包,并获取该网卡的 MTU值,如果数据包长度大于 MTU,则需要将数据包分片。

  如何进行分片

      首先讲一下分片的规则,以 UDP 数据报为例(图画的比较粗略,读者别计较协议头部的长度比例呀),假设下图中 data0 长度 大于 MTU,在发送的时候 ip 会将该包进行分片,分成如下两个包(假设分两个包就可以了,分包数量根据 UDP 数据报长度而定),则满足 data0 = data1 + data2.而且UDP头部只在第一个包中出现,之后的包不再添加 UDP 头部;另一方面 IP 头部是必须加在每个数据包的前面的。这是因为 ip 分片之后的每个 fragment 都会独立的在互联网中传输,所以 ip 是必须的。

在这里插入图片描述

  如何进行组装

      组装 ip fragment 需要用到 ip 头部中的 Identification、Source Address、Destination Address、Flags 和 Fragment Offset 字段。 ip 头部结构与这几个字段的释义如下。接收端通过 (Identification,Source Address、Destination Address)三元组可以唯一的确定 IP 包的身份,属于同一个 IP 包的 fregment,具备同一个三元组。之后通过 DF 与 MF 可以判断是否分包,以及后续是否还有 fragment。Fragment Offset 字段用于重组包时进行排序使用,使用时注意该值的单位是 8 byte,举个例子:该值为100时,说明需要偏移 800 byte。

在这里插入图片描述

字段释义
Identification标识,主机每发一个报文,加1,分片重组时会用到该字段。
Flags标志位,分为 0、DF 和 MF。DF(Don’t Fragment):能否分片位,0表示可以分片,1表示不能分片;MF(More Fragment),表示是否该报文为最后一片,0表示最后一片,1代表后面还有。
Fragment Offset片偏移:分片重组时会用到该字段。表示较长的分组在分片后,某片在原分组中的相对位置。以8个字节为偏移单位。
Source Address源IP地址。
Destination Address目的IP地址。

  实现思路(DPDK)

      下面简单介绍 DPDK 中分片与组装的思路。通过三元组建立 hash 表以快速的找到接收端未完成组装的包,未完成组装的包都存放在链表当中(新接收的数据包放尾部),如果完成组装后是释放响应的资源。如果链表满了,则删除链表头部已经过时的数据包。

在这里插入图片描述

以上是关于IP分片与组装的主要内容,如果未能解决你的问题,请参考以下文章

Linux网络编程 -ip

Linux网络编程 -ip

tcp分片和ip分片的区别

TCP/IP协议簇之网络层

TCP/IP协议簇之网络层

[Linux] Linux网络之网络层协议详解