日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

计算机网络运输层之多路复用与多路分解

發(fā)布時間:2025/5/22 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算机网络运输层之多路复用与多路分解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
原文:?http://blog.csdn.net/ljianhui/article/details/21660629 --------------------------------------------------------------- 一、什么是多路復用和多路分解 我們知道,在網(wǎng)絡上主機與主機之間的通信,實質上是主機上運行的應用進程之間的通信。例如,當你通過Http上網(wǎng)瀏覽網(wǎng)頁時,實質上是你所訪問的主機的服務器進程與你本機的瀏覽器進程在進行通信。試想一下,當你在上網(wǎng)的同時,還掛著QQ,還使用ftp下載大文件,這時就有三個網(wǎng)絡上的進程與你的主機上的三個進程進行通信,那么系統(tǒng)是怎么樣正確地把接收到的數(shù)據(jù)定位到指定的進程中的呢?也就是說,系統(tǒng)是怎么把從ftp服務器發(fā)送過來的數(shù)據(jù)交付到ftp客戶端,而不把這些數(shù)據(jù)交付到你的QQ上的呢?反過來考慮,系統(tǒng)又是如何精確地把來自各個應用進程的數(shù)據(jù)發(fā)到網(wǎng)絡上指定上的主機(服務器)上的對應進程的呢?這就是多路分解與多路復用的作用了。 為了說明這個問題,先來補充一下操作系統(tǒng)方面的知識,以Linux對文件和設備的管理和使用方式為例。 為了方便資源的使用,提高機器的性能、利用率和穩(wěn)定性等等原因,我們的計算機都有一層軟件叫做操作系統(tǒng),它用于幫我們管理計算機可以使用的資源,當我們的程序要使用一個資源的時候,可以向操作系統(tǒng)申請,再由操作系統(tǒng)為我們的程序分配和管理資源。通常當我們要訪問一個內核設備或文件時,程序可以調用系統(tǒng)函數(shù),系統(tǒng)就會為我們打開設備或文件,然后返回一個文件描述符fd(或稱為ID,是一個整數(shù)),我們要訪問該設備或文件,只能通過該文件描述符??梢哉J為該編號對應著打開的文件或設備。 而當我們的程序要使用網(wǎng)絡時,要使用到對應的操作系統(tǒng)內核的操作和網(wǎng)卡設備,所以我們可以向操作系統(tǒng)申請,然后系統(tǒng)會為我們創(chuàng)建一個套接字Socket,并返回這個Socket的ID,以后我們的程序要使用網(wǎng)絡資源,只要向這個Socket的編號ID操作即可。而我們的每一個網(wǎng)絡通信的進程至少對應著一個Socket。向Socket的ID中寫數(shù)據(jù),相當于向網(wǎng)絡發(fā)送數(shù)據(jù),向Socket中讀數(shù)據(jù),相當于接收數(shù)據(jù)。而且這些套接字都有唯一標識符——端口號。 有了上面的了解后,再來說說什么是多路分解和多路復用。 每個運輸層的報文段中設置了幾個字段,包括源端口號和目的端口號等。多路分解就是,在接收端,運輸層檢查這些字段并標識出接收套接字,然后將該報文定向到該套接字。其工作方式可以簡單地認為是這樣的,主機上的每個每個套接字被分配一個端口號,當報文到達主機時,運輸層檢查報文段中的目的端口號,并將其定向到相應的套接字。 多路復用就是從源主機的不同套接字中收集數(shù)據(jù)塊,并為每個數(shù)據(jù)塊封裝上首部信息從而生成報文段,然后將報文段傳遞到網(wǎng)絡層中去。 二、無連接的多路復用和多路分解 在運輸層,無連接的網(wǎng)絡傳輸是通過UDP來實現(xiàn)的。UDP報文中只有源端口號和目的端口號,一個UDP套接字是由一個含有目的IP地址和目的端口號的二元組來全面標識的。在客戶端,源端口號是客戶進程套接字的端口號,目的端口號是服務器的端口號。而在服務器端,源端口號是服務器的創(chuàng)建的套接字的端口號,而目的端口號是客戶端的套接字的端口號。 例如主機A產(chǎn)生了一個UDP報文段,報文段中就會包括源端口號(11111)、目的端口號(22222)、程序數(shù)據(jù)(還有兩個其他的值,在這里我們不關心)。然后,運輸層將生成的報文段交給網(wǎng)絡層。網(wǎng)絡層將其放到一個IP數(shù)據(jù)報中,并提供盡力而為的交付,將其發(fā)送到主機B中。如果該報文到達主機B,主機B運輸層就會檢查該報文的端口號,并將該報文段傳遞給套接字的端口號為接收到的報文段的目的端口號(22222)的套接字。從而實現(xiàn)了進程間的網(wǎng)絡通信。而源端口號的作用是為了讓主機B能向主機A發(fā)送信息的,也就是說,當主機B在接收到主機A的數(shù)據(jù)后,要向主機A發(fā)送一個回應時,主機B發(fā)送的報文段的目的端口號就是11111. 注意:我們看到使用UDP來傳輸報文段時,一個UDP套接字是由一個含有目的IP地址和目的端口號的二元組來全面標識的。因此,如果兩個UDP報文段有不同的源IP地址和源端口,但具有相同的IP地址和目的端口號,那么這兩個報文段將通過相同的目的端口號定向到相同的目的進程。這里沒有過多地說明IP地址,是因為IP地址是網(wǎng)絡層的知識,所以沒有提及,我們現(xiàn)在只須知道,IP地址對應著一臺主機,而端口號對應著一臺主機上的一個進程(或套接字)。 三、面向連接的多路復用和多路分解 從上面的解說中,我們可以知道,網(wǎng)絡上主機間的進程間通信,實質上是通過套接字來實現(xiàn)的。在運輸層中面向連接的網(wǎng)絡傳輸多使用TCP,而TCP套接字和UDP套接字之間有一個細微的差別,就是,TCP套接字是由一個四元組(源IP地址、源端口號,目的IP地址,目的端口號)來標識的。這樣,當一個TCP報文段從網(wǎng)絡到達一臺主機時,主機會使用全部4個值來將報文段定向,即多路分解到相應的套接字。 與UDP不同的是,兩個具有不同源IP或源端口號的到達的TCP報文段將被重定向到兩個不同的套接字。 盡管如此,而TCP的多路利用和多路分解的工作原理與無連接的UDP的多路復用和多路分解的原理還是大致一樣的。 想想為什么TCP的多路復用和多路分解要這樣設計呢?個人認為,這是因為TCP和UDP對待接收到的數(shù)據(jù)的處理方式不同所致的。我們以服務器上的TCP套接字和UDP套接字為例,假定服務器接收客戶端的數(shù)據(jù),并把數(shù)據(jù)發(fā)送回客戶端。 當一個UDP服務器接收到一個UDP報文段時,它會根據(jù)收到的UDP報文段的源IP和源端口號,把數(shù)據(jù)發(fā)送回客戶端,它并不需要創(chuàng)建一個新的套接字來處理該報文段; 而對于一個TCP服務器,當它接受一個連接時,它會產(chǎn)生一個新的套接字,然后通過新的套接字來與客戶端通信,也就是通過新的套接字來把數(shù)據(jù)發(fā)送回給客戶端。由于每一個連接都會產(chǎn)生一個新的套接字,所以具有不同的源IP或源端口號的連接就是一個不同的連接,對應著產(chǎn)生的新的不同的套接字。 試想一下,如果TCP套接字也是使用像UDP那樣的只用源端口號和目的端口號來完全標識一個套接字,那么當客戶機A有一個Http連接時,該TCP報文的目的端口號為80,目的IP地址為TCP服務的IP地址。TCP服務器產(chǎn)生一個新的套接字來處理該請求,此時,客戶機B又有一個Http連接,TCP報文的目的端口號也為80,目的IP地址也為TCP服務的IP地址。而TCP套接字也是使用像UDP那樣,兩個具有不同的源Ip或源端口號但具有相同目的IP和目的端口的報文段定位到同一個套接字中,那么這個客戶機B的TCP報文段則會多路分解到客戶機A的套接字上,而該套接字并不應該被客戶機B的Http連接使用。 PS:如果對于這個解說不太明白,可以看看本人寫的一個用TCP和UDP進行通信的小例子, TCP通信:http://blog.csdn.net/ljianhui/article/details/10477427 UDP通信:http://blog.csdn.net/ljianhui/article/details/10697935

總結

以上是生活随笔為你收集整理的计算机网络运输层之多路复用与多路分解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。