TCP和UDP是兩個(gè)傳輸層協(xié)議,廣泛應(yīng)用于網(wǎng)絡(luò)中不同主機(jī)之間傳輸數(shù)據(jù)势似。對(duì)任何程序員來(lái)說(shuō)顶岸,熟悉TCP和UDP的工作方式都是至關(guān)重要的腔彰。這就是為什么TCP和UDP是一個(gè)流行的Java編程面試問(wèn)題。我曾經(jīng)在各種不同的Java面試中見(jiàn)過(guò)這個(gè)問(wèn)題,尤其是對(duì)服務(wù)器端Java開(kāi)發(fā)人員的面試辖佣。由于FIX(金融信息交換)協(xié)議也是一個(gè)基于TCP協(xié)議,一些投資銀行,對(duì)沖基金,和交換解決方案提供商也在尋找有良好的TCP和UDP的知識(shí)的Java開(kāi)發(fā)人員霹抛。為高速電子交易平臺(tái)編寫(xiě)FIX引擎和服務(wù)器端組件需要能夠?qū)?shù)據(jù)結(jié)構(gòu)、算法以及網(wǎng)絡(luò)等基本知識(shí)都理解透徹的的開(kāi)發(fā)人員的
順便說(shuō)一下,使用TCP和UDP并不局限于一個(gè)領(lǐng)域,它處于互聯(lián)網(wǎng)的中心位置卷谈。HTTP是基于TCP杯拐,而HTTP是整個(gè)互聯(lián)網(wǎng)的核心部分。另一個(gè)Java開(kāi)發(fā)人員應(yīng)該理解這兩個(gè)協(xié)議的理由是, java廣泛用于編寫(xiě)多線(xiàn)程世蔗、并行以及可伸縮的服務(wù)器程序端逼。Java還提供了豐富的基于TCP和UDP套接字編程API。在這篇文章中,我們將學(xué)習(xí)TCP和UDP協(xié)議之間的關(guān)鍵差異污淋。首先,TCP代表傳輸控制協(xié)議和UDP代表用戶(hù)數(shù)據(jù)報(bào)協(xié)議,兩者都廣泛的應(yīng)用于構(gòu)建互聯(lián)網(wǎng)應(yīng)用顶滩。
TCP與UDP之間的區(qū)別
我喜歡比較兩事物的不同點(diǎn),這不僅使他們更加容易比較寸爆,而且會(huì)更容易記住他們之間的差異礁鲁。當(dāng)我們比較TCP,UDP赁豆,我們需要了解TCP和UDP各自的工作方式仅醇,了解哪種協(xié)議提供了可靠保證交付和而哪個(gè)又沒(méi)有。哪種協(xié)議是快速的魔种,他為什么更加快速析二,最重要的是,當(dāng)我們了解了這些节预,在建設(shè)我們自己的分布式應(yīng)用程序時(shí)叶摄,就知道該選擇TCP還是 UDP。在這篇文章中安拟,我們將看到9點(diǎn)UDP和TCP之間的差異准谚,例如,連接步驟去扣,排序,速度樊破,可靠性愉棱,開(kāi)銷(xiāo),頭大小哲戚,擁塞控制奔滑,應(yīng)用以及基于TCP和UDP協(xié)議不同,他們?nèi)绾蝹鬏敂?shù)據(jù)顺少。
1. 基于連接vs無(wú)連接
他們之間的第一點(diǎn)并且最重要的區(qū)別是:TCP是面向連接的協(xié)議朋其,而UDP是無(wú)連接的協(xié)議王浴。這意味著當(dāng)一個(gè)客戶(hù)端和一個(gè)服務(wù)器通過(guò)TCP發(fā)送數(shù)據(jù)之前,必須先建立連接梅猿,他們可以通過(guò)TCP發(fā)送數(shù)據(jù)氓辣。建立連接的過(guò)程也被稱(chēng)為T(mén)CP握手,他通過(guò)控制消息在客戶(hù)端和服務(wù)器之間互換來(lái)實(shí)現(xiàn)袱蚓。下面的圖形象描述了TCP握手過(guò)程钞啸。客戶(hù)端喇潘,它也是TCP連接的發(fā)起者体斩,發(fā)送一個(gè)SYN消息給服務(wù)器,該服務(wù)器端正在監(jiān)聽(tīng)某個(gè)TCP端口颖低。服務(wù)器接收該消息并發(fā)送一個(gè)SYN-ACK消息絮吵,客戶(hù)端接受到該消息之后會(huì)再回一個(gè)ACK消息。一旦服務(wù)器收到ACK消息忱屑,TCP連接就建立成功蹬敲,準(zhǔn)備數(shù)據(jù)傳輸了。另一方面想幻,UDP是無(wú)連接的協(xié)議粱栖,和點(diǎn)對(duì)點(diǎn)連接之前不需要發(fā)送消息。這就是為什么脏毯,UDP更加適合消息的多播發(fā)布闹究,從單個(gè)點(diǎn)向多個(gè)點(diǎn)傳輸消息。
圖1:TCP消息握手(TCP - Handshake Message)
2. 可靠性 不同
TCP提供交付保證,這意味著一個(gè)使用TCP協(xié)議發(fā)送的消息是保證交付給客戶(hù)端的食店。如果消息在傳輸過(guò)程中丟失,那么它將重發(fā),這是由TCP協(xié)議本身控制的渣淤。另一方面,UDP是不可靠的,它不提供任何交付的保證。一個(gè)數(shù)據(jù)報(bào)包在運(yùn)輸途中可能會(huì)丟失吉嫩。這就是為什么UDP是不適合保證交付的項(xiàng)目价认。
3.有序性
除了提供交付保證,為T(mén)CP也保證了消息的有序性自娩。該消息將以從服務(wù)器端發(fā)出的同樣的順序發(fā)送到客戶(hù)端用踩,盡管這些消息到網(wǎng)絡(luò)的另一端時(shí)可能是無(wú)序的。TCP協(xié)議將會(huì)為你排好序忙迁。UDP不提供任何有序性或序列性的保證脐彩。數(shù)據(jù)包將以任何可能的順序到達(dá)。這就是為什么TCP是適合需要順序交付方式的應(yīng)用姊扔,盡管有基于UDP的協(xié)議通過(guò)使用序列號(hào)和重傳來(lái)提供有序和可靠性的應(yīng)用惠奸,如TIBCO Rendezvous,他實(shí)際上就是一個(gè)基于UDP的應(yīng)用恰梢。
4.數(shù)據(jù)邊界
TCP不保存數(shù)據(jù)的邊界佛南,而UDP保證梗掰。在傳輸控制協(xié)議,數(shù)據(jù)以字節(jié)流的形式發(fā)送嗅回,并沒(méi)有明顯的標(biāo)志表明傳輸信號(hào)消息(段)的邊界及穗。在UDP中,數(shù)據(jù)包單獨(dú)發(fā)送的妈拌,只有當(dāng)他們到達(dá)時(shí),才會(huì)再次集成猜惋。包有明確的界限來(lái)哪些包已經(jīng)收到著摔,這意味著在消息發(fā)送后,在接收器接口將會(huì)有一個(gè)讀操作定续,來(lái)生成一個(gè)完整的消息谍咆。雖然TCP也將在收集所有字節(jié)之后生成一個(gè)完整的消息,但是這些信息在傳給傳輸給接受端之前將儲(chǔ)存在TCP緩沖區(qū)私股,以確保更好的使用網(wǎng)絡(luò)帶寬
5.速度
總而言之摹察,TCP速度比較慢,而UDP速度比較快倡鲸,因?yàn)門(mén)CP必須創(chuàng)建連接供嚎,以保證消息的可靠交付和有序性克滴,他需要做比UDP多的多的事。這就是為什么UDP更適用于對(duì)速度比較敏感的應(yīng)用优床,例如:在線(xiàn)視頻媒體劝赔,電視廣播和多人在線(xiàn)游戲。
6.重量級(jí)vs輕量級(jí)
由于上述的開(kāi)銷(xiāo)胆敞,TCP被認(rèn)為是重量級(jí)的協(xié)議仍翰,而與之相比,UDP協(xié)議則是一個(gè)輕量級(jí)的協(xié)議幽钢。因?yàn)閁DP傳輸?shù)男畔⒅胁怀袚?dān)任何間接創(chuàng)造連接,保證交貨或秩序的的信息傅是。這也反映在用于承載元數(shù)據(jù)的頭的大小匪燕。
7. 頭大小
TCP具有比UDP更大的頭蕾羊。一個(gè)TCP數(shù)據(jù)包報(bào)頭的大小是20字節(jié),UDP數(shù)據(jù)報(bào)報(bào)頭是8個(gè)字節(jié)帽驯。TCP報(bào)頭中包含序列號(hào)龟再,ACK號(hào),數(shù)據(jù)偏移量尼变,保留利凑,控制位,窗口嫌术,緊急指針哀澈,可選項(xiàng),填充項(xiàng)度气,校驗(yàn)位割按,源端口和目的端口。而UDP報(bào)頭只包含長(zhǎng)度磷籍,源端口號(hào)适荣,目的端口,和校驗(yàn)和院领。下圖是TCP和UDP頭:
圖2:TCP包格式(TCP Packet Format)
圖3:UDP包格式(UDP Packet format)
8. 擁塞或流控制
TCP有流量控制弛矛。在任何用戶(hù)數(shù)據(jù)可以被發(fā)送之前,TCP需要三數(shù)據(jù)包來(lái)設(shè)置一個(gè)套接字連接比然。TCP處理的可靠性和擁塞控制丈氓。另一方面,UDP不能進(jìn)行流量控制谈秫。
9. 用法和應(yīng)用
在互聯(lián)網(wǎng)中扒寄,TCP和UDP都運(yùn)行在哪些環(huán)境中了?在了解了TCP和UDP之間的關(guān)鍵差異之后拟烫,我們可以很容易地得出結(jié)論该编,哪種情況適合他們。由于TCP提供可靠交付和有序性的保證硕淑,它是最適合需要高可靠并且對(duì)傳輸時(shí)間要求不高的應(yīng)用课竣。UDP是更適合的應(yīng)用程序需要快速,高效的傳輸?shù)膽?yīng)用置媳,如游戲于樟。UDP是無(wú)狀態(tài)的性質(zhì),在服務(wù)器端需要對(duì)大量客戶(hù)端產(chǎn)生的少量請(qǐng)求進(jìn)行應(yīng)答的應(yīng)用中是非常有用的拇囊。在實(shí)踐中迂曲,TCP被用于金融領(lǐng)域,如FIX協(xié)議是一種基于TCP的協(xié)議寥袭,而UDP是大量使用在游戲和娛樂(lè)場(chǎng)所路捧。
基于TCP和UDP的協(xié)議
基于TCP協(xié)議的最好例子是HTTP協(xié)議和HTTPS協(xié)議关霸,他們幾乎存在于互聯(lián)網(wǎng)的任何地方,實(shí)際上杰扫,絕大多數(shù)你所熟悉的通常協(xié)議队寇,都是基于TCP的,例如:Telnet章姓,F(xiàn)TP以及SMTP協(xié)議佳遣。UDP協(xié)議沒(méi)有TCP協(xié)議那么受歡迎,但是也被廣泛應(yīng)用凡伊,比如DHCP以及DNS協(xié)議零渐,其他還有一些基于UDP的協(xié)議如SNMP,TFTP,BOOTP以及NFS(早期版本)。
特別需要記住的是窗声,TCP是面向連接的相恃,可靠的,緩慢的笨觅,可靠交付以及保證消息順序的拦耐,而UDP是無(wú)連接的,不可靠的见剩,沒(méi)有序列保證杀糯,但是一個(gè)快速傳輸?shù)膮f(xié)議。TCP頭開(kāi)銷(xiāo)也比UDP高得多苍苞,因?yàn)樗總€(gè)數(shù)據(jù)包中藥發(fā)送更多的元數(shù)據(jù)固翰。值得一提的是,TCP頭的大小是20個(gè)字節(jié)羹呵,而UDP頭大小是8個(gè)字節(jié)骂际。如果你不想丟失任何消息,使用TCP協(xié)議冈欢,而UDP能夠高速傳輸數(shù)據(jù)歉铝,并且丟失少量的數(shù)據(jù)包是可以接受的,如視頻流或在線(xiàn)多玩家游戲凑耻。對(duì)于基于TCP / UDP協(xié)議太示,運(yùn)行在Linux上的應(yīng)用,需要牢記的基本網(wǎng)絡(luò)命令香浩,如Telnet和netstat类缤,他們極大的幫助調(diào)試和排除任何連接問(wèn)題。