TCP的定義
????????傳輸控制協(xié)議(TCP岖食,Transmission Control Protocol)是一種面向連接的红碑、可靠的、基于字節(jié)流的傳輸層通信協(xié)議泡垃。
????????TCP旨在適應(yīng)支持多網(wǎng)絡(luò)應(yīng)用的分層協(xié)議層次結(jié)構(gòu)析珊。 連接到不同但互連的計算機通信網(wǎng)絡(luò)的主計算機中的成對進程之間依靠TCP提供可靠的通信服務(wù)。TCP假設(shè)它可以從較低級別的協(xié)議獲得簡單的兔毙,可能不可靠的數(shù)據(jù)報服務(wù)唾琼。 原則上,TCP應(yīng)該能夠在從硬線連接到分組交換或電路交換網(wǎng)絡(luò)的各種通信系統(tǒng)之上操作澎剥。
????????傳輸控制協(xié)議(TCP,Transmission Control Protocol)是為了在不可靠的互聯(lián)網(wǎng)絡(luò)上提供可靠的端到端字節(jié)流而專門設(shè)計的一個傳輸協(xié)議赶舆。
? ? ? ? 應(yīng)用層向TCP層發(fā)送用于網(wǎng)間傳輸?shù)难埔Α⒂?位字節(jié)表示的數(shù)據(jù)流,然后TCP把數(shù)據(jù)流分區(qū)成適當(dāng)長度的報文段(通常受該計算機連接的網(wǎng)絡(luò)的數(shù)據(jù)鏈路層的最大傳輸單元(MTU)的限制)芜茵。之后TCP把結(jié)果包傳給IP層叙量,由它來通過網(wǎng)絡(luò)將包傳送給接收端實體的TCP層。TCP為了保證不發(fā)生丟包九串,就給每個包一個序號绞佩,同時序號也保證了傳送到接收端實體的包的按序接收。然后接收端實體對已成功收到的包發(fā)回一個相應(yīng)的確認(rèn)(ACK)猪钮;如果發(fā)送端實體在合理的往返時延(RTT)內(nèi)未收到確認(rèn)品山,那么對應(yīng)的數(shù)據(jù)包就被假設(shè)為已丟失將會被進行重傳。TCP用一個校驗和函數(shù)來檢驗數(shù)據(jù)是否有錯誤烤低;在發(fā)送和接收時都要計算校驗和肘交。
IP層并不保證數(shù)據(jù)報一定被正確地遞交到接收方,也不指示數(shù)據(jù)報的發(fā)送速度有多快扑馁。正是TCP負(fù)責(zé)既要足夠快地發(fā)送數(shù)據(jù)報涯呻,以便使用網(wǎng)絡(luò)容量,但又不能引起網(wǎng)絡(luò)擁塞:而且腻要,TCP超時后复罐,要重傳沒有遞交的數(shù)據(jù)報。即使被正確遞交的數(shù)據(jù)報雄家,也可能存在錯序的問題效诅,這也是TCP的責(zé)任,它必須把接收到的數(shù)據(jù)報重新裝配成正確的順序。簡而言之填帽,TCP必須提供可靠性的良好性能蛛淋,這正是大多數(shù)用戶所期望的而IP又沒有提供的功能。
TCP的主要功能
當(dāng)應(yīng)用層向TCP層發(fā)送用于網(wǎng)間傳輸?shù)拇垭纭⒂?位字節(jié)表示的數(shù)據(jù)流褐荷,TCP則把數(shù)據(jù)流分割成適當(dāng)長度的報文段,最大傳輸段大朽诘俊(MSS)通常受該計算機連接的網(wǎng)絡(luò)的數(shù)據(jù)鏈路層的最大傳送單元(MTU)限制叛甫。之后TCP把數(shù)據(jù)包傳給IP層,由它來通過網(wǎng)絡(luò)將包傳送給接收端實體的TCP層杨伙。
TCP為了保證報文傳輸?shù)目煽科浼啵徒o每個包一個序號,同時序號也保證了傳送到接收端實體的包的按序接收限匣。然后接收端實體對已成功收到的字節(jié)發(fā)回一個相應(yīng)的確認(rèn)(ACK)抖苦;如果發(fā)送端實體在合理的往返時延(RTT)內(nèi)未收到確認(rèn),那么對應(yīng)的數(shù)據(jù)(假設(shè)丟失了)將會被重傳米死。
在數(shù)據(jù)正確性與合法性上锌历,TCP用一個校驗和函數(shù)來檢驗數(shù)據(jù)是否有錯誤,在發(fā)送和接收時都要計算校驗和峦筒;同時可以使用md5認(rèn)證對數(shù)據(jù)進行加密究西。
在保證可靠性上,采用超時重傳和捎帶確認(rèn)機制物喷。
在流量控制上卤材,采用滑動窗口協(xié)議,協(xié)議中規(guī)定峦失,對于窗口內(nèi)未經(jīng)確認(rèn)的分組需要重傳扇丛。
在擁塞控制上,采用廣受好評的TCP擁塞控制算法(也稱AIMD算法)宠进。該算法主要包括四個主要部分:
(1)慢啟動
每當(dāng)建立一個TCP連接時或一個TCP連接發(fā)生超時重傳后晕拆,該連接便進入慢啟動階段。進入慢啟動后材蹬,TCP實體將擁塞窗口的大小初始化為一個報文段实幕,即:cwnd=1。此后堤器,每收到一個報文段的確認(rèn)(ACK)昆庇,cwnd值加1,即擁塞窗口按指數(shù)增加闸溃。當(dāng)cwnd值超過慢啟動闡值(sshterhs)或發(fā)生報文段丟失重傳時整吆,慢啟動階段結(jié)束拱撵。前者進入擁塞避免階段,后者重新進入慢啟動階段表蝙。
(2)擁塞避免
在慢啟階段拴测,當(dāng)cwnd值超過慢啟動闡值(ssthresh)后,慢啟動過程結(jié)束府蛇,TCP連接進入擁塞避免階段集索。在擁塞避免階段,每一次發(fā)送的cwnd個報文段被完全確認(rèn)后汇跨,才將cwnd值加1务荆。在此階段,cwnd值線性增加穷遂。
(3)快速重傳
快速重傳是對超時重傳的改進函匕。當(dāng)源端收到對同一個報文的三個重復(fù)確認(rèn)時,就確定一個報文段已經(jīng)丟失蚪黑,因此立刻重傳丟失的報文段盅惜,而不必等到重傳定時器(RTO)超時。以此減少不必要的等待時間祠锣。
(4)快速恢復(fù)
快速恢復(fù)是對丟失恢復(fù)機制的改進酷窥。在快速重傳之后,不經(jīng)過慢啟動過程而直接進入擁塞避免階段伴网。每當(dāng)快速重傳后,置sshtesrh=cwnd/2妆棒、ewnd=ssthresh+3澡腾。此后,每收到一個重復(fù)確認(rèn)糕珊,將cwnd值加1动分,直至收到對丟失報文段和其后若干報文段的累積確認(rèn)后,置cwnd=ssthesrh红选,進入擁塞避免階段澜公。
TCP的主要特點
TCP是一種面向廣域網(wǎng)的通信協(xié)議,目的是在跨越多個網(wǎng)絡(luò)通信時喇肋,為兩個通信端點之間提供一條具有下列特點的通信方式:
(1)基于流的方式坟乾;
(2)面向連接;
(3)可靠通信方式蝶防;
(4)在網(wǎng)絡(luò)狀況不佳的時候盡量降低系統(tǒng)由于重傳帶來的帶寬開銷甚侣;
(5)通信連接維護是面向通信的兩個端點的,而不考慮中間網(wǎng)段和節(jié)點间学。
為滿足TCP協(xié)議的這些特點殷费,TCP協(xié)議做了如下的規(guī)定:
①數(shù)據(jù)分片:在發(fā)送端對用戶數(shù)據(jù)進行分片印荔,在接收端進行重組,由TCP確定分片的大小并控制分片和重組详羡;
②到達(dá)確認(rèn):接收端接收到分片數(shù)據(jù)時仍律,根據(jù)分片數(shù)據(jù)序號向發(fā)送端發(fā)送一個確認(rèn);
③超時重發(fā):發(fā)送方在發(fā)送分片時啟動超時定時器实柠,如果在定時器超時之后沒有收到相應(yīng)的確認(rèn)水泉,重發(fā)分片;
④滑動窗口:TCP連接每一方的接收緩沖空間大小都固定主到,接收端只允許另一端發(fā)送接收端緩沖區(qū)所能接納的數(shù)據(jù)茶行,TCP在滑動窗口的基礎(chǔ)上提供流量控制,防止較快主機致使較慢主機的緩沖區(qū)溢出登钥;
⑤失序處理:作為IP數(shù)據(jù)報來傳輸?shù)腡CP分片到達(dá)時可能會失序畔师,TCP將對收到的數(shù)據(jù)進行重新排序,將收到的數(shù)據(jù)以正確的順序交給應(yīng)用層牧牢;
⑥重復(fù)處理:作為IP數(shù)據(jù)報來傳輸?shù)腡CP分片會發(fā)生重復(fù)看锉,TCP的接收端必須丟棄重復(fù)的數(shù)據(jù);
⑦數(shù)據(jù)校驗:TCP將保持它首部和數(shù)據(jù)的檢驗和塔鳍,這是一個端到端的檢驗和伯铣,目的是檢測數(shù)據(jù)在傳輸過程中的任何變化。如果收到分片的檢驗和有差錯轮纫,TCP將丟棄這個分片腔寡,并不確認(rèn)收到此報文段導(dǎo)致對端超時并重發(fā)。
TCP的工作方式
TCP協(xié)議是一種可靠的協(xié)議掌唾,在正式傳輸數(shù)據(jù)之前必須通過三次握手建立連接并且互相交換窗口大小放前。在傳輸結(jié)束之后,通過四次揮手來確認(rèn)雙方都結(jié)束數(shù)據(jù)交互糯彬。
(1). 三次握手(我要和你建立鏈接凭语,你真的要和我建立鏈接么,我真的要和你建立鏈接撩扒,成功):
第一次握手:Client將標(biāo)志位SYN置為1似扔,隨機產(chǎn)生一個值seq=J,并將該數(shù)據(jù)包發(fā)送給Server搓谆,Client進入SYN_SENT狀態(tài)炒辉,等待Server確認(rèn)。
第二次握手:Server收到數(shù)據(jù)包后由標(biāo)志位SYN=1知道Client請求建立連接挽拔,Server將標(biāo)志位SYN和ACK都置為1辆脸,ack=J+1,隨機產(chǎn)生一個值seq=K螃诅,并將該數(shù)據(jù)包發(fā)送給Client以確認(rèn)連接請求啡氢,Server進入SYN_RCVD狀態(tài)状囱。
第三次握手:Client收到確認(rèn)后,檢查ack是否為J+1倘是,ACK是否為1亭枷,如果正確則將標(biāo)志位ACK置為1,ack=K+1搀崭,并將該數(shù)據(jù)包發(fā)送給Server叨粘,Server檢查ack是否為K+1,ACK是否為1瘤睹,如果正確則連接建立成功升敲,Client和Server進入ESTABLISHED狀態(tài),完成三次握手轰传,隨后Client與Server之間可以開始傳輸數(shù)據(jù)了驴党。
客戶端經(jīng)歷了Close->SYN_SDENT->ESTABLISHED的狀態(tài)變化;
服務(wù)端經(jīng)歷了Close->Listen->SYN_RCVD->EATABLISHED的狀態(tài)變化获茬。
(2). 四次揮手(我要和你斷開鏈接港庄;好的,斷吧恕曲。我也要和你斷開鏈接鹏氧;好的,斷吧):
第一次揮手:Client發(fā)送一個FIN佩谣,用來關(guān)閉Client到Server的數(shù)據(jù)傳送把还,Client進入FIN_WAIT_1狀態(tài)。
第二次揮手:Server收到FIN后茸俭,發(fā)送一個ACK給Client笨篷,確認(rèn)序號為收到序號+1(與SYN相同,一個FIN占用一個序號)瓣履,Server進入CLOSE_WAIT狀態(tài)。此時TCP鏈接處于半關(guān)閉狀態(tài)练俐,即客戶端已經(jīng)沒有要發(fā)送的數(shù)據(jù)了袖迎,但服務(wù)端若發(fā)送數(shù)據(jù),則客戶端仍要接收腺晾。
第三次揮手:Server發(fā)送一個FIN燕锥,用來關(guān)閉Server到Client的數(shù)據(jù)傳送,Server進入LAST_ACK狀態(tài)悯蝉。
第四次揮手:Client收到FIN后归形,Client進入TIME_WAIT狀態(tài),接著發(fā)送一個ACK給Server鼻由,確認(rèn)序號為收到序號+1暇榴,Server進入CLOSED狀態(tài)厚棵,完成四次揮手。
為什么TCP鏈接需要三次握手蔼紧,兩次不可以么婆硬,為什么?
為了防止 已失效的鏈接請求報文突然又傳送到了服務(wù)端奸例,因而產(chǎn)生錯誤彬犯。
答:客戶端發(fā)出的連接請求報文并未丟失,而是在某個網(wǎng)絡(luò)節(jié)點長時間滯留了查吊,以致延誤到鏈接釋放以后的某個時間才到達(dá)Server谐区。這是,Server誤以為這是Client發(fā)出的一個新的鏈接請求逻卖,于是就向客戶端發(fā)送確認(rèn)數(shù)據(jù)包宋列,同意建立鏈接。若不采用“三次握手”箭阶,那么只要Server發(fā)出確認(rèn)數(shù)據(jù)包虚茶,新的鏈接就建立了。由于client此時并未發(fā)出建立鏈接的請求仇参,所以其不會理睬Server的確認(rèn)嘹叫,也不與Server通信;而這時Server一直在等待Client的請求诈乒,這樣Server就白白浪費了一定的資源罩扇。若采用“三次握手”,在這種情況下怕磨,由于Server端沒有收到來自客戶端的確認(rèn)喂饥,則就會知道Client并沒有要求建立請求,就不會建立鏈接肠鲫。
為什么斷開連接需要四次员帮?
答:根據(jù)狀態(tài)流程圖,我們可以看出服務(wù)端響應(yīng)斷開連接的請求時导饲,其ACK和FIN包并不是一起發(fā)送給客戶端的捞高,因為第一次由客戶端->服務(wù)端的FIN信號表示的是客戶端想要斷開連接。服務(wù)端先給出ACK確認(rèn)信號渣锦,表示已經(jīng)收到FIN請求硝岗,然后當(dāng)自己也可以結(jié)束的時候,再次發(fā)送FIN信號袋毙,所以需要揮手交互需要四次型檀。
四次揮手主動方為什么需要等待2MSL?
答:主動關(guān)閉方在收到被動一方發(fā)出的FIN信號听盖,會立馬發(fā)送ACK確認(rèn)信號胀溺,之后狀態(tài)轉(zhuǎn)變?yōu)門IME_WAIT裂七,等待2MSL后才會進入CLOSE狀態(tài)。我們先來解釋下什么叫MSL(Maximum Segment Lifetime)吧月幌。
MSL表示最大報文生存周期碍讯,任何報文在網(wǎng)絡(luò)上存在的最長時間,超過這個時間報文將被丟棄扯躺。
主動關(guān)閉方需要等待2MSL是為了捉兴,防止最后一次ACK沒有被正確的傳給被動方,被動關(guān)閉方會再次發(fā)送第三次的FIN信號录语。
TCP的可靠性實現(xiàn)
可靠性
TCP提供一種面向連接的倍啥、可靠的字節(jié)流服務(wù)。其中澎埠,面向連接意味著兩個使用TCP的應(yīng)用(通常是一個客戶和一個服務(wù)器)在彼此交換數(shù)據(jù)之前必須先建立一個TCP連接虽缕。在一個TCP連接中,僅有兩方進行彼此通信蒲稳;而字節(jié)流服務(wù)意味著兩個應(yīng)用程序通過TCP鏈接交換8bit字節(jié)構(gòu)成的字節(jié)流氮趋,TCP不在字節(jié)流中插入記錄標(biāo)識符。
TCP通過下列方式來提供可靠性:
數(shù)據(jù)包校驗:目的是檢測數(shù)據(jù)在傳輸過程中的任何變化江耀,若校驗出包有錯剩胁,則丟棄報文段并且不給出響應(yīng),這時TCP發(fā)送數(shù)據(jù)端超時后會重發(fā)數(shù)據(jù)祥国;
對失序數(shù)據(jù)包重排序:既然TCP報文段作為IP數(shù)據(jù)報來傳輸昵观,而IP數(shù)據(jù)報的到達(dá)可能會失序,因此TCP報文段的到達(dá)也可能會失序舌稀。TCP將對失序數(shù)據(jù)進行重新排序啊犬,然后才交給應(yīng)用層;
丟棄重復(fù)數(shù)據(jù):對于重復(fù)數(shù)據(jù)壁查,能夠丟棄重復(fù)數(shù)據(jù)觉至;
應(yīng)答機制:當(dāng)TCP收到發(fā)自TCP連接另一端的數(shù)據(jù),它將發(fā)送一個確認(rèn)睡腿。這個確認(rèn)不是立即發(fā)送康谆,通常將推遲幾分之一秒;
超時重發(fā):當(dāng)TCP發(fā)出一個段后嫉到,它啟動一個定時器,等待目的端確認(rèn)收到這個報文段月洛。如果不能及時收到一個確認(rèn)何恶,將重發(fā)這個報文段;
流量控制:TCP連接的每一方都有固定大小的緩沖空間嚼黔。TCP的接收端只允許另一端發(fā)送接收端緩沖區(qū)所能接納的數(shù)據(jù)细层,這可以防止較快主機致使較慢主機的緩沖區(qū)溢出惜辑,這就是流量控制。TCP使用的流量控制協(xié)議是可變大小的滑動窗口協(xié)議疫赎。
兩個應(yīng)用程序通過TCP連接交換8bit字節(jié)構(gòu)成的字節(jié)流盛撑。TCP不在字節(jié)流中插入記錄標(biāo)識符。我們將這稱為字節(jié)流服務(wù)(bytestreamservice)捧搞。如果一方的應(yīng)用程序先傳10字節(jié)抵卫,又傳20字節(jié),再傳50字節(jié)胎撇,連接的另一方將無法了解發(fā)方每次發(fā)送了多少字節(jié)介粘。只要自己的接收緩存沒有塞滿,TCP 接收方將有多少就收多少晚树。一端將字節(jié)流放到TCP連接上姻采,同樣的字節(jié)流將出現(xiàn)在TCP連接的另一端。
另外爵憎,TCP對字節(jié)流的內(nèi)容不作任何解釋慨亲。TCP不知道傳輸?shù)臄?shù)據(jù)字節(jié)流是二進制數(shù)據(jù),還是ASCⅡ字符宝鼓、EBCDIC字符或者其他類型數(shù)據(jù)刑棵。對字節(jié)流的解釋由TCP連接雙方的應(yīng)用層解釋。
這種對字節(jié)流的處理方式與Unix操作系統(tǒng)對文件的處理方式很相似席函。Unix的內(nèi)核對一個應(yīng)用讀或?qū)懙膬?nèi)容不作任何解釋铐望,而是交給應(yīng)用程序處理。對Unix的內(nèi)核來說茂附,它無法區(qū)分一個二進制文件與一個文本文件正蛙。
重傳策略
TCP協(xié)議用于控制數(shù)據(jù)段是否需要重傳的依據(jù)是設(shè)立重發(fā)定時器。在發(fā)送一個數(shù)據(jù)段的同時啟動一個重傳营曼,如果在重傳超時前收到確認(rèn)(Acknowlegement)就關(guān)閉該重傳乒验,如果重傳超時前沒有收到確認(rèn),則重傳該數(shù)據(jù)段蒂阱。在選擇重發(fā)時間的過程中锻全,TCP必須具有自適應(yīng)性。它需要根據(jù)互聯(lián)網(wǎng)當(dāng)時的通信情況录煤,給出合適的重發(fā)時間鳄厌。
這種重傳策略的關(guān)鍵是對定時器初值的設(shè)定。采用較多的算法是Jacobson于1988年提出的一種不斷調(diào)整超時時間間隔的動態(tài)算法妈踊。其工作原理是:對每條連接TCP都保持一個變量RTT(Round Trip Time)了嚎,用于存放當(dāng)前到目的端往返所需要時間最接近的估計值。當(dāng)發(fā)送一個數(shù)據(jù)段時,同時啟動連接的定時器歪泳,如果在定時器超時前確認(rèn)到達(dá)萝勤,則記錄所需要的時間(M),并修正RTT的值呐伞,如果定時器超時前沒有收到確認(rèn)敌卓,則將RTT的值增加1倍。通過測量一系列的RTT(往返時間)值伶氢,TCP協(xié)議可以估算數(shù)據(jù)包重發(fā)前需要等待的時間趟径。在估計該連接所需的當(dāng)前延遲時通常利用一些統(tǒng)計學(xué)的原理和算法(如Karn算法),從而得到TCP重發(fā)之前需要等待的時間值鞍历。
窗口確認(rèn)
TCP的一項功能就是確保每個數(shù)據(jù)段都能到達(dá)目的地舵抹。位于目的主機的TCP服務(wù)對接受到的數(shù)據(jù)進行確認(rèn),并向源應(yīng)用程序發(fā)送確認(rèn)信息劣砍。使用數(shù)據(jù)報頭序列號以及確認(rèn)號來確認(rèn)已收到包含在數(shù)據(jù)段的相關(guān)的數(shù)據(jù)字節(jié)惧蛹。
TCP在發(fā)回源設(shè)備的數(shù)據(jù)段中使用確認(rèn)號,指示接收設(shè)備期待接收的下一字節(jié)刑枝。這個過程稱為期待確認(rèn)香嗓。
源主機在收到確認(rèn)消息之前可以傳輸?shù)臄?shù)據(jù)的大小稱為窗口大小。用于管理丟失數(shù)據(jù)和流量控制装畅。
網(wǎng)絡(luò)數(shù)據(jù)包
網(wǎng)絡(luò)數(shù)據(jù)包一般包括頭部和數(shù)據(jù)部分靠娱,在TCP協(xié)議中,要發(fā)送的數(shù)據(jù)經(jīng)過TCP模塊添加TCP頭部掠兄;然后IP模塊添加IP頭部和MAC頭部像云;然后在最前面加上報頭/起始幀分界符以及末尾假如FCS(幀校驗序列),這樣就構(gòu)成了一個完成的數(shù)據(jù)包蚂夕。
在UDP協(xié)議中就是UDP頭部迅诬,各個頭部都有其固定的格式,TCP頭部最小20個字節(jié)婿牍,UDP頭部最小8個字節(jié)侈贷。
TCP協(xié)議中的數(shù)據(jù)包分片與重組功能
當(dāng)TCP傳輸?shù)臄?shù)據(jù)包比較大時,在接收方會進行分片等脂,在接收方進行數(shù)據(jù)包的重組俏蛮。
發(fā)送方:
將數(shù)據(jù)包分為多個TCP頭部+數(shù)據(jù)包的組合,TCP頭部中存著不同的數(shù)據(jù)序號上遥;之后將多個組合交由IP模塊搏屑,統(tǒng)一添加IP頭部和MAC頭部,IP頭部的ID號設(shè)為統(tǒng)一的粉楚。
接收方:
IP模塊具有分片重組的功能睬棚,如果接收到的包是經(jīng)過分片的,那么IP模塊會將它們還原成原始的包。
分片的包會在IP頭部的標(biāo)志字段中進行標(biāo)記抑党,當(dāng)收到分片的包時,IP模塊會將其暫時存在內(nèi)部的內(nèi)存空間中撵摆,然后等待IP頭部中具有相同ID的包全部到達(dá)底靠,因為同一個包的所有分片都具有相同的ID。此外特铝,IP頭部還有一個分片偏移量的字段暑中,它表示當(dāng)前分片在整個包中所處的位置。根據(jù)這些信息鲫剿,在所有的分片全部收到之后鳄逾,就可以將它們還原成原始的包。
解析:
數(shù)據(jù)包的分片和重組里邊還涉及到了MTU和MSS的概念灵莲,介紹如下:
MTU: Maxitum Transmission Unit 最大傳輸單元
MSS: Maxitum Segment Size 最大分段大小雕凹,MSS就是TCP數(shù)據(jù)包每次能夠傳輸?shù)淖畲髷?shù)據(jù)分段。
UDP協(xié)議簡介
Internet 協(xié)議集支持一個無連接的傳輸協(xié)議政冻,該協(xié)議稱為用戶數(shù)據(jù)報協(xié)議(UDP枚抵,User Datagram Protocol)。UDP 為應(yīng)用程序提供了一種無需建立連接就可以發(fā)送封裝的 IP 數(shù)據(jù)包的方法明场。
Internet 的傳輸層有兩個主要協(xié)議汽摹,互為補充。無連接的是 UDP苦锨,它除了給應(yīng)用程序發(fā)送數(shù)據(jù)包功能并允許它們在所需的層次上架構(gòu)自己的協(xié)議之外逼泣,幾乎沒有做什么特別的事情。面向連接的是TCP舟舒,該協(xié)議幾乎做了所有的事情拉庶。
UDP協(xié)議與TCP協(xié)議一樣用于處理數(shù)據(jù)包,在OSI模型中魏蔗,兩者都位于傳輸層砍的,處于IP協(xié)議的上一層。UDP有不提供數(shù)據(jù)包分組莺治、組裝和不能對數(shù)據(jù)包進行排序的缺點廓鞠,也就是說,當(dāng)報文發(fā)送之后谣旁,是無法得知其是否安全完整到達(dá)的床佳。UDP用來支持那些需要在計算機之間傳輸數(shù)據(jù)的網(wǎng)絡(luò)應(yīng)用。包括網(wǎng)絡(luò)視頻會議系統(tǒng)在內(nèi)的眾多的客戶/服務(wù)器模式的網(wǎng)絡(luò)應(yīng)用都需要使用UDP協(xié)議榄审。UDP協(xié)議從問世至今已經(jīng)被使用了很多年砌们,雖然其最初的光彩已經(jīng)被一些類似協(xié)議所掩蓋,但即使在今天UDP仍然不失為一項非常實用和可行的網(wǎng)絡(luò)傳輸層協(xié)議。
許多應(yīng)用只支持UDP浪感,如:多媒體數(shù)據(jù)流昔头,不產(chǎn)生任何額外的數(shù)據(jù),即使知道有破壞的包也不進行重發(fā)影兽。當(dāng)強調(diào)傳輸性能而不是傳輸?shù)耐暾詴r揭斧,如:音頻和多媒體應(yīng)用,UDP是最好的選擇峻堰。在數(shù)據(jù)傳輸時間很短讹开,以至于此前的連接過程成為整個流量主體的情況下,UDP也是一個好的選擇捐名。
UDP的主要特點
UDP是一個無連接協(xié)議旦万,傳輸數(shù)據(jù)之前源端和終端不建立連接,當(dāng)它想傳送時就簡單地去抓取來自應(yīng)用程序的數(shù)據(jù)镶蹋,并盡可能快地把它扔到網(wǎng)絡(luò)上成艘。在發(fā)送端,UDP傳送數(shù)據(jù)的速度僅僅是受應(yīng)用程序生成數(shù)據(jù)的速度梅忌、計算機的能力和傳輸帶寬的限制狰腌;在接收端,UDP把每個消息段放在隊列中牧氮,應(yīng)用程序每次從隊列中讀一個消息段琼腔。
由于傳輸數(shù)據(jù)不建立連接,因此也就不需要維護連接狀態(tài)踱葛,包括收發(fā)狀態(tài)等丹莲,因此一臺服務(wù)機可同時向多個客戶機傳輸相同的消息。
UDP信息包的標(biāo)題很短尸诽,只有8個字節(jié)甥材,相對于TCP的20個字節(jié)信息包而言UDP的額外開銷很小。
吞吐量不受擁擠控制算法的調(diào)節(jié)性含,只受應(yīng)用軟件生成數(shù)據(jù)的速率洲赵、傳輸帶寬、源端和終端主機性能的限制商蕴。
UDP是面向報文的叠萍。發(fā)送方的UDP對應(yīng)用程序交下來的報文,在添加首部后就向下交付給IP層绪商。既不拆分苛谷,也不合并,而是保留這些報文的邊界格郁,因此腹殿,應(yīng)用程序需要選擇合適的報文大小独悴。
雖然UDP是一個不可靠的協(xié)議,但它是分發(fā)信息的一個理想?yún)f(xié)議锣尉。例如刻炒,在屏幕上報告股票市場、顯示航空信息等等自沧。UDP也用在路由信息協(xié)議RIP(Routing Information Protocol)中修改路由表落蝙。在這些應(yīng)用場合下,如果有一個消息丟失暂幼,在幾秒之后另一個新的消息就會替換它。UDP廣泛用在多媒體應(yīng)用中移迫。
UDP的主要應(yīng)用
適應(yīng)場合
在選擇UDP作為傳輸協(xié)議時必須要謹(jǐn)慎旺嬉。在網(wǎng)絡(luò)質(zhì)量令人十分不滿意的環(huán)境下,UDP協(xié)議數(shù)據(jù)包丟失會比較嚴(yán)重厨埋。但是由于UDP的特性:它不屬于連接型協(xié)議邪媳,因而具有資源消耗小,處理速度快的優(yōu)點荡陷,所以通常音頻雨效、視頻和普通數(shù)據(jù)在傳送時使用UDP較多,因為它們即使偶爾丟失一兩個數(shù)據(jù)包废赞,也不會對接收結(jié)果產(chǎn)生太大影響徽龟。比如我們聊天用的ICQ和QQ就是使用的UDP協(xié)議。
實際應(yīng)用
在現(xiàn)場測控領(lǐng)域唉地,面向的是分布化的控制器据悔、監(jiān)測器等,其應(yīng)用場合環(huán)境比較惡劣耘沼,這樣就對待傳輸數(shù)據(jù)提出了不同的要求极颓,如實時、抗干擾性群嗤、安全性等菠隆。基于此狂秘,現(xiàn)場通信中骇径,若某一應(yīng)用要將一組數(shù)據(jù)傳送給網(wǎng)絡(luò)中的另一個節(jié)點,可由UDP進程將數(shù)據(jù)加上報頭后傳送給IP進程赃绊,UDP協(xié)議省去了建立連接和拆除連接的過程!取消了重發(fā)檢驗機制既峡,能夠達(dá)到較高的通信速率。
TCP和UDP的對比
UDP和TCP協(xié)議的主要區(qū)別是兩者在如何實現(xiàn)信息的可靠傳遞方面不同碧查。TCP協(xié)議中包含了專門的傳遞保證機制运敢,當(dāng)數(shù)據(jù)接收方收到發(fā)送方傳來的信息時校仑,會自動向發(fā)送方發(fā)出確認(rèn)消息;發(fā)送方只有在接收到該確認(rèn)消息之后才繼續(xù)傳送其它信息传惠,否則將一直等待直到收到確認(rèn)信息為止迄沫。與TCP不同,UDP協(xié)議并不提供數(shù)據(jù)傳送的保證機制卦方。如果在從發(fā)送方到接收方的傳遞過程中出現(xiàn)數(shù)據(jù)包的丟失羊瘩,協(xié)議本身并不能做出任何檢測或提示。因此盼砍,通常人們把UDP協(xié)議稱為不可靠的傳輸協(xié)議尘吗。
TCP 是面向連接的傳輸控制協(xié)議,而UDP 提供了無連接的數(shù)據(jù)報服務(wù)浇坐;TCP 具有高可靠性睬捶,確保傳輸數(shù)據(jù)的正確性,不出現(xiàn)丟失或亂序近刘;UDP 在傳輸數(shù)據(jù)前不建立連接擒贸,不對數(shù)據(jù)報進行檢查與修改,無須等待對方的應(yīng)答觉渴,所以會出現(xiàn)分組丟失介劫、重復(fù)、亂序案淋,應(yīng)用程序需要負(fù)責(zé)傳輸可靠性方面的所有工作座韵;UDP 具有較好的實時性,工作效率較 TCP 協(xié)議高哎迄;UDP 段結(jié)構(gòu)比 TCP 的段結(jié)構(gòu)簡單回右,因此網(wǎng)絡(luò)開銷也小。TCP 協(xié)議可以保證接收端毫無差錯地接收到發(fā)送端發(fā)出的字節(jié)流漱挚,為應(yīng)用程序提供可靠的通信服務(wù)翔烁。對可靠性要求高的通信系統(tǒng)往往使用 TCP 傳輸數(shù)據(jù)删铃。
對比總結(jié):
TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)協(xié)議屬于傳輸層協(xié)議泡仗,它們之間的區(qū)別包括:
TCP是面向連接的冗栗,UDP是無連接的忿项;
TCP是可靠的沮趣,UDP是不可靠的粹庞;
TCP只支持點對點通信玫芦,UDP支持一對一耻瑟、一對多弧腥、多對一厦取、多對多的通信模式;
TCP是面向字節(jié)流的管搪,UDP是面向報文的虾攻;
TCP有擁塞控制機制;UDP沒有擁塞控制铡买,適合媒體通信;
TCP首部開銷(20個字節(jié))比UDP的首部開銷(8個字節(jié))要大霎箍;