【T08】避免重新編寫TCP

Andy Niu發表於2017-02-11
1、有時候為了所謂的效能,我們傾向於使用udp,但是我們又期望資料的傳輸是可靠的,因此需要在應用層提供可靠性。
2、可靠、健壯的udp必須提供:
    a、在合理的時間內沒有收到回覆,進行重傳
    b、保證應答和請求的匹配
3、基於udp協議,在應用層提供可靠性,需要做很多事情,比如:滑動視窗,擁塞控制,對這些事情都進行研究,就相當於重寫tcp
4、因此,如果要可靠的網路傳輸,就直接使用tcp,而不是使用udp,在應用程式提供可靠性。原因有:
    a、應用程式實現的tcp功能肯定比不上真正的tcp協議,tcp協議實現是大量實現和研究的結果,也在不斷改進。
    b、tcp協議的實現在核心中執行,效能更高。
    c、有時候在應用層超時重傳並不是使用者期望的,比如客戶端傳送一個轉賬請求,超時沒有收到回覆,然後重傳,
        導致一次轉賬請求,在服務端處理了兩次,這不是我們所期望的。而tcp的超時重傳,在傳輸層會丟棄收到的重複請求,
        在應用層只收到一次請求。
    因此,使用udp,在應用層提供可靠性並沒有什麼意義。
5、因此,udp的使用場景是:對可靠性的要求不是很高,允許丟包,丟包不影響應用程式。
    tcp的使用場景是:對可靠性的要求很高。
6、如果既想擁有tcp的可靠性,同時減少建立連線和拆除連線的開銷,可以使用T/TCP,T/TCP是對tcp的擴充套件,
    避免了建立連線的三次握手,同時縮短拆除連線時的TIME_WAIT階段。

相關文章