在單片機(jī)應(yīng)用程序開(kāi)發(fā)中可能用得比較多有RS485,CAN通信等等相對(duì)簡(jiǎn)潔一點(diǎn)的總線,由于所選用的單片機(jī)性能和資源有限,以太網(wǎng)并沒(méi)有在單片機(jī)應(yīng)用中作為一種普遍存在的對(duì)外通信接口。
但隨著MCU工藝、性能的逐漸加強(qiáng),以及嵌入式Linux平臺(tái)的推行,以太網(wǎng)通信也慢慢開(kāi)始成為開(kāi)發(fā)者們所考慮使用的一種可靠通信方式。
經(jīng)常有一些朋友問(wèn)到,現(xiàn)在用不到技術(shù)和知識(shí)點(diǎn)是不是可以不用學(xué)?
我只能回答:技術(shù)在不斷的革新,并且總是朝著更加便利和通用化方向發(fā)展,現(xiàn)在看似非常復(fù)雜的技術(shù),在以后的應(yīng)用上都會(huì)得以簡(jiǎn)化,但即使再簡(jiǎn)化也還是需要有必備的一些基礎(chǔ)和認(rèn)識(shí),所以總歸還是要學(xué)的,至于什么時(shí)候?qū)W就看自己的時(shí)間精力了,當(dāng)然越早學(xué)習(xí),就越多一種選擇。
那么,今天就淺談一下TCP與UDP的區(qū)別與應(yīng)用,并指引后續(xù)在系統(tǒng)通信設(shè)計(jì)上的設(shè)計(jì)考慮和選擇。
1
TCP VS UDP
要想在通信的兩者之間合理的選擇TCP還是UDP,首先需要理清楚兩者的特點(diǎn)與區(qū)別,下面簡(jiǎn)單梳理一下:
在學(xué)習(xí)這兩種協(xié)議的時(shí)候你一定看到過(guò)這樣中一句總結(jié)的話:“TCP是面向連接的可靠傳輸而UDP是無(wú)連接的不可靠傳輸?!?/p>
其實(shí)這句話已經(jīng)把這兩種協(xié)議大部分特點(diǎn)都囊括在內(nèi)了:
1、面向連接與無(wú)連接
TCP在傳輸數(shù)據(jù)之前需要經(jīng)過(guò)三次握手建立連接進(jìn)行相互確認(rèn),當(dāng)需要斷開(kāi)連接的時(shí)候需要進(jìn)行四次揮手;而對(duì)于UDP就不需要這么繁瑣的連接建立過(guò)程,直接傳輸即可。
所以對(duì)于TCP僅僅只支持單播,只能點(diǎn)對(duì)點(diǎn)的在連接的兩個(gè)端點(diǎn)中數(shù)據(jù)傳輸數(shù)據(jù),不支持多播和廣播;而對(duì)于UDP而言支持一對(duì)多、多對(duì)一和多對(duì)多的傳輸,這一點(diǎn)在通信架構(gòu)設(shè)計(jì)中對(duì)這兩種協(xié)議的選擇非常重要,比如有些資源優(yōu)先的MCU對(duì)socket連接有限等等問(wèn)題。
2、字節(jié)流與數(shù)據(jù)報(bào)
UDP也稱之為是用戶數(shù)據(jù)報(bào)協(xié)議,而TCP為傳輸控制協(xié)議,所以UDP是一種面向應(yīng)用報(bào)文的傳輸,有明顯的傳輸邊界,僅僅只是封包以后進(jìn)行處理,不會(huì)進(jìn)行合并和拆分,一次就傳輸一個(gè)報(bào)文。
但是TCP是一種面向字節(jié)流的通信協(xié)議,沒(méi)有明顯的邊界,其主要是保證數(shù)據(jù)正確且有序,TCP存在一個(gè)數(shù)據(jù)緩存區(qū),如果數(shù)據(jù)量較大,其會(huì)進(jìn)行分包發(fā)出,而當(dāng)數(shù)據(jù)較少也會(huì)等待數(shù)據(jù)達(dá)到合適的數(shù)量后進(jìn)行合并發(fā)送,所以會(huì)存在多個(gè)粘包的問(wèn)題,這一點(diǎn)在設(shè)計(jì)中需要考慮。
3、可靠傳輸
TCP是一種可靠傳輸,確認(rèn)重傳、差錯(cuò)控制、流量控制和擁塞控制等等都是傳輸數(shù)據(jù)過(guò)程中實(shí)現(xiàn)的策略和算法,這就使得TCP能夠達(dá)到數(shù)據(jù)上無(wú)差錯(cuò)、不丟失、不重復(fù)、有序。
所以為了保證這些數(shù)據(jù)的可靠傳輸,TCP相比UDP的報(bào)文格式要復(fù)雜,且占用的資源也相對(duì)較多。
而UDP則不同,它僅僅只是一種最大努力交付的協(xié)議,其主要是利用IP層的無(wú)連接傳通信服務(wù),可靠性方面它是無(wú)法保障的,有點(diǎn)類似于串口通信,它不需要連接,只管傳輸。
如果你想讓數(shù)據(jù)可靠,那么用戶可以在應(yīng)用層自己來(lái)增加可靠性傳輸策略和機(jī)制來(lái)進(jìn)行實(shí)現(xiàn),所以Udp傳輸數(shù)據(jù)是可能會(huì)丟失、無(wú)序。
4、實(shí)時(shí)性
UDP由于沒(méi)有擁塞控制等等策略,協(xié)議上會(huì)輕量很多,其均以比較恒定的速度進(jìn)行傳輸,不會(huì)出現(xiàn)發(fā)送速率降低的問(wèn)題,所以在網(wǎng)絡(luò)不好的情況下就丟包了。
而對(duì)于TCP一旦有數(shù)據(jù)包丟失,就會(huì)進(jìn)行重傳等等一系列機(jī)制,傳輸速度大大降低。
2
項(xiàng)目中該怎么選擇?
對(duì)于TCP和UDP的選擇有些朋友在開(kāi)發(fā)的時(shí)候比較糾結(jié),因?yàn)橛袝r(shí)候采用UDP和用戶方面可靠的傳輸機(jī)制也能夠達(dá)到TCP類似的效果,比如許多支持可靠通信的UDP庫(kù),所以具體怎么選擇還是要根據(jù)具體的應(yīng)用和設(shè)計(jì)。
比如對(duì)于很多直播、游戲等等通過(guò)自己加入一些重傳機(jī)制,可以最大可能的發(fā)揮UDP傳輸實(shí)時(shí)性的優(yōu)點(diǎn),使得呈現(xiàn)給用戶更加流暢的畫(huà)面體驗(yàn)。
在嵌入式、物聯(lián)網(wǎng)方面由于項(xiàng)目對(duì)實(shí)時(shí)性要求高,且資源有限,UDP相對(duì)比較輕量,也是較好的選擇。
但對(duì)于一些文字、文件的數(shù)據(jù)傳輸還是會(huì)優(yōu)先使用TCP,畢竟TCP這塊在保證數(shù)據(jù)的可靠性方面還是做得非常成熟,用戶程序這塊也可以減少一些可靠性處理。
所以最終得選擇,還是要結(jié)合TCP與UDP的特點(diǎn)和具體項(xiàng)目綜合考慮。
END
審核編輯 :李倩
-
單片機(jī)
+關(guān)注
關(guān)注
6039文章
44579瀏覽量
636453 -
TCP
+關(guān)注
關(guān)注
8文章
1372瀏覽量
79142 -
UDP
+關(guān)注
關(guān)注
0文章
326瀏覽量
33993
原文標(biāo)題:嵌入式項(xiàng)目中,UDP與TCP該怎么選?
文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論