生活随笔
收集整理的這篇文章主要介紹了
为什么聊天软件一般采用UDP协议
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?
TCP是美國國防部設(shè)計(jì)的兩種傳輸協(xié)議之一,另一種是UDP。UDP是一種不可靠的網(wǎng)絡(luò)服務(wù),負(fù)載比
較小,而TCP則是一種可靠的通信服務(wù),負(fù)載相對(duì)而言比較大。TCP采用套接字(socket)或者端口
(port)來建立通信。TCP給端口到端口通信提供了錯(cuò)誤和流量控制機(jī)制,同時(shí)TCP還負(fù)責(zé)建立連接
、處理終止和中斷的端對(duì)端通信控制。 通常情況下我們認(rèn)為TCP相比UDP具有更大的通信負(fù)載,UDP不具備TCP的控制特性,TCP用了大約20個(gè)字節(jié)來發(fā)送一個(gè)65Kbps的數(shù)據(jù)塊,
這個(gè)報(bào)頭占整個(gè)數(shù)據(jù)塊的比重也不過3%。總得來看,這個(gè)負(fù)載是合理的,何況還令通信具有了可靠性性。 | ? | ?tcp | ?udp | | ?是否連接 | ?面向連接 | ?面向非連接 | | ?傳輸可靠性 | ?可靠的 | ?不可靠的 | | ?應(yīng)用場合 | ?傳輸大量數(shù)據(jù) | ?傳輸少量數(shù)據(jù) | | ?速度 | ?慢 | ?快 | ? 所以UDP的速度快的優(yōu)點(diǎn)是很關(guān)鍵的因素,而且,UDP是“推”的協(xié)議,有多少個(gè)接收客戶,客戶端
是否鏈接均無所謂,只顧把數(shù)據(jù)發(fā)送/廣播出去就行;這對(duì)鏈接不可靠,需要一對(duì)多等情形很有用。
TCP關(guān)鍵是可靠,是基于可靠鏈接基礎(chǔ)上的協(xié)議,因而可能較慢,網(wǎng)絡(luò)數(shù)據(jù)量較大。當(dāng)然UDP并不一定永遠(yuǎn)都比TCP快。我們之所以認(rèn)為UDP快,僅僅是從報(bào)頭中傳輸?shù)男畔⒈戎馗髞砜紤]
的。但是如果網(wǎng)絡(luò)情況,可能UDP就不一定比TCP快了。UDP只負(fù)責(zé)發(fā)送,因而不會(huì)管網(wǎng)絡(luò)的情況,一旦
網(wǎng)絡(luò)阻塞,繼續(xù)發(fā)UDP包只會(huì)加重整個(gè)網(wǎng)絡(luò)的負(fù)擔(dān)。而此時(shí)TCP的控制及復(fù)雜的傳輸算法就起到很好的
作用了。通過自適應(yīng)窗口等方式減少實(shí)際發(fā)往網(wǎng)絡(luò)的數(shù)據(jù)。就像堵車的時(shí)候一樣,UDP只會(huì)越來越堵,
而TCP還可以緩慢的行走。還有像聊天這種及時(shí)性高,如果采用TCP短連接,頻繁的連接斷開也會(huì)增加
網(wǎng)絡(luò)負(fù)擔(dān)。綜上所述:如果是每次連接時(shí)間較短,或者即時(shí)性要求高,發(fā)送內(nèi)容較少,則采用UDP;而對(duì)數(shù)據(jù)完整
性、可靠性要求較高,傳輸性能要求較低時(shí)采用TCP。而我們知道像QQ這種大型的聊天軟件卻主要使用的是UDP連接,而以TCP為輔。即使是傳文件,也是以UDP
為主,個(gè)人認(rèn)為這主要還是從服務(wù)器的角度來考慮的。
首先是每一個(gè)客戶實(shí)際上都是和服務(wù)器交互,再由服務(wù)器轉(zhuǎn)發(fā)給正在通信的用戶。
如果每一個(gè)QQ從一上線到下線的這段時(shí)間全部采用TCP長連接,這對(duì)服務(wù)器的負(fù)擔(dān)很大。而如果采用TCP
短連接,頻繁的連接斷開也會(huì)造成網(wǎng)絡(luò)負(fù)擔(dān)。而采用UDP則可以避開上述這些麻煩,減少服務(wù)器的負(fù)擔(dān)。 ? ? 基于上述不同,UDP和TCP編程步驟也有些不同,如下:
TCP編程的服務(wù)器端一般步驟是:UDP編程的服務(wù)器端一般步驟是: | 1、創(chuàng)建一個(gè)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)聽; | 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ò)連接; | | TCP編程的客戶端一般步驟是: | UDP編程的客戶端一般步驟是: | | 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ò)連接; | 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ò)連接; |
|
?
總結(jié)
以上是生活随笔為你收集整理的为什么聊天软件一般采用UDP协议的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。