IP分片与组装

  摘要

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

  IP分片的原因

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

  如何进行分片

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

IP分片与组装_第1张图片

  如何进行组装

      组装 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。

IP分片与组装_第2张图片

字段 释义
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分片与组装_第3张图片

你可能感兴趣的:(计算机网络,IP,分片,组装,计算机网络,网络层)