運輸層的多路復用和多路分解,也就是將由網路層提供的主機到主機交付服務延伸到為執行在主機上的應用程式提供程序到程序的交付服務。需要強調的是,多路復用和多路分解服務是所有計算機網路都需要的
在接收端,運輸層檢查這些字段,標識出接收套接字,進而將報文段定向到該報文段。將運輸層報文段中的資料交付到正確的套接字的工作稱為多路分解。
在源主機從不同套接字中收集資料塊,並為每個資料塊封裝上首部資訊從而生成報文段,然後將報文段傳遞到網路層,這稱之為多路復用
這就像是兩個家庭之間相互寄郵件,寄件家庭的爸爸,媽媽和兒子都要寄郵件,而爸爸把大家的郵件收集在一起交給郵差,這就是多路復用,這樣免去了每個人都要去找郵差寄件,就如同計算機中的程序不需要獨佔一條網線一樣。而收件家庭的媽媽把全家人的郵件都一起從郵差手裡取了回來,分給了其他人,這就是多路分解
為了實現多路復用和多路分解,計算機網路有如下特性
①套接字(socket)有唯一的識別符號。
②每個報文段有特殊欄位來指示該報文段所要交付到的套接字。而這些特殊的字段就是源埠號字段和目的埠號字段
埠號就如同門牌號。每個主機就如同一棟大廈,報文段到達了目的主機之後,需要前往對應的埠號,將資訊給對應埠號的程序才行
埠號是乙個16位元的數,範圍在065535之間。01023這個範圍的埠號稱為周知埠號。是受限的,這些埠號留給比如http或者ftp之類的周知應用層協議來使用的。
在主機上每個套接字(socket)可以分配乙個埠號,當報文段到達主機的時候,運輸層檢查報文段中的目的埠號。並將其定位到相應的埠號中。然後報文段中的資料通過套接字進入其所連線的程序。
1.無連線的多路復用與多路分解
在python中只需要一行**就可以建立乙個udp套接字。
clientsocket = socket(af_inef, sock_dgram)
當用這一種方法建立乙個套接字的時候,運輸層會自動地為這個套接字分配乙個隨機的埠號。這個埠號一定是沒有被占用的。當然你也可以通過bind()方法指定udp套接字關聯乙個埠號
clientsocket.bind(('', 11451))
如果應用程式是乙個周知協議的伺服器端,那麼開發者就必須為其分配乙個相應的周知埠。也就是說,通常,應用程式客戶端會讓運輸層自動地分配乙個埠號,而服務端會分配到乙個特定的埠號。
乙個udp套接字是由乙個二元組全面標識的,該二元組包含乙個目的ip位址和乙個目的埠號。因此,兩個udp報文有著不同的源ip/源埠號,但是還是會通過相同的套接字被定向到相同的目標程序。
2. 面向連線的多路復用和多路分解
tcp套接字和udp套接字之間的乙個細微差別是tcp套接字是由乙個四元組(源ip位址,源埠號,目的ip位址,目的埠號)。特別和udp不同的是,兩個具有不同源ip位址或者埠號的到達tcp報文段將會被定向到兩個不同的套接字,除非tcp報文段攜帶了初始建立連線的請求。
伺服器注意到tcp報文段中有個四元組。所以所有目的ip,目的埠號,源埠號,源ip都相同的tcp報文段才會被定向到對應的相同的套接字。**不同的tcp報文段會被定向到不同的套接字。
伺服器主機可以支援很多並行的tcp套接字,每乙個套接字和乙個程序聯絡,並且由其四元組來表示每個套接字。
計算機網路運輸層之多路復用與多路分解
一 什麼是多路復用和多路分解 為了說明這個問題,先來補充一下 作業系統方面的知識,以linux對檔案和裝置的管理和使用方式為例。為了方便資源的使用,提高機器的效能 利用率和穩定性等等原因,我們的計算機都有一層軟體叫做作業系統,它用於幫我們管理計算機可以使用的資源,當我們的程式要使用乙個資源的時候,可...
計算機網路運輸層之多路復用與多路分解
在網路上主機與主機之間的通訊,實質上是主機上執行的應用程序之間的通訊。比如我們兩個用電腦或手機實現聊天,就是兩個qq程式 程序 之間的通訊。其實當程式要使用網路時,要使用到對應的作業系統核心的操作和網絡卡裝置,所以我們向作業系統申請,然後作業系統會為我們建立乙個套接字socket,並返回這個sock...
計算機網路 I O多路轉接之epoll
什麼是epoll epoll是什麼?按照man手冊的說法 是為處理大批量控制代碼而作了改進的poll。當然,這不是2.6核心才有的,它是在2.5.44核心中被引進的 epoll 4 is a new api introduced in linux kernel2.5.44 它幾乎具備了之前所說的一切...