1. 程式人生 > >為什麼有了可靠地TCP還需要不可靠的UDP

為什麼有了可靠地TCP還需要不可靠的UDP

近來有些面試中被問到了這個問題,那麼就在此總結一下吧,希望對大家有用。

首先,先說一下TCP和UDP的區別。

1.TCP是面向連線的協議,有確認重傳機制,流量控制機制等;而UDP是非面向連線的協議,盡力而為的傳送資料,重傳由上層協議來控制,也可以使用connect()來控制。

2.從頭部結構來說,TCP因為有選項部分,所以有首部長度欄位;而UDP沒有選項部分,所以不需要首部長度欄位。

3.TCP的checksum部分是必需的;UDP的選項部分是可選的,不填充的話預設為全零。

4.TCP避免分段,因為有重傳機制本來就浪費了一些頻寬,一旦出現分段,那麼重傳會大量增加,將會浪費大量頻寬並且會嚴重降低傳輸效率;而UDP則不關心分不分段,且因為UDP的頭部小(只有8位元組,而TCP頭部最小也得20位元組),故可以攜帶更多的資料。

5.TCP是基於資料流傳輸的,所以應用程式產生的全體資料與真正傳送的單個IP資料報沒有什麼聯絡;而UDP是面向資料報的傳輸層協議,程序的每個操作產生都正好產生一個UDP資料報,並組裝成一個IP資料報傳送。

以上就大概是TCP和UDP在協議層面的區別了。

接下來,再從應用程式的層次說一下TCP和UDP。

1.先說一下TCP的優缺點吧。優點呢,TCP是可靠的連線,由於有基本的重傳確認機制,可以保證把一個數據塊完完整整的從A傳到B;缺點也是因優點而生,因為有三次握手,所以會傳輸更多的包,浪費一些頻寬;因為需要可靠地連線進行通訊,則需要雙方都必須持續線上,所以在通訊過程中server需要維持非常大的併發連線,浪費了系統資源,甚至會出現宕機;再者就是因為有重傳確認,則會浪費一部分的頻寬,且在不好的網路中,會因為不斷地連線斷開連線,嚴重降低了傳輸效率。

2.相對於TCP來說,UDP是非面向連線的不可靠的協議,其優點也因為缺點而生。首先,因為沒有三次握手,所以會起步比較快,延時小;另外,由於不需要雙方持續線上,所以server不用維護巨量的併發連線,節省了系統資源;三,因為沒有重傳確認,雖然到達的資料可能會有所缺失,但在不影響使用的情況下,能更高效的利用網路頻寬。

基於前面的說法,總結一下本文的問題答案。TCP適合實時性要求不高,但要求內容要完整傳輸的應用。相比而言,UDP由於無連線、無重傳確認,所以傳輸效率高、延時小,適合實時性要求高的應用,如遊戲伺服器,音訊,視訊等;另外,由於不用維持大的併發量,所以適合巨量服務的server,加上合適的時間控制,可以用來設計更大的併發伺服器;再者就是,UDP可以更高效的利用網路頻寬。

說了這麼多,舉個現實的例子吧。國人幾乎都是用的QQ,在建立連線階段,使用的是面向連線的TCP協議,通過三次握手來完成;然後,在文字資料傳輸階段,使用的是UDP協議,但需要中間伺服器轉發(估計是使用了connect()的UDP,QQ離線傳送/接收資料的基礎);然後,音視訊資料的傳送一定是使用的UDP,因為一般的客戶可以容忍稍微模糊(略有缺失的資料塊)的聲音或視訊,但估計不會接受一會斷開一會連線(因為TCP容易斷線)的音視訊;而檔案傳輸則使用了P2P的協議,當前大多P2P使用的UTP協議也是基於UDP的,因為使用TCP的話會浪費大量的頻寬。

以上為鄙人愚見,希望對大家有用。有不足的地方,還望提出來,大家商討補充。