TCP服務的特色算法
(1)面向鏈接:使用TCP協議通信的雙方必須先創建鏈接,而後才能開始數據的讀寫。雙方都必須爲該鏈接分配必要的內核資源,以管理鏈接的狀態和鏈接上數據的傳輸。TCP連接是全雙工的,即雙方的數據讀寫能夠經過一個鏈接完成。完成數據交換以後,雙方必須斷開鏈接以釋放系統資源。網絡
這種鏈接是一對一的,因此基於廣播和多播(目標是多個主機地址)的應用程序不能使用TCP服務。而無鏈接的UDP則很是適合。tcp
(2)字節流:發送端執行的寫操做次數和接收端執行的讀操做次數之間沒有任何數量關係。當發送端應用程序連續屢次執行屢次寫操做時,TCP模塊先將數據放入TCP緩衝區中,當TCP模塊真正開始發送數據時,發送緩衝區中這些被接受到的數據可能被封裝成一個或多個TCP報文段發出。下面會用圖片表示出字節流服務和數據報服務的不一樣。性能
(3)可靠傳輸:首先TCP協議採用發送應答機制,即發送端發送的每一個TCP報文段都必須獲得接受方的應答,才認爲這個TCP報文段傳輸成功。其次,TCP協議採用超時重傳機制,發送端在發送出一個TCP報文段以後啓動定時器,若是在定時時間內未收到應答,它將重發該報文段。最後,由於TCP報文段最終是以IP數據報發送的,而IP數據包到達接收端可能會亂序,重複,因此TCP協議還會對接收到的TCP報文段重排、整理,再交給應用層。spa
UDP服務的特色設計
(1)無鏈接:即通訊雙方不會保持一個長久的聯繫,所以應用程序每次發送數據都要明確指出接收端的地址。blog
(2)基於數據報服務:是相對於字節流服務而言,每一個UDP數據包都有一個長度,接收端必須以該長度爲最小單位將其全部內容一次性讀出,不然數據將被截斷。圖片
(3)不可靠:這意味着UDP協議沒法保證數據從發送端正確的傳送到目的端。若是數據在中途丟失,或者目的端經過數據校驗發現數據錯誤而將其丟棄,則UDP協議只是簡單地給應用程序通知發送失敗。資源
字節流與數據報效率
TCP爲了實現可靠傳輸,是以浪費部分帶寬,犧牲實時性爲代價 。UDP則報頭小,效率高,代價小,能夠在應用層本身實現與應答確認、快速重傳等相似的功能來提升本身的可靠性。那麼既然TCP是可靠的,爲何不直接用它就好還要提升UDP的可靠性呢?
UDP實現的可靠協議,基本都會對TCP的某一部分進行增強,另一部分進行削弱。由於:」實時性+可靠性+公平性「 三者不能同時保證,所以能夠犧牲TCP的局部公平性來換取更好的實時性、或者浪費點帶寬來實現更低的延遲。
目前已經有一些實現UDP可靠傳輸的機制,好比UDT(UDP-based Data Transfer Protocol)
UDT:是一個高性能的基於UDP協議的數據傳輸協議,它是爲支持高速廣域網上海量數據傳輸設計的,爲解決TCP的效率和公平問題,同時提供可靠的數據流和報文傳輸。主要目的是針對「TCP在高帶寬長距離網絡上的傳輸性能差」的問題,儘量全面支持BDP網絡上的海量數據傳輸。UDT是創建與UDP之上的面向雙向的應用層協議,引入了新的擁塞控制算法和數據可靠性控制機制。它不只能夠支持可靠的數據流傳輸(STREAM 類型TCP)和部分可靠的數據報(DGRAM相似網絡上發廣播消息)傳輸,也能夠應用在點對點技術,防火牆穿透,多媒體數據傳輸等領域。
引入UDT的緣由
互聯網上的標準數據傳輸協議TCP在高帶寬長距離網絡上性能不好,且沒法充分的利用帶寬。其緣由主要有一下幾點:
1)現行的tcp擁塞窗口機制在高帶寬長距離的環境下沒法很好的工做,擁塞窗口過小,並且增長過於緩慢直接致使吞吐
率不高,沒法充分利用帶寬。
此外TCP的AIMD擁塞控制算法過激地下降擁塞窗口的大小,可是不能快速回復到高位充分利用帶寬。
2)目前的tcp擁塞控制算法在BDP網絡下具備較差的RTT公平性,rtt會影響擁塞窗口的增加,越不容易達的連接的擁塞
窗口增長得越慢,其發送速度越慢,所以會致使越遠的連接發送速率越慢。