abstract:同為端到端的通信,傳輸層與網(wǎng)絡(luò)層的區(qū)別是什么?任務(wù):負(fù)責(zé)向兩個(gè)主機(jī)中應(yīng)用進(jìn)程之間的通信提供服務(wù)(提供邏輯通信)。區(qū)別:運(yùn)輸層為運(yùn)行在不同主機(jī)上的進(jìn)程之間提供端到端的邏輯通信,但網(wǎng)絡(luò)層是提供主機(jī)之間的邏輯通信。一、多路分解與多路復(fù)用 每個(gè)運(yùn)輸層的報(bào)文段中設(shè)置了幾個(gè)字段,包括源端口號(hào)和目的端口號(hào)等。多路分解就是,在接收端,運(yùn)輸層檢查這些字段并標(biāo)識(shí)出接收套接字,然后將該報(bào)文定向到該套接字。其工作方式可
同為端到端的通信,傳輸層與網(wǎng)絡(luò)層的區(qū)別是什么?
任務(wù):負(fù)責(zé)向兩個(gè)主機(jī)中應(yīng)用進(jìn)程之間的通信提供服務(wù)(提供邏輯通信)。
區(qū)別:運(yùn)輸層為運(yùn)行在不同主機(jī)上的進(jìn)程之間提供端到端的邏輯通信,但網(wǎng)絡(luò)層是提供主機(jī)之間的邏輯通信。
一、多路分解與多路復(fù)用
每個(gè)運(yùn)輸層的報(bào)文段中設(shè)置了幾個(gè)字段,包括源端口號(hào)和目的端口號(hào)等。多路分解就是,在接收端,運(yùn)輸層檢查這些字段并標(biāo)識(shí)出接收套接字,然后將該報(bào)文定向到該套接字。其工作方式可以簡單地認(rèn)為是這樣的,主機(jī)上的每個(gè)套接字被分配一個(gè)端口號(hào),當(dāng)報(bào)文到達(dá)主機(jī)時(shí),運(yùn)輸層檢查報(bào)文段中的目的端口號(hào),并將其定向到相應(yīng)的套接字。多路復(fù)用就是從源主機(jī)的不同套接字中收集數(shù)據(jù)塊,并為每個(gè)數(shù)據(jù)塊封裝上首部信息從而生成報(bào)文段,然后將報(bào)文段傳遞到網(wǎng)絡(luò)層中去。
1、無連接的多路復(fù)用和多路分解
在運(yùn)輸層,無連接的網(wǎng)絡(luò)傳輸是通過UDP來實(shí)現(xiàn)的。UDP報(bào)文中只有源端口號(hào)和目的端口號(hào),一個(gè)UDP套接字是由一個(gè)含有目的IP地址和目的端口號(hào)的二元組來全面標(biāo)識(shí)的。在客戶端,源端口號(hào)是客戶進(jìn)程套接字的端口號(hào),目的端口號(hào)是服務(wù)器的端口號(hào)。而在服務(wù)器端,源端口號(hào)是服務(wù)器的創(chuàng)建的套接字的端口號(hào),而目的端口號(hào)是客戶端的套接字的端口號(hào)。
注意:使用UDP來傳輸報(bào)文段時(shí),一個(gè)UDP套接字是由一個(gè)含有目的IP地址和目的端口號(hào)的二元組來全面標(biāo)識(shí)的。因此,如果兩個(gè)UDP報(bào)文段有不同的源IP地址和源端口,但具有相同的源IP地址和目的端口號(hào),那么這兩個(gè)報(bào)文段將通過相同的目的端口號(hào)定向到相同的目的進(jìn)程。這里沒有過多地說明IP地址,是因?yàn)镮P地址是網(wǎng)絡(luò)層的知識(shí),所以沒有提及,我們現(xiàn)在只須知道,IP地址對應(yīng)著一臺(tái)主機(jī),而端口號(hào)對應(yīng)著一臺(tái)主機(jī)上的一個(gè)進(jìn)程(或套接字)。
2、面向連接的多路復(fù)用和多路分解
網(wǎng)絡(luò)上主機(jī)間的進(jìn)程間通信,實(shí)質(zhì)上是通過套接字來實(shí)現(xiàn)的。在運(yùn)輸層中面向連接的網(wǎng)絡(luò)傳輸多使用TCP,而TCP套接字和UDP套接字之間有一個(gè)細(xì)微的差別,就是,TCP套接字是由一個(gè)四元組(源IP地址、源端口號(hào),目的IP地址,目的端口號(hào))來標(biāo)識(shí)的。這樣,當(dāng)一個(gè)TCP報(bào)文段從網(wǎng)絡(luò)到達(dá)一臺(tái)主機(jī)時(shí),主機(jī)會(huì)使用全部4個(gè)值來將報(bào)文段定向,即多路分解到相應(yīng)的套接字。
與UDP不同的是,兩個(gè)具有不同源IP或源端口號(hào)的到達(dá)的TCP報(bào)文段將被重定向到兩個(gè)不同的套接字。
盡管如此,而TCP的多路利用和多路分解的工作原理與無連接的UDP的多路復(fù)用和多路分解的原理還是大致一樣的?! ?/p>
想想為什么TCP的多路復(fù)用和多路分解要這樣設(shè)計(jì)呢?
這是因?yàn)門CP和UDP對待接收到的數(shù)據(jù)的處理方式不同所致的。我們以服務(wù)器上的TCP套接字和UDP套接字為例,假定服務(wù)器接收客戶端的數(shù)據(jù),并把數(shù)據(jù)發(fā)送回客戶端。當(dāng)一個(gè)UDP服務(wù)器接收到一個(gè)UDP報(bào)文段時(shí),它會(huì)根據(jù)收到的UDP報(bào)文段的源IP和源端口號(hào),把數(shù)據(jù)發(fā)送回客戶端,它并不需要?jiǎng)?chuàng)建一個(gè)新的套接字來處理該報(bào)文段;而對于一個(gè)TCP服務(wù)器,當(dāng)它接受一個(gè)連接時(shí),它會(huì)產(chǎn)生一個(gè)新的套接字,然后通過新的套接字來與客戶端通信,也就是通過新的套接字來把數(shù)據(jù)發(fā)送回給客戶端。由于每一個(gè)連接都會(huì)產(chǎn)生一個(gè)新的套接字,所以具有不同的源IP或源端口號(hào)的連接就是一個(gè)不同的連接,對應(yīng)著產(chǎn)生的新的不同的套接字。
二、UDP
UDP(用戶數(shù)據(jù)報(bào)協(xié)議,User Datagram Protocol),它只是做了運(yùn)輸層協(xié)議能夠做的最少工作,除了多路復(fù)用和多路分解及一些差錯(cuò)檢測外,它幾乎沒有做任何東西。如果應(yīng)用程序使用的運(yùn)輸層協(xié)議是UDP,則應(yīng)用程序幾乎是直接與IP打交道的。
同時(shí),UDP也是一種無連接的運(yùn)輸層協(xié)議,因?yàn)樵谑褂肬DP時(shí),在發(fā)送報(bào)文段之前,發(fā)送方和接收方的運(yùn)輸層實(shí)體之間沒有進(jìn)行握手,所謂的握手,就是發(fā)送方和接收方通過發(fā)送一些特定的報(bào)文段來互相確認(rèn),從而為發(fā)送做準(zhǔn)備。
UDP為網(wǎng)絡(luò)層以上和應(yīng)用層以下提供了一個(gè)簡單的接口。UDP只提供數(shù)據(jù)的不可靠傳遞,它一旦把應(yīng)用程序發(fā)給網(wǎng)絡(luò)層的數(shù)據(jù)發(fā)送出去,就不保留數(shù)據(jù)備份(所以UDP是不可靠的數(shù)據(jù)報(bào)協(xié)議),也不要求接收方回復(fù)接收成功確認(rèn),也不會(huì)重發(fā)數(shù)據(jù),不提供流量控制,更不提供擁塞控制。UDP在IP數(shù)據(jù)報(bào)的頭部僅僅加入了復(fù)用和數(shù)據(jù)校驗(yàn)(字段)
UDP報(bào)文段結(jié)構(gòu)
從上圖可以看出,UDP首部只有4個(gè)字段,每個(gè)字段由兩個(gè)字節(jié)組成。
源端口號(hào):本機(jī)(客戶端)的應(yīng)用程序的套接字所對應(yīng)的端口號(hào),服務(wù)器端可利用此端口號(hào)向客戶端發(fā)送數(shù)據(jù)。
目的端口號(hào):服務(wù)端上的應(yīng)用進(jìn)程的套接字所對應(yīng)的端口號(hào),例如HTTP服務(wù)器的80端口。
長度:指明了首部和數(shù)據(jù)部分的UDP報(bào)文段的總長度,單位為字節(jié),即首部+數(shù)據(jù)。
檢驗(yàn)和:提供了差錯(cuò)檢測功能,即檢驗(yàn)和用于確定當(dāng)UDP報(bào)文段從源到達(dá)目的時(shí),其中的比特是否發(fā)生了改變。事實(shí)上,計(jì)算檢驗(yàn)和時(shí),除了UDP報(bào)文段以外還使用了IP首部的一些字段。注意,它只能檢測到一個(gè)報(bào)文段發(fā)生了錯(cuò)誤,但并不能糾正這個(gè)錯(cuò)誤?! ?/p>
UDP的優(yōu)勢
從UDP的概述中,我們可以看到,UDP其實(shí)并不提供什么服務(wù),而TCP則為我們提供了非常吸引的服務(wù)(如數(shù)據(jù)備份、重發(fā)機(jī)制、流量控制、接收確認(rèn)、擁塞控制等等),實(shí)現(xiàn)的是一個(gè)可靠的傳輸。為什么還在存在UDP這個(gè)東西呢?每一樣事物都有它的優(yōu)點(diǎn),而且很多時(shí)候,事物的缺點(diǎn)恰恰就是它的優(yōu)點(diǎn)。我為何這么說,下面就來看看它的優(yōu)勢吧!
1、應(yīng)用層能更好發(fā)控制要發(fā)送的數(shù)據(jù)和發(fā)送時(shí)間。
為什么采用UDP的應(yīng)用層能更好地控制發(fā)送的數(shù)據(jù)和時(shí)間呢?因?yàn)閁DP只提供最簡單、服務(wù)最少的服務(wù),所以當(dāng)網(wǎng)絡(luò)應(yīng)用進(jìn)程有數(shù)據(jù)傳遞給UDP時(shí),UDP馬上就會(huì)將此數(shù)據(jù)打包成UDP報(bào)文段,并把它交付給網(wǎng)絡(luò)層,從而把數(shù)據(jù)發(fā)送出去。相反,由于TCP提供了各種的機(jī)制,特別是擁塞控制,以便讓源和目的主機(jī)間的一條或多條鏈路變得非常擁塞時(shí),遏制運(yùn)輸層TCP發(fā)送方,從而讓因特網(wǎng)電話、視頻會(huì)議之類的實(shí)時(shí)應(yīng)用性能變得很差。再者,TCP還會(huì)繼續(xù)重發(fā)數(shù)據(jù)報(bào)文段直到目的主機(jī)收到此報(bào)文并加以確認(rèn),點(diǎn)面結(jié)合 不管可靠的交付需要多少時(shí)間。TCP的這些特性,對于一些實(shí)時(shí)應(yīng)用來說通常是不適合的,因?yàn)樗鼈兺ǔR笠宰羁斓陌l(fā)送速率發(fā)送數(shù)據(jù),而不想過分地延遲報(bào)文的傳送,而且它還能容忍一些數(shù)據(jù)丟失,所以沒用必要使用TCP,使用TCP還會(huì)增加額外的負(fù)擔(dān)。
2、無需連接建立
如上述的那樣,UDP是一個(gè)無連接的運(yùn)輸層協(xié)議,而TCP在開始數(shù)據(jù)傳輸之前要經(jīng)過三次握手。UDP由于它是一個(gè)無連接的協(xié)議,所以可以不需要任何準(zhǔn)備即可進(jìn)行數(shù)據(jù)傳輸,因此它不會(huì)引入建立連接的時(shí)延。所以DNS運(yùn)行在UDP之上而不是TCP之上,因?yàn)槿绻鸇NS運(yùn)行在TCP之上,則會(huì)由于要建立過多的連接而產(chǎn)生過長連接延時(shí),從而讓DNS運(yùn)行得很慢。
3、無連接狀態(tài)
TCP由于在提供各種可靠傳輸?shù)姆?wù),需要在端系統(tǒng)中維護(hù)連接狀態(tài)。此連接狀態(tài)包括接收和發(fā)送緩存、擁塞控制參數(shù)、序號(hào)與確認(rèn)序號(hào)等參數(shù)。而UDP不維護(hù)連接狀態(tài),也不跟蹤這些參數(shù)。因此,使用UDP的服務(wù)器能支持更多的活動(dòng)客戶機(jī)。
4、分組首部開銷小
由于UDP提供的服務(wù)少,只提供多路分解和多路復(fù)用和校驗(yàn)功能,所以其首部字段少,只有8個(gè)字節(jié),而TCP的首部有20個(gè)字節(jié)。
三、TCP
TCP作為一個(gè)可靠的連接協(xié)議最大的特點(diǎn)就是面向連接的,即在發(fā)送數(shù)據(jù)之間要建立連接,數(shù)據(jù)傳輸過程中要維護(hù)連接,數(shù)據(jù)發(fā)送完畢之后要釋放連接。在此基礎(chǔ)上TCP提供可靠的傳輸:
可靠交付:TCP傳遞的數(shù)據(jù)無差錯(cuò)、無丟失、無重復(fù)、且按序到達(dá);
全雙工通信:TCP通信的每一段都維護(hù)著一個(gè)發(fā)送緩存和接收緩存;
面向字節(jié)流:TCP協(xié)議把上層交付的應(yīng)用層數(shù)據(jù)單純地看成是一系列無結(jié)構(gòu)的字節(jié)流;
TCP連接的端點(diǎn)不是主機(jī)中的應(yīng)用進(jìn)程,而是應(yīng)用進(jìn)程維護(hù)的套接字接口(socket),其基本的結(jié)構(gòu)包含【IP:Port】;
TCP報(bào)文格式如下:
源端口或目的端口(分別2個(gè)字節(jié)):略。
序號(hào)(4個(gè)字節(jié)):TCP連接中傳送的字節(jié)流中的每一個(gè)字節(jié)都按順序編號(hào)。傳送的字節(jié)流的起始序號(hào)必須在連接建立時(shí)設(shè)置。報(bào)文段中的序號(hào)值是本報(bào)文段所發(fā)送的數(shù)據(jù)的第一個(gè)字節(jié)的編號(hào)。例如一報(bào)文段序號(hào)值為101,數(shù)據(jù)共有100字節(jié),那么下一報(bào)文段序號(hào)值就為201。因?yàn)樾蛱?hào)的大小是[0,2^32 -1],超出了循環(huán)從0開始,所以序號(hào)是使用mod2^32運(yùn)算的。
確認(rèn)號(hào)(4個(gè)字節(jié)):期望收到對方下一個(gè)報(bào)文段的第一個(gè)數(shù)據(jù)字節(jié)的序號(hào)。
數(shù)據(jù)偏移(又稱首部長度)(4位):指出TCP報(bào)文段的數(shù)據(jù)起始處距離TCP首部的起始處有多遠(yuǎn)。實(shí)際上就是指出TCP首部長度。該字段指示了以32bit的字為單位的TCP首部長度。由于TCP選項(xiàng)字段的原因,TCP首部的長度是可變的。因此,數(shù)據(jù)偏移的單位是4個(gè)字節(jié),而4位二進(jìn)制的最大值是15,則說明首部最大只能是15*4=60字節(jié)。其實(shí)選項(xiàng)字段最大只能為40字節(jié)。
保留(6位):略。
緊急URG:表明緊急指針子字段有效。
確認(rèn)ACK:等于1時(shí)確認(rèn)號(hào)字段才有效。TCP規(guī)定連接建立后所有傳送報(bào)文度必須把ACK置1。
推送PUSH:表明需要盡快地交付接收應(yīng)用進(jìn)程,不再等整個(gè)緩存都填滿后再向上交付。
復(fù)位RST:等于1時(shí)表明TCP連接中出現(xiàn)嚴(yán)重差錯(cuò),必須釋放連接再重新建立。
同步SYN:用于連接建立時(shí)同步序號(hào)的。
終止FIN:用來釋放一個(gè)連接。
窗口(2個(gè)字節(jié)):該字段用于流量控制,指示接收方愿意接收的字節(jié)數(shù)量。因?yàn)榻邮辗降慕邮站彺嬗邢?。窗口值是?dòng)態(tài)變化的。
檢驗(yàn)和(2個(gè)字節(jié)):檢驗(yàn)和檢查的范圍包括首部和數(shù)據(jù)。
緊急指針(2個(gè)字節(jié)):指出緊急數(shù)據(jù)的末尾在報(bào)文段中的位置。即使窗口值為零也可以發(fā)送緊急數(shù)據(jù)。
選項(xiàng)(最大可達(dá)40個(gè)字節(jié)):略。