TCP/IP 协议难点之一—— IP分片

1 IP协议简单介绍

就我的而言,网络中,抛开网络安全加密这些,就只单单讨论协议自己,比较难的有三个地方: 安全

  • IP分片与重组
  • TCP滑动窗口与TCP状态的改变
  • TCP定时器

其实协议自己根据《TCP/IP详解卷1》理解起来并不难,可是实现起来就很难:数据的操做,标志位的设置,网络状态的变换,中断多线程通信等等;网络

在下图的七层网络协议参考模型中,IP层属于网络层,网络层最主要的做用就是:将指定IP的数据报传输到对应的主机。多线程

网络七层参考模型

下图是以太帧封装格式(RFC 894),RFC 894封装格式也是咱们最经常使用的。加密

下面作个简单介绍:线程

  • 目的地址:6字节,即咱们常说的以太网物理地址,这里是目标主机的物理地址,物理地址为惟一的。你们可能疑惑,发送网络数据时只写了IP地址,并无写目的地址啊。这个是底层协议实现的,根据ARP协议,首先将目的地址设为全1,而后根据IP地址来获取目的地址。
  • 源地址:6字节,发数据时本身的物理地址。
  • 类型:2字节,协议类型,好比0x0800表明IP协议,0x0806表明ARP协议等等
  • 数据:802.3标准规定,一个以太帧最少64字节,最大1518字节,那么去掉6字节目的地址、6字节源地址、2字节类型、4字节CRC,对应区间即为48~1500字节,若是不足48字节能够填充。
  • CRC:顾名思义,校验部分,因此网络数据是很准确的,并且绝大多数都支持硬件CRC校验,速度很是快,几乎不会在这上面消耗时间。

下面再看看数据部分:IP数据报指针

IP数据报封装

图中从左到右为0~31位,共四个字节,从上到下依次增加,IP头部占20字节,剩下的为数据,若是传输层为TCP则还有20字节的TCP头部,若是是UDP则还有8字节(若是分片的话,中间的包没有UDP头部,即0字节)的UDP头部。剩下的才是真正的用户要传送的数据。能够看出传送一样多的数据,UDP协议要比TCP传送的数据多,但从这一点来讲UDP速度也要比TCP快。code

下面对一些字段作个简单介绍:blog

  • 4位版本:好比IPv四、IPv6
  • 4位手部长度:指的是首部占32 bit字的数目,包括任何选项。因为它是一个4比特字段,所以首部最长为60个字节
  • 16位总长度:一共16位,理论最大长度为65535字节,可是受硬件限制,和其它方面的考虑,大部分路由器或主机支持8192字节。
  • 3位标志:标识是否IP分片.第一位无用,第二位0:容许分片,1:不容许。第三位0:最后一片,1:后面还有分片
  • 13位片偏移:此分片在原始数据的偏移,用于分片重组,由于13位,因此支持的最大字节为8192
  • 8位生存时间TTL:规定网络数据包在网际层传输时,最多能够通过路由器的个数,它的大小通常为256/64,每通过一个路由值就会减1,当它为0时,数据会被丢弃,并回传一个ICMP包来通知发送者。

2 IP分片

从上面的介绍咱们知道,一个以太帧最大为1518字节 (14字节以太首部,20字节IP首部,UDP8/TCP20,所以IP包每次最大为1500==MTU。去掉协议头UDP有效数据1472字节,TCP为1460字节。还有最后的4字节CRC),可是一个IP数据报则可能会有8192字节,超过以太帧的最大限制,那么这时就须要IP分片,分批进行传输。排序

发送方会在IP层将要发送的数据分红多个数据包分批发送,而接收方则将数据按照顺序再重新组织起来,等接收到一个完整的数据报以后,而后再提交给上一层传输层。网络安全

注意,TCP协议为可靠的传输协议,它避免了IP分片的发生,它会在TCP层对数据进行处理,对数据进行分段(不在详述),IP分片用的多的在UDP协议

咱们知道,协议自己并无对数据在各个层中间怎么传递作出要求,好比嵌入式实现和BSD实现就不太同样,由于嵌入式内存比较少,数据在层与层之间传递时会尽可能避免数据拷贝,而只是指针的操做。下面咱们以嵌入式中用的比较多的LwIP举例

LwIP容许的最大IP由以下决定:IP_REASS_MAX_PBUFS决定IP分片容许最大pbuf数量,IP_REASS_MAXAGE分片的生存时间,超过则错误并将以前接收的IP分片丢弃。

若是数据大于IP_REASS_MAX_PBUFS则有两种选择,一,直接删除数据返回;二,是删除生存时间最长的IP分片PBUF,这个经过IP_REASS_FREE_OLDEST来使能。

当为UDP协议时,若是缓冲区描述符大小小于完整的IP数据包,IP分片数据包到来时,很快将描述符耗尽,后来的IP包因为无缓冲区描述符而丢弃,UDP没有重传机制,极可能永远不会接收到完整的IP分片包。从而大于IP_REASS_MAXAGE出现错误,所以缓冲区描述符也应增大以适应IP分片重装。

TCP发送数据时,将大于MSS的数据分段(segment不叫分片),MSS通常为1460.因此,TCP数据包不会在IP层分片。

IP头部有3位标志字段,标志是否为分片包。第一位无用,第二位0:容许分片,1:不容许。第三位0:最后一片,1:后面还有分片。13位offset表示偏移,用于IP重组时数据排序,13位所以支持最大IP数据包为8192字节。

标准的BSD协议实现以下图所示,采用两个结构体,IPQ为表头,将各个IP分片表头链接起来,并存储IP信息。Ipasfrag为具体的分片数据。

BSD实现

相关文章
相关标签/搜索