性能問題:流量控制和阻塞控制

目錄

流量控制

窗口縮放

阻塞控制

慢啓動

擁塞避免

慢啓動重啓


        說到網絡性能問題,影響的因素有很多,以前上課時老師講的主要有時延和帶寬兩個,時延簡單來說就是一條消息從一端發送到另一端接收的時間,長短也有很多方面決定,例如從物理層開始,網絡數據在光纖等不同設備上的傳輸時間不同,網絡層上消息會經過路由轉發,在路由器上會因爲等待發送而產生延遲,一般來說經過的路由器越多,產生的延遲就越大。還有一個重要因素是帶寬,網絡帶寬指的是信道單位時間內可以傳輸的數據量,把網絡帶寬比喻成車道來理解就很容易了,帶寬越大,單位時間內傳輸的數據量就越多,就像雙車道,三車道,車道數量越多,單位時間內可通過的車輛就越多,交通狀況越流暢。這篇日誌前半部分大致總結下以前上課的知識,接收窗口和擁塞窗口,當作爲後面慢啓動和隊首阻塞問題的鋪墊,還有後面想寫的關於HTTP/2的問題。

        想要優化網絡性能,通常就是從這兩方面入手,現在帶寬越來越大,能提升的方面不多,着重是降低延遲。無論是HTTP還是HTTPS,使用的都是TCP傳輸控制協議,工作方式是使用三次握手協議建立連接,待客戶端和服務器端成功建立連接後,才能開始傳輸數據。我不詳細重複三次握手的過程,三次握手需要1.5次RTT(往返時間),RTT往返時間的長短取決於延遲,在這裏我想表達的是,如果不使用長連接或重用連接的方式,建立一次連接是相對來說較耗時的,所以這篇日誌在如何降低延遲方面,總結了兩部分優化,慢啓動和隊首阻塞問題。

 

流量控制

        說慢啓動前,先講一講生活中的一個場景,大家有沒有發現,下載文件時,無論你家的寬帶多高,下載速度總是從幾百KB到1M開始,慢慢升上去,當然起始值可能有的更高,在客戶端和服務器端三次握手建立連接完成後,假設客戶端不斷給服務器端發送數據,由於中間會經過很多的光纖電纜,路由轉發,尤其是數據到達中間路由時,會被緩存在路由器中,如果服務器端,或者說是接收端的帶寬沒那麼高,而客戶端的帶寬較高,會出現的問題就是發送端發送的快,接收端接受得慢,越來越多的分組報文被緩存在中間路由裏,慢慢的一些路由器緩存被耗盡,降低了網絡的性能,甚至阻塞整個網絡。爲了解決上面這些問題,TCP在接收端採用的方式是流量控制。

窗口縮放

        相信大家都知道,接收方每次發送ACK包時都會帶上自己的接收窗口的大小,告訴發送方接下來允許發送的數據範圍和字節序列,發送方接收到ACK包後,根據接收窗口rwnd的大小選擇發送的數據和數據量,如果發送方發現接收方的接收窗口比較小時,就會選擇發送少量的數據,或者暫停發送,以緩解網絡的負擔。在HTTP和HTTPS網站中,窗口縮放都應該要開啓:

例如在Ubuntu下可以使用命令來打開窗口縮放:

sysctl –w net.ipv4.tcp_window_scaling=1

然後查看是否啓用了窗口縮放:

sysctl net.ipv4.tcp_window_scaling

        接收窗口的方式是在接收端進行流量控制,由於TCP傳輸控制協議是全雙工的,也就是一個會話中,發送方和接收方可以同時進行接收和發送數據,這個大家都瞭解,在發送端,爲了防止發送過多的分組,導致這些分組在中間路由裏緩存,可能導致網絡癱瘓的問題,在每個TCP連接初始化時,發送端會設置擁塞窗口cwnd來控制發送的數據包。

 

阻塞控制

       一般來說發生阻塞的原因帶寬資源不足,中間路由緩存滿,物理鏈路過載等,防止過多的數據一下子涌入到網絡中。和流量控制有點不同,上面的接收窗口方式主要是保護兩端的主機,是端對端的保護,防止數據量太大處理不過來而癱瘓,阻塞控制能保護到主機,路由和物理鏈路各個部分,更加“全面”。

慢啓動

        在阻塞控制方面,TCP使用的是擁塞窗口cwnd機制,正如上面所說,每個TCP連接初始化時都會設置擁塞窗口,大小是動態變化的,取決於當前的網絡狀況,默認的大小是十個MSS(max segment size),一個MSS表示的是一個TCP包的最大傳輸大小。

        發送方第一次發送的數據量是擁塞窗口的大小,發送完後,等待接收方發來的ACK包和接收窗口,如果網絡狀況好,接收沒問題,那麼發送方就會根據算法慢慢增大擁塞窗口的大小,發送更大的數據量,這樣一步一步遞增,最後達到一個峯值,這個峯值通常就是接收方所能接受的最大的數據量,這種擁塞窗口的處理機制就是慢啓動,上面說到的那個情景,爲什麼我們平時下載資源時,速度總是一步一步提升上去的原因,處於一種對網絡的保護,防止一下子大量數據涌入網絡,因爲物理鏈路過載,中間路由緩存滿問題導致的網絡阻塞,甚至癱瘓。

擁塞避免

        雖然慢啓動可以讓擁塞窗口從一個很低的值慢慢上升,但是通常cwnd的值都是加倍地增長的,目的是爲了最大化利用網絡帶寬的資源,如果網絡的帶寬很高,但由於慢啓動的限制,網絡上傳輸的數據量不多,就沒有充分地利用寬帶的資源了。當然,擁塞窗口的增長速度過快,也會導致大量數據涌入網絡,導致擁塞,所以在啓用了慢啓動的基礎上,如果發送方發現網絡擁塞了,那麼就要啓用擁塞避免算法。判斷網絡出現擁塞的方法就是當發送方發送報文數據後,如果沒有在規定時間間隔內收到接收方的確認報文,那麼就可以認爲出現了網絡擁塞,爲了防止擁塞窗口cwnd因增長速度過快導致的網絡擁塞,TCP設置了一個ssthresh變量,標識當前應該使用的網絡策略。

      當擁塞窗口的值小於ssthresh時,使用慢啓動算法,擁塞窗口慢慢增長,通常是加倍增長;當擁塞窗口的值大於ssthresh時,使用擁塞控制算法,停用慢啓動算法。擁塞控制算法就是當發送方判斷出當前網絡出現擁塞後,將ssthresh的值設置成發送窗口的1/2,並將擁塞窗口cwnd的值重置爲1,再重啓慢啓動算法,逐步增加擁塞窗口的值,這樣做能夠進一步緩解網絡的壓力,讓中間路由有時間處理掉自己緩存隊列中的分組數據。

慢啓動重啓

        在慢啓動中還有一個機制用來保護網絡資源,就是慢啓動重啓,當通信雙方建立連接後,長時間沒有進行數據的發送,那麼TCP就會重置擁塞窗口到初始值,防止突然大量數據的發送,這就是慢啓動重啓機制。當然慢啓動重啓還是有不足的地方,如果HTTP和HTTPS網站支持長連接的話,使用慢啓動重啓,發送的數據量又從小慢慢遞增,會降低網絡的性能,不能充分利用帶寬資源,所以通常慢啓動重啓是不開啓的:

使用sysclt –w net.ipv4.tcp_slow_start_after_idle=1命令關閉慢啓動重啓,然後sysclt net.ipv4.tcp_slow_start_after_idle命令查看慢啓動重啓的開啓狀態。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章