當數據超過底層允許最大字節時(一個以太幀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為具體的分片數據。