天天看點

分段和重組

  對于不同的網絡,其中傳送的包大小可能不一樣,是以把大包分小的功能是必須的。分段是将資料分組分割成小塊以便它們能夠适合基礎網絡的幀。資料報也可以被标記為“不可分段”,如果一個資料報被标記了,那麼在任何情況下都不準對它進行分段。如果不分段到不了目的地,那就把包在半路抛棄了。在本地網内進行的重新分段和重組對IP子產品是不可見的,這種方法也可以使用。

接收系統将這些分段重新組裝成原始的資料分組。對段的重組要求以下四個域有相同的值:标記,源位址,目标位址和協定。将不同的資料報根據自己帶的偏移量重新組合為新段,第一個段的偏移量為0,最後一個段的多段标記為0。

MTU(最大傳輸單元)一詞指一個幀中能夠傳輸的最大資料量。不同的網絡有不同的MTU大小,是以可能需要将資料分組分段以符合傳輸它們的網絡的幀大小。圖F-8闡釋了該過程。

分段和重組

圖F-8 将資料分組分段以符合它們必須跨越的網絡的幀大小網際協定(如IP)使用分段,因為資料分組在其中傳輸的每個網絡都可能有不同的幀大小。分段發生在連接配接兩個具有不同MTU的網絡的路由器中。雖然有可能設計出具有相同MTU大小的内部網絡,但對于網際網路它并不是很好的選擇,因為網際網路包括幾幹個獨立管理的、互相連接配接的網絡。

因為分段會降低性能,是以它總是不合需要的。事實上,在IPv6中,就不允許分段。大的資料分組總是更可取的,特别是大檔案在高性能網絡中傳輸時。但是有些時候,試圖消除或減少分段可能會引起額外的問題。IPv6通過依靠終端系統來發現MTU整個的傳送路徑進而嘗試消除對分段的需求。它被稱為路徑MTU發現,IPv4中已經使用,這在後面有讨論。IPv6将加強這一點。一個重要的概念是每個分段都變成一個新的、更小的IP資料報。這是因為一個新的IP頭被附加到資料報中,該資料報包含原始資料報IP頭的許多資訊以及與分段過程相關的資訊。新的IP資料報被放入基礎網絡的某個幀中。後面讨論并圖示了該過程。新資料報(IP頭加上資料)的總的大小不能超過該網絡的MTU。 

隻有目的地對分段的資料分組進行重組。傳輸路徑中的路由器從不執行重組。想一想資料分組被分段後,它的分段可能會不再采用不同的路徑到達目的地。所有的分段再次出現的惟一地點就是目的地。接收器啟動計時器并開始将分段放入緩沖器中,他們被保留在那裡直到所有的分段都到達。如果隻是某一個資料分組分段未能出現在目的地,則整個資料分組必須重新傳輸,因為沒有請求和重新傳輸單個分段的機制。

因為TCP段進入IP資料報而IP資料報進入基礎網絡的幀,它們中間有一些有趣的關系。首先,TCP段不能大于IP資料報減去IP頭。IP資料報的最大大小是65535Byte減去IP頭(大小可能在20到60Byte之間)。其大小以4Byte的增量變化,這取決于頭選項的設定。極少的資料鍊連接配接具有能容納65K資料報的MTU。以太網的MTU是l500Byte,FDDI的MTU是4500Byte。

下面是一些影響分段大小的其他因素:

每個IP資料報分段必須是8Byte的倍數。

IP頭被添加到IP資料報分段中,是以總的分段大小等于(資料分段+IP頭)。

MTU指定所允許的最大分段大小(分段+IP頭)。 

因為分段必須是8Btye的倍數,總的分段大小可能并不總是等于MTU。假設MTU是512Byte,頭大小是20Byte (如果不使用選項,頭大小為20Byte)。因為IP資料報隻能以8Byte的倍數來分段,該示例網絡的最大分段大小(在添加頭之前)添加頭之前,是488Byte。添加頭後,總的分段大小為508Byte,處于5l2Byte的MTU限制範圍内。請注意8的下一個倍數是496Byte。加上頭之後總的分段大小就是5 l6Byte,超出了MTU範圍。

下列字段是IP頭中使用的,用來提供分段資訊和控制:

資料分組辨別符 一個l6bit的字段,使用一個惟一的編号辨別所有分段的資料分組。在接收器處理完所有的分段之前,該編号不能被再次使用。

分段偏移 為接收器提供資訊以将分段重組成原始的資料分組。改值表明分段中的資料相對于資料開始處的位置。

不分段标志 當設定為1時,不使用分段資料報進行傳輸。如果不能做到,資料報将會丢失,并将傳回一條出錯消息到發送器那裡(使用 ICMP)。該标志可用于“scout”資料分組,發送這些資料分組以确定網絡中可以發送的最大 MTU。請參閱後面的“路徑MTU發現”一節。

更多分段标志 當設定為1,該标志表明将會有更多分段。0則表示資料分組是最後一個分段。 

圖F-9闡釋了一個l300By泌的資料報是如何被分段成網絡中的三個資料報的,其中該網絡中的MTU為500Byte(為清楚起見,值都被四舍五入)。

分段和重組

圖F-9分段過程

路由器必須接受具有指定MTU大小的挂接網絡的資料報。而且它們還必須接受大小為576Byte的最小資料報,該值是在1983年RFC 879為了幫助供貨商建立能夠共同操作的路由器而定義的。RFC 879中的規則指定“主機不能發送大于576Byte的資料報,除非它們明确知道目标主機已準備好接受更大的資料報”。現在,大多數路由器支援l500Byte的MTU,但是在具有未知MTU大小的非本地網絡中傳輸時仍然使用最小值。通常,網際網路中的網絡現在都支援576Byte的最小MTU。

RFC 879中制定的規則的另一部分是最大的TCP段大小(資料進入IP資料報,而IP資料報則會分段)等于最大的IP資料報大小加上40Byte的頭。是以,最大的TCP段大小是536Byte(576Byte減去40Byte)。

大多數作業系統都提供有更改MTU大小的方法。例如,在Windows 98,可以按如下方式檢視并更改撥号網絡的設定。打開“控制台”中的“網絡”實用程式,單擊“配置”頁籤,選項“撥号擴充卡”,然後單擊“屬性”。在“進階”頁籤中,單擊“IP資料分組大小”。出現下列可用的值:  自動預設設定 大 1500Byte

中 1000Byte  小 576Byte  在“自動”模式中,所有低于128kbit/s的PPP連接配接都使用576Byte的MTU,而高于128kbit/s的連接配接則使用1500Byte的MTU。

路徑MTU發現

最大轉移機關(MTU)是對單個傳輸的資料位元組最大号碼限制的連結層。路徑MTU是源節點和目标節點之間的路徑中的所有連結中的最小MTU。路徑MTU發現是一個過程,在這個過程中,資料分組就像“scout”一樣被發送到網絡中以發現最小的路徑MTU。發現最小的MTU後,發送器可使用該值作為最大的IP資料報大小,以便在傳輸過程中不用分段資料分組。如前所述,分段會增加開銷并降低性能。隻要可能就應該使用大的資料分組。

MTU路徑的發現過程

我們使用非碎片比特在IP頭資訊作為動态地發現一條給定的線路的路徑MTU标記。消息提供者承擔一條路徑的PMTU是已知的MTU的第一個中斷段。

他需要發送所有的資料包并且設定非段位。

如果沿着目的主機的路徑,有一路由器需要資料包到片段為了把它傳遞給下一個中斷段,如果非段位被設定,将産生一條ICMP錯誤消息(類型3代碼4“段需要和DF設定”)。

當發送主機收到ICMP錯誤消息時應該減少假定的PMTU。

當估計的PMTU是足夠低的資料包不成碎片時程序能結束。在一些時候形成碎片的資料包,消息提供者自己能停止該過程。DF位通常被加裝在所有的資料包,如果一條路由變化成目的主機,并且PMTU降低,我們就能發現借此發現它。

因為在路由上拓撲的變化,一條路徑的PMTU可能會增加。為了能夠檢測到它,發送主機應為此連結周期性地增加假定的PMTU。在ICMP中的MTU連結領域 " 碎片存儲需要和DF設定 "的錯誤資訊攜帶MTU跳躍,使來源主機能夠知道他需要設定PMTU那條路徑以外允許資料包的傳送的準确的值(路由器)沒有碎片。

路徑MTU發現的工作原理如下:

1.發送器傳輸資料分組(通常是本地網絡的預設大小)并将“不分段”标志設定為1。

2.如果資料分組大于網絡中的任何MTU,連接配接到該網絡的路由器将會丢失資料分組并傳回給發送器一條ICMP消息。該消息訓示如果資料分組不分段,将無法轉發而且還包含引起問題的網絡的MTU。

3.發送器再次嘗試新的資料分組大小并從第l步開始處理。連接配接到某個具有更小MTU的網絡的路由器可能丢失資料分組并傳回一條錯誤消息。 

通過使用路徑MTU發現,系統可以在多個使用盡可能最大的資料分組的網絡中發送資料分組而不用支付分段及重組的開銷。

但是,路徑MTU發現也有它自己的成本。實際的資料直到發現最好的MTU以後才傳輸,這就造成了延遲。使用新的MTU大小,幾個路由器可能都傳回錯誤消息。而且,發現資料分組使用網絡帶寬并需要網絡中路由器的額外處理。盡管如此,人們認為這種帶寬的使用以及處理還是比分段資料報要優越。

轉自:http://baike.eccn.com/baike/index.php?doc-view-1025

繼續閱讀