网络传输层之TCP、UDP详解
1、傳輸層存在的必要性
???????由于網(wǎng)絡(luò)層的分組傳輸是不可靠的,無(wú)法了解數(shù)據(jù)到達(dá)終點(diǎn)的時(shí)間,無(wú)法了解數(shù)據(jù)未達(dá)終點(diǎn)的狀態(tài)。因此有必要增強(qiáng)網(wǎng)絡(luò)層提供服務(wù)的服務(wù)質(zhì)量。
2、引入傳輸層的原因
?????? 面向連接的傳輸服務(wù)與面向連接的網(wǎng)絡(luò)服務(wù)類似,都分為建立連接、數(shù)據(jù)傳輸、釋放連接三個(gè)階段;編址、尋址、流控制也是類似的。無(wú)連接的傳輸服務(wù)與無(wú)連接的網(wǎng)絡(luò)服務(wù)也非常類似。一個(gè)很顯然的問(wèn)題:既然傳輸層的服務(wù)與網(wǎng)絡(luò)層的服務(wù)如此相似,那么為什么我們還要兩個(gè)獨(dú)立的層呢?
????? 原因在于:傳輸層的代碼完全運(yùn)行在用戶的機(jī)器上,但是網(wǎng)絡(luò)層主要運(yùn)行在由承運(yùn)商控制的路由器上。試想以下幾種情況?
①?????? 網(wǎng)絡(luò)層提供的服務(wù)不夠用;
②?????? 頻繁的丟失分組;
③?????? 路由器時(shí)常崩潰。
?????? 用戶在網(wǎng)絡(luò)層上并沒(méi)有真正的控制權(quán),所以他們不可能用最好的路由器或者在數(shù)據(jù)鏈路層上用更好的錯(cuò)誤處理機(jī)制來(lái)解決服務(wù)太差的問(wèn)題。唯一的可能是在網(wǎng)絡(luò)層之上的另一層中提高服務(wù)質(zhì)量。這就是傳輸層存在的必要性。
????? 傳輸層的重要性:不僅僅是另外一層,它是整個(gè)協(xié)議層次的核心所在。如果沒(méi)有傳輸層,那么分層協(xié)議的整個(gè)概念將變得沒(méi)有意義。
????? 傳輸層的任務(wù):在源機(jī)器和目標(biāo)機(jī)器之間提供可靠的、性價(jià)比合理的數(shù)據(jù)傳輸服務(wù),并且與當(dāng)前使用的物理網(wǎng)絡(luò)完全獨(dú)立。
?
3、傳輸層的功能
??????? 數(shù)據(jù)傳送,不關(guān)心數(shù)據(jù)含義,進(jìn)程間通信。
??????? 彌補(bǔ)高層(上3層)要求與網(wǎng)絡(luò)層(基于下3層)數(shù)據(jù)傳送服務(wù)質(zhì)量間的差異(差錯(cuò)率、差錯(cuò)恢復(fù)能力、吞吐率、延時(shí)、費(fèi)用等),對(duì)高層屏蔽網(wǎng)絡(luò)層的服務(wù)的差異,提供穩(wěn)定和一致的界面。
4、傳輸層協(xié)議與網(wǎng)絡(luò)層協(xié)議的主要區(qū)別
?????? 網(wǎng)絡(luò)層(IP層)提供點(diǎn)到點(diǎn)的連接即提供主機(jī)之間的邏輯通信,傳輸層提供端到端的連接——提供進(jìn)程之間的邏輯通信。
5、傳輸層的用途
????? 傳輸層將數(shù)據(jù)分段,并進(jìn)行必要的控制,以便將這些片段重組成各種通信流。在此過(guò)程中,傳輸層主要負(fù)責(zé):
①?????? 跟蹤源主機(jī)和目的主機(jī)上應(yīng)用程序間的每次通信;
②?????? 將數(shù)據(jù)分段,并管理每個(gè)片段;
③?????? 將分段數(shù)據(jù)重組為應(yīng)用程序數(shù)據(jù)流;
④?????? 標(biāo)識(shí)不同的應(yīng)用程序。
6、端口號(hào)的概念
?????? ?運(yùn)行在計(jì)算機(jī)中的進(jìn)程是用進(jìn)程標(biāo)識(shí)符來(lái)標(biāo)志的。運(yùn)行在應(yīng)用層的各種應(yīng)用進(jìn)程卻不應(yīng)當(dāng)讓計(jì)算機(jī)操作系統(tǒng)指派它的進(jìn)程標(biāo)識(shí)符。這是因?yàn)樵谝蛱鼐W(wǎng)上使用的計(jì)算機(jī)的操作系統(tǒng)種類很多,而不同的操作系統(tǒng)又使用不同格式的進(jìn)程標(biāo)識(shí)符。為了使運(yùn)行不同操作系統(tǒng)的計(jì)算機(jī)的應(yīng)用進(jìn)程能夠互相通信,就必須用統(tǒng)一的方法對(duì)TCP/IP體系的應(yīng)用進(jìn)程進(jìn)行標(biāo)志。
解決這個(gè)問(wèn)題的方法就是在運(yùn)輸層使用協(xié)議端口號(hào)(protocol port number),或通常簡(jiǎn)稱為端口(port)。
雖然通信的終點(diǎn)是應(yīng)用進(jìn)程,但我們可以把端口想象是通信的終點(diǎn),因?yàn)槲覀冎灰岩獋魉偷膱?bào)文交到目的主機(jī)的某一個(gè)合適的目的端口,剩下的工作(即最后交付目的進(jìn)程)就由?TCP來(lái)完成。
??
?
7、傳輸層的主要協(xié)議
????????? TCP/ IP傳輸層的兩個(gè)主要協(xié)議都是因特網(wǎng)的重要標(biāo)準(zhǔn),傳輸控制協(xié)議TCP(Transmission Control Protocol)[RFC 768]、用戶數(shù)據(jù)報(bào)協(xié)議UDP(User Datagram Protocol)[RFC 793]。
????????? 傳輸層的數(shù)據(jù)流要在網(wǎng)絡(luò)端點(diǎn)之間建立邏輯連接。如果使用UDP,傳輸層的首要任務(wù)是將數(shù)據(jù)從源設(shè)備傳輸?shù)侥康脑O(shè)備。如果使用TCP,傳輸層主要通過(guò)滑動(dòng)窗口來(lái)提供端到端控制,以及利用確認(rèn)序列號(hào)和確認(rèn)信息提供可靠性。傳輸層定義主機(jī)應(yīng)用程序之間端到端的連接。
?
8、TCP&UDP的比較
?????? TCP(Transmission Control Protocol)可靠的、面向連接的協(xié)議(eg:打電話)、傳輸效率低全雙工通信(發(fā)送緩存&接收緩存)、面向字節(jié)流。使用TCP的應(yīng)用:Web瀏覽器;電子郵件、文件傳輸程序。
?????? UDP(User Datagram Protocol)不可靠的、無(wú)連接的服務(wù),傳輸效率高(發(fā)送前時(shí)延小),一對(duì)一、一對(duì)多、多對(duì)一、多對(duì)多、面向報(bào)文,盡最大努力服務(wù),無(wú)擁塞控制。使用UDP的應(yīng)用:域名系統(tǒng)?(DNS);視頻流;IP語(yǔ)音(VoIP)。
?問(wèn)題1:什么是面向連接、面向無(wú)連接?
?????? ?面向連接舉例:兩個(gè)人之間通過(guò)電話進(jìn)行通信。
面向無(wú)連接舉例:郵政服務(wù),用戶把信函放在郵件中期待郵政處理流程來(lái)傳遞郵政包裹。顯然,不可達(dá)代表不可靠。
??????? ?從程序?qū)崿F(xiàn)的角度解析面向連接、面向無(wú)連接如下:
?????? ? TCP面向連接,UDP面向無(wú)連接(在默認(rèn)的阻塞模式下):
???????? 在TCP協(xié)議中,當(dāng)客戶端退出程序或斷開(kāi)連接時(shí),TCP協(xié)議的recv函數(shù)會(huì)立即返回不再阻塞,因?yàn)榉?wù)端自己知道客戶端已經(jīng)退出或斷開(kāi)連接,證明它是面向連接的;
??????? 而在UDP協(xié)議中,recvfrom這個(gè)接收函數(shù)將會(huì)始終保持阻塞,因?yàn)榉?wù)端自己不知道客戶端已經(jīng)退出或斷開(kāi)連接,證明它是面向無(wú)連接的)。
?
?????? 從上圖也能清晰的看出,TCP通信需要服務(wù)器端偵聽(tīng)listen、接收客戶端連接請(qǐng)求accept,等待客戶端connect建立連接后才能進(jìn)行數(shù)據(jù)包的收發(fā)(recv/send)工作。
???????? 而UDP則服務(wù)器和客戶端的概念不明顯,服務(wù)器端即接收端需要綁定端口,等待客戶端的數(shù)據(jù)的到來(lái)。后續(xù)便可以進(jìn)行數(shù)據(jù)的收發(fā)(recvfrom/sendto)工作。
問(wèn)題2:什么是面向字節(jié)流、面向報(bào)文?
?????? 面向字節(jié)流:雖然應(yīng)用程序和TCP的交互是一次一個(gè)數(shù)據(jù)塊(大小不等),但TCP把應(yīng)用程序看成是一連串的無(wú)結(jié)構(gòu)的字節(jié)流。TCP有一個(gè)緩沖,當(dāng)應(yīng)用程序傳送的數(shù)據(jù)塊太長(zhǎng),TCP就可以把它劃分短一些再傳送。如果應(yīng)用程序一次只發(fā)送一個(gè)字節(jié),TCP也可以等待積累有足夠多的字節(jié)后再構(gòu)成報(bào)文段發(fā)送出去。
?????? 面向報(bào)文:面向報(bào)文的傳輸方式是應(yīng)用層交給UDP多長(zhǎng)的報(bào)文,UDP就照樣發(fā)送,即一次發(fā)送一個(gè)報(bào)文。因此,應(yīng)用程序必須選擇合適大小的報(bào)文。若報(bào)文太長(zhǎng),則IP層需要分片,降低效率。若太短,會(huì)是IP太小。(謝希仁,第五版。UDP對(duì)應(yīng)用層交下來(lái)的報(bào)文,既不合并,也不拆分,而是保留這些報(bào)文的邊界。這也就是說(shuō),應(yīng)用層交給UDP多長(zhǎng)的報(bào)文,UDP就照樣發(fā)送),即一次發(fā)送一個(gè)報(bào)文)。
問(wèn)題3:在默認(rèn)的阻塞模式下,為什么說(shuō)TCP無(wú)邊界,UDP有邊界?
???????? 對(duì)于TCP協(xié)議,客戶端連續(xù)發(fā)送數(shù)據(jù),只要服務(wù)端的這個(gè)函數(shù)的緩沖區(qū)足夠大,會(huì)一次性接收過(guò)來(lái),即客戶端是分好幾次發(fā)過(guò)來(lái),是有邊界的,而服務(wù)端卻一次性接收過(guò)來(lái),所以證明是無(wú)邊界的;
??????? 而對(duì)于UDP協(xié)議,客戶端連續(xù)發(fā)送數(shù)據(jù),即使服務(wù)端的這個(gè)函數(shù)的緩沖區(qū)足夠大,也只會(huì)一次一次的接收,發(fā)送多少次接收多少次,即客戶端分幾次發(fā)送過(guò)來(lái),服務(wù)端就必須按幾次接收,從而證明,這種UDP的通訊模式是有邊界的。
問(wèn)題4:UDP 如何發(fā)送大量的數(shù)據(jù)?如何處理分包?
??????? 用 updclient 一次不能發(fā)送太大的數(shù)據(jù)量,不然就會(huì)報(bào)錯(cuò):一個(gè)在數(shù)據(jù)報(bào)套接字上發(fā)送的消息大于內(nèi)部消息緩沖器或其他一些網(wǎng)絡(luò)限制,或該用戶用于接收數(shù)據(jù)報(bào)的緩沖器比數(shù)據(jù)報(bào)小。但不知道一次到底能發(fā)多少字節(jié)?如果把一個(gè)大的字節(jié)數(shù)組拆分成若干個(gè)字節(jié)數(shù)組發(fā)送,那么接收時(shí)如何判斷和處理呢?
?????? 答:方法很簡(jiǎn)單:
1、在客戶端將你要發(fā)送的內(nèi)容(文件什么的都可以)分塊,每塊內(nèi)容進(jìn)行編號(hào),然后發(fā)送;
2、服務(wù)端在接收到你的分塊數(shù)據(jù)以后,根據(jù)你的客戶端數(shù)據(jù)內(nèi)容的編號(hào)重新組裝;
3、一般我們?cè)诎l(fā)送數(shù)據(jù)的時(shí)候,盡量采用比較小的數(shù)據(jù)塊的方式(我的都沒(méi)有超過(guò)1024的),數(shù)據(jù)塊太大的話容易出現(xiàn)發(fā)送和接收的數(shù)據(jù)時(shí)間長(zhǎng),匹配出問(wèn)題。
問(wèn)題5.UDP發(fā)包的問(wèn)題
?????? 問(wèn):udp發(fā)送兩次數(shù)據(jù),第一次?100字節(jié),第二次200字節(jié),接包方一次recvfrom( 1000 ),收到是?100,還是200,還是300?
?????? 答:UDP是數(shù)據(jù)報(bào)文協(xié)議,是以數(shù)據(jù)包方式,所以每次可以接收100,200,在理想情況下,第一次是無(wú)論recvfrom多少都是接收到100。當(dāng)然,可能由于網(wǎng)絡(luò)原因,第二個(gè)包先到的話,有可能是200了。對(duì)可能會(huì)由于網(wǎng)絡(luò)原因亂序,所以可能先收到200,所以自定義的udp協(xié)議包頭里都要加上一個(gè)序列號(hào),標(biāo)識(shí)發(fā)送與收包對(duì)應(yīng)。
問(wèn)題6.TCP的發(fā)包問(wèn)題
?????? 問(wèn):同樣如果換成tcp,第一次發(fā)送?100字節(jié),第二次發(fā)送200字節(jié),recv( 1000 )會(huì)接收到多少?
?????? 答:tcp是流協(xié)議,所以recv( 1000 ),會(huì)收到300 tcp自己處理好了重傳,保證數(shù)據(jù)包的完整性
問(wèn)題7.有分片的情況下如下處理
??????? 問(wèn):如果MTU是1500,使用UDP發(fā)送?2000,那么recvfrom(2000)是收到1500,還是2000?
??????? 答:還是接收2000,數(shù)據(jù)分片由ip層處理了,放到udp還是一個(gè)完整的包。接收到的包是由路由路徑上最少的MTU來(lái)分片,注意轉(zhuǎn)到UDP已經(jīng)在是組裝好的(組裝出錯(cuò)的包會(huì)經(jīng)crc校驗(yàn)出錯(cuò)而丟棄),是一個(gè)完整的數(shù)據(jù)包。
問(wèn)題8.分片后的處理
?????? 問(wèn):如果500那個(gè)片丟了怎么辦?udp又沒(méi)有重傳
?????? 答:udp里有個(gè)crc檢驗(yàn),如果包不完整就會(huì)丟棄,也不會(huì)通知是否接收成功,所以UDP是不可靠的傳輸協(xié)議,而且TCP不存在這個(gè)問(wèn)題,有自己的重傳機(jī)制。在內(nèi)網(wǎng)來(lái)說(shuō),UDP基本不會(huì)有丟包,可靠性還是有保障。當(dāng)然如果是要求有時(shí)序性和高可靠性,還是走TCP,不然就要自己提供重傳和亂序處理(? UDP內(nèi)網(wǎng)發(fā)包處理量可以達(dá)7M~10M/s )
問(wèn)題9.不同連接到同一個(gè)端口的包處理
?????? 問(wèn):TCP
????????? A -> C發(fā)100
????????? B -> C發(fā)200
???????? AB同時(shí)同一端口
???????? C recv(1000) ,會(huì)收到多少?
????? 答:A與C是一個(gè)tcp連接,B與C又是另一個(gè)tcp連接,所以不同socket,所以分開(kāi)處理。每個(gè)socket有自己的接收緩沖和發(fā)送緩沖
問(wèn)題10.什么是TCP粘包
??????? 在應(yīng)用開(kāi)發(fā)過(guò)程中,基于TCP網(wǎng)絡(luò)傳輸?shù)膽?yīng)用程序有時(shí)會(huì)出現(xiàn)粘包現(xiàn)象(即發(fā)送方發(fā)送的若干包數(shù)據(jù)到接收方接收時(shí)粘成一包)。詳細(xì)解釋如下:由于TCP是流協(xié)議,對(duì)于一個(gè)socket的包,如發(fā)送?10AAAAABBBBB兩次,由于網(wǎng)絡(luò)原因第一次又分成兩次發(fā)送,?10AAAAAB和BBBB,如果接包的時(shí)候先讀取10(包長(zhǎng)度)再讀入后續(xù)數(shù)據(jù),當(dāng)接收得快,發(fā)送的慢時(shí),就會(huì)出現(xiàn)先接收了?10AAAAAB,會(huì)解釋錯(cuò)誤?,再接到BBBB10AAAAABBBBB,也解釋錯(cuò)誤的情況。這就是TCP的粘包。
???????在網(wǎng)絡(luò)傳輸應(yīng)用中,通常需要在網(wǎng)絡(luò)協(xié)議之上再自定義一個(gè)協(xié)議封裝一下,簡(jiǎn)單做法就是在要發(fā)送的數(shù)據(jù)前面再加一個(gè)自定義的包頭,包頭中可以包含數(shù)據(jù)長(zhǎng)度和其它一些信息,接收的時(shí)候先收包頭,再根據(jù)包頭中描述的數(shù)據(jù)長(zhǎng)度來(lái)接收后面的數(shù)據(jù)。詳細(xì)做法是:先接收包頭,在包頭里指定包體長(zhǎng)度來(lái)接收。設(shè)置包頭包尾的檢查位(如群空間0x2開(kāi)頭,0x3結(jié)束來(lái)檢查一個(gè)包是否完整)。對(duì)于TCP來(lái)說(shuō):1)不存在丟包,錯(cuò)包,所以不會(huì)出現(xiàn)數(shù)據(jù)出錯(cuò)?2)如果包頭檢測(cè)錯(cuò)誤,即為非法或者請(qǐng)求,直接重置即可
???????為了避免粘包現(xiàn)象,可采取以下幾種措施。
??????? 一是對(duì)于發(fā)送方引起的粘包現(xiàn)象,用戶可通過(guò)編程設(shè)置來(lái)避免,TCP提供了強(qiáng)制數(shù)據(jù)立即傳送的操作指令push,TCP軟件收到該操作指令后,就立即將本段數(shù)據(jù)發(fā)送出去,而不必等待發(fā)送緩沖區(qū)滿;
??????? 二是對(duì)于接收方引起的粘包,則可通過(guò)優(yōu)化程序設(shè)計(jì)、精簡(jiǎn)接收進(jìn)程工作量、提高接收進(jìn)程優(yōu)先級(jí)等措施,使其及時(shí)接收數(shù)據(jù),從而盡量避免出現(xiàn)粘包現(xiàn)象;
???????? 三是由接收方控制,將一包數(shù)據(jù)按結(jié)構(gòu)字段,人為控制分多次接收,然后合并,通過(guò)這種手段來(lái)避免粘包。
問(wèn)題11.圖解TCP的3次握手建立連接,4次握手釋放連接?
???????? TCP是面向連接的協(xié)議。運(yùn)輸連接是用來(lái)傳送TCP報(bào)文的。TCP傳輸連接的建立和釋放是每一次面向連接的通信中必不可少的過(guò)程。因此,傳輸連接就由三個(gè)階段,即:連接建立、數(shù)據(jù)傳送和連接釋放。
?
??????這里的SYN=SYNchronization,SYN=1,ACK=0,表示連接請(qǐng)求報(bào)文段;同意建立連接則SYN=1,ACK=1,連接后所有的ACK=1。
三次握手(three-way handshake)方案解決了由于網(wǎng)絡(luò)層會(huì)丟失、存儲(chǔ)和重復(fù)分組帶來(lái)的問(wèn)題。試想不進(jìn)行三次握手可能出現(xiàn)的問(wèn)題?
?
??????
??????? 如上圖所示,如果僅僅是2次握手的話,可能出現(xiàn)的問(wèn)題如下:
?????? Host A發(fā)送的數(shù)據(jù)包由于網(wǎng)絡(luò)的原因,出現(xiàn)了滯留,即延時(shí)到達(dá)了HostB。此時(shí),B以為HostA發(fā)來(lái)了請(qǐng)求,于是就向HostA發(fā)送確認(rèn)報(bào)文,以建立連接。而HostA收到報(bào)文后,由于其沒(méi)有向HostB發(fā)起建立連接的請(qǐng)求,因此不會(huì)理睬HostB的確認(rèn),也不會(huì)向HostB發(fā)送數(shù)據(jù)。而此時(shí)的B認(rèn)為已經(jīng)建立起連接了,就等待HostA發(fā)送的數(shù)據(jù),導(dǎo)致HostB的資源白白浪費(fèi)!
轉(zhuǎn)載于:https://www.cnblogs.com/MMLoveMeMM/articles/3585633.html
總結(jié)
以上是生活随笔為你收集整理的网络传输层之TCP、UDP详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: DevExpress控件GridCont
- 下一篇: [ofbiz]less-than (lt