Pv4數據報的最大值是65535字節,包括IPv4首部。
IPv6數據報的最大值是65575字節,包括40字節的首部。
MTU:IP數據報的最大傳輸單元,以太網的MTU是1500字節。
IPv4要求的最小鏈路MTU是68字節。
IPv6要求的最小鏈路MTU是1280字節。
若是一個IPv6的數據報的值小於要求的最小值1280字節,那麼就須要進行重組和分片,以使得這些鏈路看起來具備至少爲1280字節的MTU。
在兩個主機之間的路徑中最小的MTU稱爲路徑MTU。1500字節的以太網MTU是當今常見的路徑MTU。
若是數據報的大小超過了相應鏈路的MTU,IPv4和IPv6都將進行分片,這些分片在到達目的主機以前一般不會被重組。
IPv4主機對其產生的數據報進行分片,IPv4路由器對其轉發的數據報執行分片,可是IPv6只有主機對其產生的數據報執行分片,IPv6路由器不對其轉發的數據報執行分片。
IPv4的首部的"不分片「位(即DF位)若被設置,那麼無論是發送這些數據報的主機,仍是轉發這些數據報的路由器,都不容許對它們進行分片,當IPv4路由器接收到一個超過其外出鏈路MTU大小且設置了DF位的IPv4數據報時,它將產生一個ICMPV4"destination unreachable,fragmentation needed but DF bit set"(目的地不可達,需分片但DF位已設置)出錯消息,當IPv6路由器接收到一個超過其外出鏈路MTU大小的IPv6數據報時,它將產生一個ICMPv6"packet too big"(分組太大)出錯消息。
IPv4的DF位可用於路徑MTU發現,若是一個TCP是基於IPv4的,那麼它將在所發送的全部數據報中設置DF位。若是某個中間路由器返回一個ICMPV4"destination unreachable,fragmentation needed but DF bit DF bit set錯誤,那麼TCP就減小每一個數據報的數據量並重傳。
TCP有一個MSS(maximum segment size,最大分節大小),用於向對端TCP通告對端在每一個分節中能發送的最大TCP數據量。MSS的目的是告訴對端其重組緩衝區大小的實際值,從而試圖避免分片。MSS常常設置成MTU減去IP和TCP首部的固定長度。在以太網中使用IPv4的MSS值爲1460,使用IPv6的MSS值爲1440。
TCP輸出
每個TCP套接字有一個發送緩衝區,當某個進程調用write時,內核從該應用進程的緩衝區中複製全部數據到所寫套接字的發送緩衝區。若是該套接字的發送緩衝區容不下該應用進程的全部數據,該應用進程將被投入睡眠,這裏假設該套接字是阻塞的,它是一般的默認設置,內核將不從write系統調用返回,直到應用進程緩衝區中的全部數據都複製到套接字發送緩衝區。所以,從寫一個TCP套接字的write調用成功返回僅僅表示咱們能夠從新使用原來的應用進程緩衝區,並不代表對端的TCP或應用進程已接收到數據,對端TCP必須確認收到的數據,伴隨來自對端的ACK的不斷到達,本端TCP至此才能從套接字發送緩衝區中丟棄已確認的數據。TCP必須爲已發送的數據保留一個副本,直到它被對端確認爲止。