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必須為已發送的數據保留一個副本,直到它被對端確認為止。