計算機網路自學筆記:多路複用與多路分解
本文討論傳輸層的多路複用與多路分解,也就是將網路層所提供的主機到主機交付服務擴充套件到為在主機上執行的應用程式所提供的程序到程序交付服務。
在目的主機,傳輸層從緊鄰其下的網路層接收報文段。傳輸層負責將這些報文段中的資料交付給在主機上執行的合適的應用程序。
一個例子:假定你正坐在計算機前下載Web頁面,同時還在執行一個FTP會話。此時你就有2個網路應用程序在執行,即一個FTP程序和一個HTTP程序。當計算機的傳輸層從底層的網路層接收資料時,它需要將所接收到的資料定向到這2個程序中的一個。
接收主機中的傳輸層通過一個套接字來傳遞資料。由於在任何一個時刻接收主機上可能有多個套接字,所以每個套接字都必須有唯一的識別符號。
在每個傳輸層報文段中包含了兩個埠號欄位,在接收端,傳輸層檢查這些欄位並標識出接收套接字,然後將報文段定向到該套接字。
可以將一個套接字理解成兩小段記憶體空間:傳送快取和接收快取,這兩段儲存空間通過套接字的變數名來標識。
將傳輸層報文段中的資料放置到正確的套接字的工作稱為多路分解,確切地說,多路分解其實是多路分發,或者說是資料流的分解 。 資料交付到特定套接字的工作也就是將資料放到正確的儲存位置的過程。 從源主機的不同套接字中收集資料塊,井為每個資料塊封裝上首部資訊(在多路分解時使用)從而生成報文段,然後將報文段傳遞到網路層的工作稱為多路複用 。
傳輸層多路複用的要求: 1套接字有唯一識別符號,2每個報文段有特殊欄位來指示該報文段所要交付的套接字。 這些特殊欄位最重要的是源埠號欄位(source port number field)和目的埠號欄位(destination port number field)。
埠號是一個16位元的數字,其大小在0-65535之間。0-1000範圍的埠號稱為周知埠號,它們是保留給諸如HTTP和FTP之類的公有的應用層協議的。
當一個網路應用程式執行時,必須為其分配一個埠號。
[if !supportLists]1.[endif] 無連線的多路複用與多路分解 假定主機A中的一個程序具有的UDP埠號為9157,它要傳送一個應用程式資料塊給主機B中的另一程序,該程序具有的UDP埠號為6428。主機A中的傳輸層建立一個傳輸層報文段,其中包括應用程式資料、源埠號9157、目的埠號6428和兩個其他欄位。然後,傳輸層將生成的報文段傳遞到網路層。 網路層將該報文段封裝到一個IP資料報中,並盡力而為地將報文段交付給接收主機。如果該報文段到達接收主機B,接收主機傳輸層就檢查該報文段中的目的埠號6428,並將該報文段傳遞給埠號6428所標識的套接字。注意到主機B能夠執行多個程序,每個程序有自己的UDP套接字及對應的埠號。當從網路接收到達的UDP報文段時,主機B通過檢查該報文段中的目的埠號,將報文段定向(多路分解)到相應的套接字。
因此, 一個UDP套接字是由一個包含目的lP地址和目的埠號的二元組來標識的 。 因此,如果兩個UDP報文段有不同的源IP地址或源埠號,但具有相同的目的IP地址和目的埠號,那麼這兩個報文段將通過相同的目的套接字定向到相同的目的程序。
在A到B的報文段中,源埠號作為“返回地址”的一部分,即當B需要發回一個報文段給A時,B到A的報文段中的目的埠號便從A到B的報文段的源埠號中取值。
2.面向連線的多路複用與多路分解
TCP套接字是由一個四元組(源IP地址,源埠號,目的IP地址,目的埠號)來標識的。
這樣,當一個TCP報文段從網路到達一臺主機時,主機使用這4個值來將報文段定向(多路分解)到相應的套接字。
在TCP伺服器程式接受客戶機連線,accept()函式建立並返回一個新的連線套接字用於與客戶機的通訊,並將這個套接字與請求報文段中的4個值: 1該報文段中的源埠號,2源主機 IP 地址,3該報文段中的目的埠號,4自身的 IP 地址建立關聯。 也就是說新建立的連線套接字通過這4個值來標識。
所有後續到達的報文段,如果它們的源埠號、源主機IP地址、目的埠號和目的IP地址都與這4個值匹配,則被多路分解到這個套接字。
為什麼使用4元組呢?

例如主機B向伺服器C發起了兩個HTTP會話(兩個瀏覽器視窗),主機A向伺服器C發起了一個HTTP會話。主機A與主機B及伺服器C都有自己的唯一IP地址,主機B為其兩個連線分配了兩個不同的源埠號(5775和9157)。因為主機A獨立選擇源埠號,因此它也可能將源埠號9157分配給其HTTP連線。
對於伺服器C來說,它得區分不同的瀏覽器連線請求,對於每個請求,它都有相應的套接字(套接字具有不同的傳送/接收快取)與之對應。它要分發不同主機瀏覽器過來的請求,並返回不同的響應訊息給客戶機。
目的埠號:C伺服器運行了不同的應用,顯然,只有web伺服器使用了80埠,應此C伺服器在轉發報文段給應用的時候要看這個欄位。
目的IP地址:一般伺服器都有兩個網絡卡,也就是說它會有兩個IP地址,所以伺服器C得區分一個請求從哪個網絡卡進來,以便返回響應訊息。事實上只有一塊網絡卡的時候也是可以繫結多個IP地址的,這是大家需要注意的。
源埠號:伺服器C返還訊息時使用,例如伺服器C返還給B的響應訊息,即使來自同一個主機,也需要放入不同瀏覽器頁面的套接字。因此C必須區分來自同一主機不同瀏覽器視窗的請求。
源IP地址:A和C的瀏覽器頁面即使使用了相同的埠號,但這兩個連線有不同的源IP地址,C也需要進行正確地區分。
3 Web 伺服器與 TCP 執行Web伺服器的主機,通常在埠80監聽請求。當客戶機(如瀏覽器)向伺服器傳送報文段時,所有報文段的目的埠都為80。如前所述,伺服器能夠根據源IP地址和源埠號來區分來自不同客戶機的報文段。但是套接字與程序之間並非總是有著一一對應的關係。事實上,Web伺服器通常一個服務程序可以為每個新的客戶機連線建立一個具有新連線套接字的執行緒。顯然,對於這樣的伺服器,在任意給定的時間內都可能有很多套接字(具有不同的標識)連線到同一個程序。