IP分片

  当数据超过底层允许最大字节时(一个以太帧1514字节,14字节以太首部,20字节IP首部,UDP8/TCP20,因此IP包每次最大为1500==MTU。去掉协议头UDP有效数据1472字节,TCP为1460字节。)会进行IP分片。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为具体的分片数据。

 

IP分片

你可能感兴趣的:(IP)