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