知識再分享:細談TCP擁塞控制及其四種解決方法

前言

現實生活中存在一個這樣的問題:

節假日的高速公路極易發生擁堵;原因是:大幅增加的車輛超過了高速公路的車流通行能力;結果是:所有車輛滯留擁堵,越堵越多,直到擁堵問題得到解決,方能正常通行!

互聯網中的數據傳輸也會出現同樣的問題,最經典堵塞問題便是:TCP報文擁塞!這也是此文將為讀者朋友們細緻講解的主要問題,同時將介紹四大解決TCP擁塞問題的經典方法,歡迎交流!

知識再分享:細談TCP擁塞控制及其四種解決方法

TCP:傳輸控制協議

TCP報文擁塞問題為何發生?

在TCP/IP網絡體系中,任意兩臺網絡設備進行數據通信均依賴於TCP報文,每一條互聯網報文在由源設備發出後都將通過路由器進行路由、轉發,進而以最優路徑抵達目標設備,因此,傳輸TCP報文不可或缺的設備便是路由器。為加深讀者理解,我們再以高速公路的例子來做比擬:

一條普通的高速公路,車輛正常通行須經過收費站進行過路繳費,才能繼續前行,而收費站的重點便是由工作人員來負責收費、放行,我們知道,任何流程只要存在關鍵環節,那這個環節就會有明顯的問題出現,比如說當高速車流量大幅增加時,由於收費站工作人員的效率有限,將無法快速完成大量繳費放行工作,如此,便會引發擁堵,導致車輛滯留增加,引起更嚴重的道路擁堵情況!

知識再分享:細談TCP擁塞控制及其四種解決方法

網絡擁堵示意圖

引申到TCP報文傳輸過程中,這個現實問題就變成了經典的TCP報文擁塞問題當發送方的數據發送速率超過路由器的轉發處理能力,那麼一部分TCP報文便會在網絡中滯留,堵塞其他的TCP報文傳輸,此時,如果不採取有效的疏通措施,越來越多的TCP報文將進一步加重擁塞,最終導致網絡癱瘓!

知識再分享:細談TCP擁塞控制及其四種解決方法

網絡癱瘓

面對TCP報文擁塞問題,目前有四大經典處理方法,出發點有三個:

  • TCP擁塞發生之前——預防
  • TCP擁塞發生之中——避免
  • TCP擁塞發生之後——重傳

對應的四大處理方式分別為:

  • 超時重傳計時器
  • 慢啟動
  • 擁塞避免
  • 快速重傳

下面我們將結合圖文對每一種處理TCP報文擁塞的方式進行詳細講解!

一、TCP擁塞控制:超時重傳計時器

TCP/IP體系一直以可靠性傳輸著稱,在TCP報文傳輸中重傳便是保證TCP高可靠性的重要措施,超時重傳計時器的具體實現是:發送方每發送一條TCP報文,便對這條報文設置一次定時器,只要在這個定時器設置的時間內,發送方收到了目標設備回傳的TCP報文確認信號,就表示這條TCP報文得到了正確的傳輸,如果在這個定時器時間內發送方沒有收到確認信號,就表示這一條報文沒有被正確的傳遞,此時,發送方將重傳這一條TCP報文,直至在定時器時間內收到確認信號。為加深讀者朋友理解,我們可以類比生活中隔空傳話的例子,如:

老李對遠處的老王喊話:老王,我們回村吧?老李等了五秒鐘,發現老王沒有應答,表明老王沒聽見這句話,即回話超時了,於是老李就會再次對老王喊話:老王,我們回村吧?直到老王在五秒鐘內應答喊話,才表明老李的話傳到老王耳朵裡了。

知識再分享:細談TCP擁塞控制及其四種解決方法

喊話示意圖

這五秒鐘就相當於超時重傳定時器,重傳就相當於老李的重新喊話,這樣大家就應該清楚超時重傳機制了!值得注意的是重傳定時器的時間要設置合理,這個時間一般和報文往返時間、平均報文傳輸時延已經時間偏差等因素有關,大多數採用最近一段時間的報文時延觀察值來估算往返時間,進一步確定重傳定時器的時間,比如老李聲音從發出到聽到老王的回應總時間不超過5秒,加上其他延時因素3秒,那麼這個超時定時器設置為8秒以上但不能過長(如10秒)就是合理的!

知識再分享:細談TCP擁塞控制及其四種解決方法

定時器

二、TCP擁塞控制:慢啟動

慢啟動是預防TCP擁塞的方式,具體實現是讓發送方在每次發出TCP報文且在收到對方確認之前逐步擴大發送量(術語稱為:擴大發送窗口的大小),一般是按照1/2/4/8等指數倍率增加數據發送量,直至發送速率達到路由器轉發速率的門限閾值則停止繼續增加發送量。

當目標網絡設備在約定的時間內沒有給發送方回傳任意一條TCP報文的確認信號時,即出現超時,那麼發送方將重置發送量,把發送窗口重置回1,再次開始慢啟動的流程,如此循環來實現TCP擁塞控制!為加深讀者朋友對慢啟動的理解,我們舉個旅客排隊進火車站的例子:

火車站進站需要先經過站口A,再經過檢票口B放行才能進入候車廳,為了防止人流擁擠,A站口每次會按照指數增長的方式放人進入檢票口B,比如1人,2人,4人,8人......直到檢票口B處理不過來了,那麼A站口將重置放行的人流量為1,再重新按照指數倍率加人放入,如此循環。

知識再分享:細談TCP擁塞控制及其四種解決方法

慢啟動指數倍率增加發送窗口

三、TCP擁塞控制:擁塞避免

在慢啟動的最終階段,即發送窗口達到發送量門限閾值(不是路由器門限值)後,傳輸進入擁塞避免階段,此時,TCP按照線性增加的方式繼續擴大發送窗口,如按照+1遞增,當發生擁塞時,將發送窗口上限減半,按照+1重新增加,當再度發送擁塞時,按指數倍率大幅減小發送窗口大小!關於這一點大家可以承接上述慢啟動中火車站控制人流的方式去理解,比如:

檢票口B的檢票能力閾值是4個人,當站口A放入的人數超過4個人檢票口B就會發生擁塞,此時A就減半最大放行人數,然後依然保持每次放行人數加1,當再次發生擁塞時,A再減半放行人數,如此循環。

知識再分享:細談TCP擁塞控制及其四種解決方法

擁塞避免:線性增加發送窗口

四、TCP擁塞控制:快速重傳

在瞭解快速重傳之前,我們需要知道TCP報文的ACK基本工作原理!ACK全寫為

Acknowledg,意為確認,每一條TCP報文在發出時都會有一個報文序號,我們假設報文長度始終為1:當發送方發送一個序號為N的報文時,對應接收端回傳的ACK序列號就是N+1,接著發送放發出下一個序號為N+1的TCP報文,接收端回傳ACK序列號為N+1,以此類推。

當接收端因各種問題無法正常接收序號為N的TCP報文時,回傳信號的ACK序號便不會增加,始終保持收到上一次報文的回傳信號,即:

  • 發送報文序號為N-1,接收端回傳ACK=N
  • 發送報文序號為N,但報文丟失,接收端無法收到報文,則會發送第二個ACK為N的確認信號,叫做重複ACK
  • 如果接收端一直收不到發送方序列號為N的報文,則會出現回傳三次冗餘的ACK給發送端,這就意味著序號為N的報文丟失了
知識再分享:細談TCP擁塞控制及其四種解決方法

連收3次重複ACK快速重傳

當發送端連續收到三個重複的ACK,將不等超時重傳定時器,立即重傳序號為N的報文,這就是快速重傳算法!

結語

本文詳細講解了關於TCP報文擁塞及四種解決擁塞的經典方法,並以現實生活中的例子做比擬更生動的說明了TCP擁塞控制原理,希望有助於廣大讀者朋友的學習、工作!

知識再分享:細談TCP擁塞控制及其四種解決方法


分享到:


相關文章: