關于“tcp協議如何確保可靠傳輸”這個問題,網上的資料參差不齊,近期開始在圖書館讀一些教材,帶著問題讀了以下書目的關于TCP的章節,總結記錄了下來,
- 德國波茨坦大學《internetworking Technische Grundlagen und Anwendungen》/《網路技識訓礎與應用》(christoph meinel,harald sack)
- 《深入理解計算機網路》(王達)
- 《計算機網路教程自頂向下的方法》(Behrouz A.Forouzan Firouz Mosharraf)
- 《計算機網路》(張曾科、陽憲惠)
- 《計算機網路》第7版(謝希仁)
為什么TCP需要可靠傳輸呢
- 網路層是不可靠,網路層的任務僅僅是選擇合適的網間路由和交換結點, 確保資料及時傳送,
- 傳輸層性質所致,上層需要可靠性,因而傳輸層的主要任務是根據通信子網的特性最佳的利用網路資源,并以可靠和經濟的方式,為會話層之間,提供建立、維護和取消傳輸連接的功能,負責可靠地傳輸資料,
- UDP通過犧牲可靠性,換取盡力交付、通信效率高、確保資料的實時性的特點,自然需要TCP的出現,來對使用需求互補完善,
因而以上3點,可靠傳輸的重擔交予到了TCP之上,
TCP怎么做到可靠傳輸呢
為了實作可靠傳輸的目的,TCP使用4個解決方案:面向連接的傳輸機制、超時重傳控制、可變滑動視窗流量控制、 擁塞控制,
面向連接的傳輸機制
使用了三次握手、四次揮手,這個比較常見,大家一般都熟悉了,就不冗余贅述了,
校驗和,確認應答(ACK),序列號,
并對重復無效的ACK進行處理,收下后并丟棄,實作自動重傳請求,
超時重傳控制
當報文發出后在一定的時間內未收到接收方的確認,發送方就會進行重傳,每發送一個分組,就設定一個超時重傳計時器,當收到對方回傳的ack,就撤銷已設定的超時計時器,為實作這一步,有三個注意點:
- 發送后保留副本,以備重傳時使用,收到對方回傳的ack后,才清除副本,
- 編號,
- 超時重傳計時器的時間設定適考慮時延、擁塞的等不確定因素,因而重傳時間設定會比資料分組的平均往返時間更長一些,
可變滑動視窗流量控制
視窗分為發送視窗和接收視窗,簡單而言,接收方把能接受的資料大小(接受視窗大小),通過ACK反饋予發送方,從而設定協調發送內容大小,細節有以下幾點:
- 當發送資料超出接收方視窗大小時,超出部分重傳;
- 當發送資料小于接收方視窗大小時,發送方繼續發送內容;
- 并不是對每一個報文段都有ACK的回復,可能時一至多個報文段,發送一個ACK;
- 當收到的報文段個數缺失,收到的報文段會存入快取,等待發送方重傳缺失的報文段;合并完整,再回傳ACK;如果長時未收到缺失的報文段,則快取中的報文段會被一并清空,
擁塞控制
擁賽控制的演算法有四種:慢開始、擁塞避免、快重傳和快恢復,
- 慢開始:由小到大逐步增加擁塞視窗數值,
擁塞視窗初始值 = 1至兩個發送方最大報文段的數值;
擁塞視窗每次增加量 = min(新收到確認報文的位元組數,發送方最大報文段的數值),
- 擁塞避免:讓擁塞視窗換慢增大,
每經過一個RTT就滑動視窗大小就只加1;
- 快重傳:接收方收到的資料后立即確認,一個資料包回一個確認ACK, 以實作盡早知道當中個別報文的丟失,
例如,當發送程序中M3資料包丟失,接收方只收到了M2與M4資料包時,接收方連續回傳3個M2的ACK予發送方(提示發送方漏了M3小兄弟);
發送方收到3個連續的M2的ACK后,立即重傳M3資料包,
- 快恢復:遇到網路擁塞后,立馬減小擁塞視窗,
設定一個ssthresh作為使用擁塞避免演算法的起始點,通過這個ssthresh值為滑動視窗最大門限值的一半,
理解以上四個演算法思路,看下面這個圖就輕而易舉了:

總結:TCP因為位于傳輸層,承上啟下,解決下層網路層的不可靠問題,為會話層提供提供可靠連接;并實作對UDP使用的互為補充,
TCP可靠性主要通過面向連接的傳輸機制、超時重傳控制、可變滑動視窗流量控制、 擁塞控制實作,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/205328.html
標籤:AI
