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