TCP協(xié)議與UDP協(xié)議的區(qū)別
首先咱們弄清楚,TCP協(xié)議和UCP協(xié)議與TCP/IP協(xié)議的聯(lián)系,很多人犯糊涂了,一直都是說(shuō)TCP/IP協(xié)議與UDP協(xié)議的區(qū)別,我覺(jué)得這是沒(méi)有從本質(zhì)上弄清楚網(wǎng)絡(luò)通信!
TCP/IP協(xié)議是一個(gè)協(xié)議簇。里面包括很多協(xié)議的。UDP只是其中的一個(gè)。之所以命名為T(mén)CP/IP協(xié)議,因?yàn)門(mén)CP,IP協(xié)議是兩個(gè)很重要的協(xié)議,就用他兩命名了。
TCP/IP協(xié)議集包括應(yīng)用層,傳輸層,網(wǎng)絡(luò)層,網(wǎng)絡(luò)訪問(wèn)層。
其中應(yīng)用層包括:
超文本傳輸協(xié)議(HTTP):萬(wàn)維網(wǎng)的基本協(xié)議。
文件傳輸(TFTP簡(jiǎn)單文件傳輸協(xié)議):
遠(yuǎn)程登錄(Telnet),提供遠(yuǎn)程訪問(wèn)其它主機(jī)功能,它允許用戶(hù)登錄
internet主機(jī),并在這臺(tái)主機(jī)上執(zhí)行命令。
網(wǎng)絡(luò)管理(SNMP簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議),該協(xié)議提供了監(jiān)控網(wǎng)絡(luò)設(shè)備的方法,以及配置管理,統(tǒng)計(jì)信息收集,性能管理及安全管理等。
域名系統(tǒng)(DNS),該系統(tǒng)用于在internet中將域名及其公共廣播的網(wǎng)絡(luò)節(jié)點(diǎn)轉(zhuǎn)換成IP地址。
其次網(wǎng)絡(luò)層包括:
Internet協(xié)議(IP)
Internet控制信息協(xié)議(ICMP)
地址解析協(xié)議(ARP)
反向地址解析協(xié)議(RARP)
最后說(shuō)網(wǎng)絡(luò)訪問(wèn)層:網(wǎng)絡(luò)訪問(wèn)層又稱(chēng)作主機(jī)到網(wǎng)絡(luò)層(host-to-network)。網(wǎng)絡(luò)訪問(wèn)層的功能包括IP地址與物理地址硬件的映射,以及將IP封裝成幀?;诓煌布?lèi)型的網(wǎng)絡(luò)接口,網(wǎng)絡(luò)訪問(wèn)層定義了和物理介質(zhì)的連接。
當(dāng)然我這里說(shuō)得不夠完善,TCP/IP協(xié)議本來(lái)就是一門(mén)學(xué)問(wèn),每一個(gè)分支都是一個(gè)很復(fù)雜的流程,但我相信每位學(xué)習(xí)軟件開(kāi)發(fā)的同學(xué)都有必要去仔細(xì)了解一番。
?
? ? ? ?TCP和UDP的優(yōu)點(diǎn)
TCP的優(yōu)點(diǎn):
? ? ? ? 可靠,穩(wěn)定 TCP的可靠體現(xiàn)在TCP在傳遞數(shù)據(jù)之前,會(huì)有三次握手來(lái)建立連接,而且在數(shù)據(jù)傳遞時(shí),有確認(rèn)、窗口、重傳、擁塞控制機(jī)制,在數(shù)據(jù)傳完后,還會(huì)斷開(kāi)連接用來(lái)節(jié)約系統(tǒng)資源。 TCP的缺點(diǎn): 慢,效率低,占用系統(tǒng)資源高,易被攻擊 TCP在傳遞數(shù)據(jù)之前,要先建連接,這會(huì)消耗時(shí)間,而且在數(shù)據(jù)傳遞時(shí),確認(rèn)機(jī)制、重傳機(jī)制、擁塞控制機(jī)制等都會(huì)消耗大量的時(shí)間,而且要在每臺(tái)設(shè)備上維護(hù)所有的傳輸連接,事實(shí)上,每個(gè)連接都會(huì)占用系統(tǒng)的CPU、內(nèi)存等硬件資源。 而且,因?yàn)門(mén)CP有確認(rèn)機(jī)制、三次握手機(jī)制,這些也導(dǎo)致TCP容易被人利用,實(shí)現(xiàn)DOS、DDOS、CC等攻擊。
UDP的優(yōu)點(diǎn):
? ? ? ? ? ?
? ? ? ? 快,比TCP稍安全 UDP沒(méi)有TCP的握手、確認(rèn)、窗口、重傳、擁塞控制等機(jī)制,UDP是一個(gè)無(wú)狀態(tài)的傳輸協(xié)議,所以它在傳遞數(shù)據(jù)時(shí)非???。沒(méi)有TCP的這些機(jī)制,UDP較TCP被攻擊者利用的漏洞就要少一些。但UDP也是無(wú)法避免攻擊的,比如:UDP Flood攻擊…… UDP的缺點(diǎn): 不可靠,不穩(wěn)定 因?yàn)閁DP沒(méi)有TCP那些可靠的機(jī)制,在數(shù)據(jù)傳遞時(shí),如果網(wǎng)絡(luò)質(zhì)量不好,就會(huì)很容易丟包。 基于上面的優(yōu)缺點(diǎn),那么: 什么時(shí)候應(yīng)該使用TCP: 當(dāng)對(duì)網(wǎng)絡(luò)通訊質(zhì)量有要求的時(shí)候,比如:整個(gè)數(shù)據(jù)要準(zhǔn)確無(wú)誤的傳遞給對(duì)方,這往往用于一些要求可靠的應(yīng)用,比如HTTP、HTTPS、FTP等傳輸文件的協(xié)議,POP、SMTP等郵件傳輸?shù)膮f(xié)議。 在日常生活中,常見(jiàn)使用TCP協(xié)議的應(yīng)用如下: 瀏覽器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件傳輸 ………… 什么時(shí)候應(yīng)該使用UDP: 當(dāng)對(duì)網(wǎng)絡(luò)通訊質(zhì)量要求不高的時(shí)候,要求網(wǎng)絡(luò)通訊速度能盡量的快,這時(shí)就可以使用UDP。 比如,日常生活中,常見(jiàn)使用UDP協(xié)議的應(yīng)用如下: QQ語(yǔ)音 QQ視頻 TFTP ……
有些應(yīng)用場(chǎng)景對(duì)可靠性要求不高會(huì)用到UPD,比如長(zhǎng)視頻,要求速率
TCP與UDP基本區(qū)別
1.基于連接與無(wú)連接
2.TCP要求系統(tǒng)資源較多,UDP較少;
3.UDP程序結(jié)構(gòu)較簡(jiǎn)單
4.流模式(TCP)與數(shù)據(jù)報(bào)模式(UDP);
5.TCP保證數(shù)據(jù)正確性,UDP可能丟包
6.TCP保證數(shù)據(jù)順序,UDP不保證
UDP應(yīng)用場(chǎng)景:
1.面向數(shù)據(jù)報(bào)方式
2.網(wǎng)絡(luò)數(shù)據(jù)大多為短消息
3.擁有大量Client
4.對(duì)數(shù)據(jù)安全性無(wú)特殊要求
5.網(wǎng)絡(luò)負(fù)擔(dān)非常重,但對(duì)響應(yīng)速度要求高
具體編程時(shí)的區(qū)別
1.socket()的參數(shù)不同
2.UDP Server不需要調(diào)用listen和accept
3.UDP收發(fā)數(shù)據(jù)用sendto/recvfrom函數(shù)
4.TCP:地址信息在connect/accept時(shí)確定
5.UDP:在sendto/recvfrom函數(shù)中每次均 需指定地址信息
6.UDP:shutdown函數(shù)無(wú)效
編程區(qū)別
通常我們?cè)谡f(shuō)到網(wǎng)絡(luò)編程時(shí)默認(rèn)是指TCP編程,即用前面提到的socket函數(shù)創(chuàng)建一個(gè)socket用于TCP通訊,函數(shù)參數(shù)我們通常填為SOCK_STREAM。即socket(PF_INET, SOCK_STREAM, 0),這表示建立一個(gè)socket用于流式網(wǎng)絡(luò)通訊。
SOCK_STREAM這種的特點(diǎn)是面向連接的,即每次收發(fā)數(shù)據(jù)之前必須通過(guò)connect建立連接,也是雙向的,即任何一方都可以收發(fā)數(shù)據(jù),協(xié)議本身提供了一些保障機(jī)制保證它是可靠的、有序的,即每個(gè)包按照發(fā)送的順序到達(dá)接收方。
而SOCK_DGRAM這種是User Datagram Protocol協(xié)議的網(wǎng)絡(luò)通訊,它是無(wú)連接的,不可靠的,因?yàn)橥ㄓ嶋p方發(fā)送數(shù)據(jù)后不知道對(duì)方是否已經(jīng)收到數(shù)據(jù),是否正常收到數(shù)據(jù)。任何一方建立一個(gè)socket以后就可以用sendto發(fā)送數(shù)據(jù),也可以用recvfrom接收數(shù)據(jù)。根本不關(guān)心對(duì)方是否存在,是否發(fā)送了數(shù)據(jù)。它的特點(diǎn)是通訊速度比較快。大家都知道TCP是要經(jīng)過(guò)三次握手的,而UDP沒(méi)有。
基于上述不同,UDP和TCP編程步驟也有些不同,如下:
TCP:
TCP編程的服務(wù)器端一般步驟是:
1、創(chuàng)建一個(gè)socket,用函數(shù)socket();
2、設(shè)置socket屬性,用函數(shù)setsockopt(); * 可選
3、綁定IP地址、端口等信息到socket上,用函數(shù)bind();
4、開(kāi)啟監(jiān)聽(tīng),用函數(shù)listen();
5、接收客戶(hù)端上來(lái)的連接,用函數(shù)accept();
6、收發(fā)數(shù)據(jù),用函數(shù)send()和recv(),或者read()和write();
7、關(guān)閉網(wǎng)絡(luò)連接;
8、關(guān)閉監(jiān)聽(tīng);
TCP編程的客戶(hù)端一般步驟是:
1、創(chuàng)建一個(gè)socket,用函數(shù)socket();
2、設(shè)置socket屬性,用函數(shù)setsockopt();* 可選
3、綁定IP地址、端口等信息到socket上,用函數(shù)bind();* 可選
4、設(shè)置要連接的對(duì)方的IP地址和端口等屬性;
5、連接服務(wù)器,用函數(shù)connect();
6、收發(fā)數(shù)據(jù),用函數(shù)send()和recv(),或者read()和write();
7、關(guān)閉網(wǎng)絡(luò)連接;
UDP:
與之對(duì)應(yīng)的UDP編程步驟要簡(jiǎn)單許多,分別如下:
UDP編程的服務(wù)器端一般步驟是:
1、創(chuàng)建一個(gè)socket,用函數(shù)socket();
2、設(shè)置socket屬性,用函數(shù)setsockopt();* 可選
3、綁定IP地址、端口等信息到socket上,用函數(shù)bind();
4、循環(huán)接收數(shù)據(jù),用函數(shù)recvfrom();
5、關(guān)閉網(wǎng)絡(luò)連接;
UDP編程的客戶(hù)端一般步驟是:
1、創(chuàng)建一個(gè)socket,用函數(shù)socket();
2、設(shè)置socket屬性,用函數(shù)setsockopt();* 可選
3、綁定IP地址、端口等信息到socket上,用函數(shù)bind();* 可選
4、設(shè)置對(duì)方的IP地址和端口等屬性;
5、發(fā)送數(shù)據(jù),用函數(shù)sendto();
6、關(guān)閉網(wǎng)絡(luò)連接;
TCP和UDP是OSI模型中的運(yùn)輸層中的協(xié)議。TCP提供可靠的通信傳輸,而UDP則常被用于讓廣播和細(xì)節(jié)控制交給應(yīng)用的通信傳輸。
UDP補(bǔ)充:
UDP不提供復(fù)雜的控制機(jī)制,利用IP提供面向無(wú)連接的通信服務(wù)。并且它是將應(yīng)用程序發(fā)來(lái)的數(shù)據(jù)在收到的那一刻,立刻按照原樣發(fā)送到網(wǎng)絡(luò)上的一種機(jī)制。即使是出現(xiàn)網(wǎng)絡(luò)擁堵的情況下,UDP也無(wú)法進(jìn)行流量控制等避免網(wǎng)絡(luò)擁塞的行為。此外,傳輸途中如果出現(xiàn)了丟包,UDO也不負(fù)責(zé)重發(fā)。甚至當(dāng)出現(xiàn)包的到達(dá)順序亂掉時(shí)也沒(méi)有糾正的功能。如果需要這些細(xì)節(jié)控制,那么不得不交給由采用UDO的應(yīng)用程序去處理。換句話說(shuō),UDP將部分控制轉(zhuǎn)移到應(yīng)用程序去處理,自己卻只提供作為傳輸層協(xié)議的最基本功能。UDP有點(diǎn)類(lèi)似于用戶(hù)說(shuō)什么聽(tīng)什么的機(jī)制,但是需要用戶(hù)充分考慮好上層協(xié)議類(lèi)型并制作相應(yīng)的應(yīng)用程序。
TCP補(bǔ)充:
TCP充分實(shí)現(xiàn)了數(shù)據(jù)傳輸時(shí)各種控制功能,可以進(jìn)行丟包的重發(fā)控制,還可以對(duì)次序亂掉的分包進(jìn)行順序控制。而這些在UDP中都沒(méi)有。此外,TCP作為一種面向有連接的協(xié)議,只有在確認(rèn)通信對(duì)端存在時(shí)才會(huì)發(fā)送數(shù)據(jù),從而可以控制通信流量的浪費(fèi)。TCP通過(guò)檢驗(yàn)和、序列號(hào)、確認(rèn)應(yīng)答、重發(fā)控制、連接管理以及窗口控制等機(jī)制實(shí)現(xiàn)可靠性傳輸。
TCP與UDP區(qū)別總結(jié):
1、TCP面向連接(如打電話要先撥號(hào)建立連接);UDP是無(wú)連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接
2、TCP提供可靠的服務(wù)。也就是說(shuō),通過(guò)TCP連接傳送的數(shù)據(jù),無(wú)差錯(cuò),不丟失,不重復(fù),且按序到達(dá);UDP盡最大努力交付,即不保 證可靠交付
3、TCP面向字節(jié)流,實(shí)際上是TCP把數(shù)據(jù)看成一連串無(wú)結(jié)構(gòu)的字節(jié)流;UDP是面向報(bào)文的
UDP沒(méi)有擁塞控制,因此網(wǎng)絡(luò)出現(xiàn)擁塞不會(huì)使源主機(jī)的發(fā)送速率降低(對(duì)實(shí)時(shí)應(yīng)用很有用,如IP電話,實(shí)時(shí)視頻會(huì)議等)
4、每一條TCP連接只能是點(diǎn)到點(diǎn)的;UDP支持一對(duì)一,一對(duì)多,多對(duì)一和多對(duì)多的交互通信
5、TCP首部開(kāi)銷(xiāo)20字節(jié);UDP的首部開(kāi)銷(xiāo)小,只有8個(gè)字節(jié)
6、TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道
TCP協(xié)議和UDP協(xié)議為什么會(huì)共存?
1. 大家要知道,一種物理線路,單位時(shí)間內(nèi),能夠創(chuàng)建的“虛擬信道”是有限的!
2. 使用TCP協(xié)議傳輸數(shù)據(jù),當(dāng)數(shù)據(jù)從A端傳到B端后,B端會(huì)發(fā)送一個(gè)確認(rèn)包(ACK包)給A端,告知A端數(shù)據(jù)我已收到!UDP協(xié)議就沒(méi)有這種確認(rèn)機(jī)制!這就是為什么說(shuō)TCP協(xié)議可靠,UDP協(xié)議不可靠。
QQ普通會(huì)員就是使用的UDP協(xié)議進(jìn)行傳輸數(shù)據(jù)!既然UDP協(xié)議自身沒(méi)有確認(rèn)機(jī)制,這個(gè)工作可以交給應(yīng)用層的進(jìn)程來(lái)完成(QQ)!大家使用QQ的時(shí)候,感覺(jué)出錯(cuò)的幾率還是非常小吧!當(dāng)然,把這個(gè)確認(rèn)工作完全交給QQ自身來(lái)做,就直接導(dǎo)致了,QQ軟件體積增大!
有些應(yīng)用,對(duì)數(shù)據(jù)傳輸可靠性要求非常高,例如大家瀏覽網(wǎng)頁(yè),通過(guò)網(wǎng)頁(yè)注冊(cè)帳號(hào)、轉(zhuǎn)帳等服務(wù),這是不容許出錯(cuò)的,使用TCP協(xié)議能把出錯(cuò)的可能性降到最低(當(dāng)然,網(wǎng)絡(luò)自身很糟糕,TCP協(xié)議也沒(méi)辦法)。但是,提供這種可靠服務(wù),會(huì)加大網(wǎng)絡(luò)帶寬的開(kāi)銷(xiāo),因?yàn)椤疤摂M信道”是持續(xù)存在的,同時(shí)網(wǎng)絡(luò)中還會(huì)出現(xiàn)大量的ACK和FIN包!
因此,魚(yú)和熊掌不可兼得,需根據(jù)實(shí)際情況選擇傳輸協(xié)議.TCP協(xié)議提供了可靠的數(shù)據(jù)傳輸,但是其擁塞控制、數(shù)據(jù)校驗(yàn)、重傳機(jī)制的網(wǎng)絡(luò)開(kāi)銷(xiāo)很大,不適合實(shí)時(shí)通信,所以選擇開(kāi)銷(xiāo)很小的UDP協(xié)議來(lái)傳輸數(shù)據(jù)。
UDP 協(xié)議是無(wú)連接的數(shù)據(jù)傳輸協(xié)議并且無(wú)重傳機(jī)制,會(huì)發(fā)生丟包、收到重復(fù)包、亂序等情況。而對(duì)于數(shù)據(jù)精確性要求不高的狀態(tài)數(shù)據(jù)以及視頻數(shù)據(jù),丟包的影響不大。因?yàn)闀?huì)不斷收到新的包,丟失的個(gè)別包會(huì)有新的包來(lái)覆蓋,所以只需在遠(yuǎn)程控制系統(tǒng)的通信部分自行處理亂序及重復(fù)包的問(wèn)題,而對(duì)于丟包的問(wèn)題一般不作處理。 但對(duì)于命令包這種需要精確收發(fā)的數(shù)據(jù), 可在程序的開(kāi)發(fā)中加入丟包重發(fā)和超時(shí)丟棄的處理。 當(dāng)然,如果開(kāi)發(fā)的是對(duì)于實(shí)時(shí)性要求不高的事件型控制命令的傳輸,不希望發(fā)生指令的丟失也可以直接采用TCP協(xié)議。TCP的重傳機(jī)制正好適合這種情況。
非面向連接的傳輸協(xié)議在數(shù)據(jù)傳輸之前不建立連接,而是在每個(gè)中間節(jié)點(diǎn)對(duì)非面向連接的包和數(shù)據(jù)包進(jìn)行路由。沒(méi)有點(diǎn)到點(diǎn)的連接,非面向連接的協(xié)議,如UDP,是不可靠的連接。當(dāng)一個(gè)UDP數(shù)據(jù)包在網(wǎng)絡(luò)中移動(dòng)時(shí),發(fā)送過(guò)程并不知道它是否到達(dá)了目的地,除非應(yīng)用層已經(jīng)確認(rèn)了它已到達(dá)的事實(shí)。非面向連接的協(xié)議也不能探測(cè)重復(fù)的和亂序的包。標(biāo)準(zhǔn)的專(zhuān)業(yè)術(shù)語(yǔ)用“不可靠”來(lái)描述UDP。在現(xiàn)代網(wǎng)絡(luò)中,UDP并不易于導(dǎo)致傳輸失敗,但是你也不能肯定地說(shuō)它是可靠的
評(píng)論