一、什麼是多路復用和多路分解
為了說明這個問題,先來補充一下
作業系統方面的知識,以linux對檔案和裝置的管理和使用方式為例。
為了方便資源的使用,提高機器的效能、利用率和穩定性等等原因,我們的計算機都有一層軟體叫做作業系統,它用於幫我們管理計算機可以使用的資源,當我們的程式要使用乙個資源的時候,可以向作業系統申請,再由作業系統為我們的程式分配和管理資源。通常當我們要訪問乙個核心裝置或檔案時,程式可以呼叫系統函式,系統就會為我們開啟裝置或檔案,然後返回乙個檔案描述符fd(或稱為id,是乙個整數),我們要訪問該裝置或檔案,只能通過該檔案描述符。可以認為該編號對應著開啟的檔案或裝置。
而當我們的程式要使用網路時,要使用到對應的作業系統核心的操作和網絡卡裝置,所以我們可以向作業系統申請,然後系統會為我們建立乙個套接字socket,並返回這個socket的id,以後我們的程式要使用網路資源,只要向這個socket的編號id操作即可。而我們的每乙個網路通訊的程序至少對應著乙個socket。向socket的id中寫資料,相當於向網路傳送資料,向socket中讀資料,相當於接收資料。而且這些套接字都有唯一識別符號——埠號。
有了上面的了解後,再來說說
什麼是多路分解和多路復用。
每個運輸層的報文段中設定了幾個字段,包括源埠號和目的埠號等。多路分解就是,在接收端,運輸層檢查這些欄位並標識出接收套接字,然後將該報文定向到該套接字。其工作方式可以簡單地認為是這樣的,主機上的每個每個套接字被分配乙個埠號,當報文到達主機時,運輸層檢查報文段中的目的埠號,並將其定向到相應的套接字。
多路復用就是從源主機的不同套接字中收集資料塊,並為每個資料塊封裝上首部資訊從而生成報文段,然後將報文段傳遞到網路層中去。
二、無連線的多路復用和多路分解
在運輸層,無連線的網路傳輸是通過udp來實現的。udp報文中只有源埠號和目的埠號,乙個udp套接字是由乙個含有目的ip位址和目的埠號的二元組來全面標識的。在客戶端,源埠號是客戶程序套接字的埠號,目的埠號是伺服器的埠號。而在伺服器端,源埠號是伺服器的建立的套接字的埠號,而目的埠號是客戶端的套接字的埠號。
例如主機a產生了乙個udp報文段,報文段中就會包括源埠號(11111)、目的埠號(22222)、程式資料(還有兩個其他的值,在這裡我們不關心)。然後,運輸層將生成的報文段交給網路層。網路層將其放到乙個ip資料報中,並提供盡力而為的交付,將其傳送到主機b中。如果該報文到達主機b,主機b運輸層就會檢查該報文的埠號,並將該報文段傳遞給套接字的埠號為接收到的報文段的目的埠號(22222)的套接字。從而實現了程序間的網路通訊。而源埠號的作用是為了讓主機b能向主機a傳送資訊的,也就是說,當主機b在接收到主機a的資料後,要向主機a傳送乙個回應時,主機b傳送的報文段的目的埠號就是11111.
注意:我們看到使用udp來傳輸報文段時,乙個udp套接字是由乙個含有目的ip位址和目的埠號的二元組來全面標識的。因此,如果兩個udp報文段有不同的源ip位址和源埠,但具有相同的ip位址和目的埠號,那麼這兩個報文段將通過相同的目的埠號定向到相同的目的程序。這裡沒有過多地說明ip位址,是因為ip位址是網路層的知識,所以沒有提及,我們現在只須知道,ip位址對應著一台主機,而埠號對應著一台主機上的乙個程序(或套接字)。
三、面向連線的多路復用和多路分解
從上面的解說中,我們可以知道,網路上主機間的程序間通訊,實質上是通過套接字來實現的。在運輸層中面向連線的網路傳輸多使用tcp,而tcp套接字和udp套接字之間有乙個細微的差別,就是,tcp套接字是由乙個四元組(源ip位址、源埠號,目的ip位址,目的埠號)來標識的。這樣,當乙個tcp報文段從網路到達一台主機時,主機會使用全部4個值來將報文段定向,即多路分解到相應的套接字。
與udp不同的是,兩個具有不同源ip或源埠號的到達的tcp報文段將被重定向到兩個不同的套接字。
儘管如此,而tcp的多路利用和多路分解的工作原理與無連線的udp的多路復用和多路分解的原理還是大致一樣的。
想想為什麼
tcp的多路復用和多路分解要這樣設計呢?個人認為,這是因為tcp和udp對待接收到的資料的處理方式不同所致的。我們以伺服器上的tcp套接字和udp套接字為例,假定伺服器接收客戶端的資料,並把資料傳送回客戶端。
當乙個udp伺服器接收到乙個udp報文段時,它會根據收到的udp報文段的源ip和源埠號,把資料傳送回客戶端,它並不需要建立乙個新的套接字來處理該報文段;
而對於乙個tcp伺服器,當它接受乙個連線時,它會產生乙個新的套接字,然後通過新的套接字來與客戶端通訊,也就是通過新的套接字來把資料傳送回給客戶端。由於每乙個連線都會產生乙個新的套接字,所以具有不同的源ip或源埠號的連線就是乙個不同的連線,對應著產生的新的不同的套接字。
試想一下,如果tcp套接字也是使用像udp那樣的只用源埠號和目的埠號來完全標識乙個套接字,那麼當客戶機a有乙個http連線時,該tcp報文的目的埠號為80,目的ip位址為tcp服務的ip位址。tcp伺服器產生乙個新的套接字來處理該請求,此時,客戶機b又有乙個http連線,tcp報文的目的埠號也為80,目的ip位址也為tcp服務的ip位址。而tcp套接字也是使用像udp那樣,兩個具有不同的源ip或源埠號但具有相同目的ip和目的埠的報文段定位到同乙個套接字中,那麼這個客戶機b的tcp報文段則會多路分解到客戶機a的套接字上,而該套接字並不應該被客戶機b的http連線使用。
ps:如果對於這個解說不太明白,可以看看本人寫的乙個用tcp和udp進行通訊的小例子,
tcp通訊:
udp通訊:
計算機網路運輸層之多路復用與多路分解
在網路上主機與主機之間的通訊,實質上是主機上執行的應用程序之間的通訊。比如我們兩個用電腦或手機實現聊天,就是兩個qq程式 程序 之間的通訊。其實當程式要使用網路時,要使用到對應的作業系統核心的操作和網絡卡裝置,所以我們向作業系統申請,然後作業系統會為我們建立乙個套接字socket,並返回這個sock...
計算機網路 3 2 多路復用和多路分解
運輸層的多路復用和多路分解,也就是將由網路層提供的主機到主機交付服務延伸到為執行在主機上的應用程式提供程序到程序的交付服務。需要強調的是,多路復用和多路分解服務是所有計算機網路都需要的 在接收端,運輸層檢查這些字段,標識出接收套接字,進而將報文段定向到該報文段。將運輸層報文段中的資料交付到正確的套接...
計算機網路 運輸層
問題 一 運輸層為相互通訊的的應用程序提供邏輯通訊 問題二 埠和套接字的意義 問題三 理解udp和tcp協議 問題四 在不可靠的網路上實現可靠傳輸的工作原理 問題五 tcp的滑動視窗 流量控制 擁塞控制和連線管理 1 埠 應用層所有的應用程序都可以通過運輸層傳送到ip層,這就是復用 運輸層從ip層收...