1. 程式人生 > >為什麼qq用的UDP為主,而TCP為輔助

為什麼qq用的UDP為主,而TCP為輔助

一.TCP和UDP的區別 

這兩種傳輸協議也用於不同的業務和不同的硬體終端。 

1、類似於影象、聲音等對可靠性要求沒有那麼高的業務可以用UDP,他們不需要準確儲存對準確性無要求但要求速度快。 

     類似於文字、程式、檔案等要求可靠的資料最好就用TCP,但會犧牲一些速度。 

2、對系統資源的要求:TCP較多,UDP少。 

3、程式結構:UDP程式結構較簡單,TCP複雜。 

4、流模式與資料報模式: TCP保證資料正確性,UDP可能丟包; 

                                     TCP保證資料順序,UDP不保證 


二.用途 

1、TCP是面向連線的,有比較高的可靠性,一些要求比較高的服務一般使用這個協議,如FTP、Telnet、SMTP、HTTP、POP3等

    而UDP是面向無連線的,使用這個協議的常見服務有DNS、SNMP、QQ等。

UDP是一種面向無連線的通訊協議,該協議使得資料傳輸的速度得到大幅度的提高。視訊聊天語音聊天基本都是用UDP協議。

三、QQ以UDP為主,TCP為輔

      QQ即使傳檔案也是以UDP為主,主要是從伺服器的角度來考慮:  

     首先每一個客戶實際上都適合伺服器互動,再由伺服器轉發給正在通訊的使用者,如果每一個QQ從一上線到下線的這段時間全部採用TCP長連線,這對伺服器的負擔很大,而如果採用TCP短連線,頻繁的連線斷開也會造成網路負擔,二採用UDP則可以避開上述麻煩,減少服務的負擔。


    不管UDP還是TCP,最終登陸成功之後,QQ都會有一個TCP連線來保持線上狀態。這個TCP連線的遠端埠一般是80,採用UDP方式登陸的時候,埠是8000。 UDP協議是無連線方式的協議,它的效率高,速度快,佔資源少,但是其傳輸機制為不可靠傳送,必須依靠輔助的演算法來完成傳輸控制。QQ採用的通訊協議以UDP為主,輔以TCP協議。由於QQ的伺服器設計容量是海量級的應用,一臺伺服器要同時容納十幾萬的併發連線,因此伺服器端只有採用UDP協議與客戶端進行通訊才能保證這種超大規模的服務。  

    QQ客戶端之間的訊息傳送也採用了UDP模式,因為國內的網路環境非常複雜,而且很多使用者採用的方式是通過代理伺服器共享一條線路上網的方式,在這些複雜的情況下,客戶端之間能彼此建立起來TCP連線的概率較小,嚴重影響傳送資訊的效率。而UDP包能夠穿透大部分的代理伺服器,因此QQ選擇了UDP作為客戶之間的主要通訊協議。  

      採用UDP協議,通過伺服器中轉方式。因此,現在的IP偵探在你僅僅跟對方傳送聊天訊息的時候是無法獲取到IP的。大家都知道,UDP 協議是不可靠協議,它只管傳送,不管對方是否收到的,但它的傳輸很高效。但是,作為聊天軟體,怎麼可以採用這樣的不可靠方式來傳輸訊息呢?於是,騰訊採用了上層協議來保證可靠傳輸:如果客戶端使用UDP協議發出訊息後,伺服器收到該包,需要使用UDP協議發回一個應答包。如此來保證訊息可以無遺漏傳輸。之所以會發生在客戶端明明看到“訊息傳送失敗”但對方又收到了這個訊息的情況,就是因為客戶端發出的訊息伺服器已經收到並轉發成功,但客戶端由於網路原因沒有收到伺服器的應答包引起的

注: 對於QQ,QQ2003以前是隻使用UDP協議的,其伺服器使用8000埠,偵聽是否有資訊傳來,客戶端使用4000埠,向外傳送資訊(這也就不理解在一般的顯IP的QQ版本中顯示好友的IP地址資訊中埠常為4000或其後續埠的原因了),即QQ程式既接受服務又提供服務,在以後的QQ版本中也支援使
TCP協議了。

參考資料

http://www.360doc.com/content/14/0715/10/12928831_394511484.shtml

http://javapub.iteye.com/blog/681138

https://www.zhihu.com/question/20292749