假設一種這麼情況,當傳送方的應用程序傳送資料的速度比較慢,或者接收方的應用程序讀取資料速度比較慢,又或者雙方都有。但無論是對哪一種情況,都會讓傳送資料很小,這將會降低tcp的效能。
比如,接收方的快取空間已經滿了,接收方程序每次從快取中唯讀1位元組資料,而快取每次也只騰出1位元組的空間,然後向傳送方傳送確認,設定視窗為1位元組,這樣會導致傳送方每次也只傳送1位元組的資料(傳送方的視窗大小是由接收方的視窗rwnd控制的),如果加上tcp首部和ip首部的話,總共有41位元組的資料,但實際的資料只有1位元組,這會導致當前網路流量的利用率非常低,tcp的效能也就降低了,如果再加上物理層和資料鏈路層的開銷,tcp的效能就會更低,這種情況一般稱為糊塗視窗症候群(中文翻譯為糊塗視窗綜合症,簡稱sws)。
也就是說,這種情況是由可能發生在傳送方或接收方任何一方的,要解決這種情況,我們需要在任何一方採取有效措施避免。那麼可以讓接收方等待一段時間,直到接收視窗能容納乙個最大報文段(mss)或者接收方快取騰出一半空間。對於傳送方來說,必須等待可以傳送乙個最大報文長度(mss) 或者傳送接收方快取空間至少一半長度的時候,才能傳送資料。
拿傳送方來說,需要等待多長時間才合適?如果等待時間過長,則資料的處理過程則會延長,如果等待時間過短,還是有可能傳送很小的資料報文,為此,可以使用nagle演算法解決這種問題。
nagle演算法要求乙個tcp連線上最多只有乙個已經傳送但是未被確認的小分組(即少量資料的分組),且在這個分組被確認之前不能傳送其他的小分組。這樣tcp就會在傳送快取中積累這些資料比較小的分組,再組裝成乙個較大的分組,直到收到接收方發來的確認,然後把這個較大的分組傳送出去。也就是說,傳送方每次都會積累了足夠的分組裝成最大報文長度(mss)傳送出去
。
圖1-nagle演算法
如上圖所示,假設開啟了nagle演算法,傳送方給接收方傳送了乙個hello,但是由於現在接收方快取只剩下乙個位元組大小的空間,於是傳送方此時只傳送了乙個字母h,就會等待被確認。然後又分別傳送了e,l,l,o資料,但是傳送方會把e,l,l,o這幾個資料組裝成乙個較大的報文(ello),等待接收方的快取騰出足夠的空間再一起傳送出去。
而nagle演算法的巧妙之處在於,它權衡適應了傳送方程序產生資料的速率和網路處理資料的速率
。如果傳送方程序產生資料的速率比網路處理資料的速率要快,那麼組裝成的最大報文長度就更大,否則就更小一些。
圖2-nagle演算法應用場景
如上圖所示,一般來說,同處於同一區域網路下(192.168.0.0是區域網段)的兩台主機r1和r2之間通訊,時延一般是在10ms左右的(如果超過10ms,則說明當前區域網路的流量是有問題的),因為網路環境相對來說是比較穩定的,時延也比較短。因此在區域網下兩台主機間通訊很少使用nagle演算法。
一般tcp預設是開啟nagle演算法的,下面我們通過乙個實驗來驗證下,這個實驗的要求是:r1每次給r2傳送乙個字母x,總共傳送5次,然後我們通過wireshark抓包工具把r1和r2之間互動的資料報抓取下來並分析,看是否使用了nagle演算法。
圖3-nagle演算法實驗
在圖3中,216,217,218這三個資料報是r1和r2建立tcp連線的過程,236是r1傳送的第乙個資料報,從資料部分來看,236只傳送了乙個位元組資料。然後237是對236的確認包,如果236沒有被確認此時不能傳送其他小分組(因為nagle演算法規定:如果已經傳送了乙個小分組,在這個小分組被確認前,是不能傳送其他小分組)。
圖4-nagle演算法實驗
在這個過程中,可以收集其他4個小分組然後裝成乙個較大的分組再一起傳送出去,通過下圖可以發現,r1把4個小分組裝成乙個大的分組(即238報文)傳送出去了。
圖5-關閉nagle演算法
當我們關閉nagle演算法的時候,r1每發乙個位元組資料,就會封裝成乙個報文傳送出去,在關閉nagle演算法情況下,網路流量的利用率是非常低的,導致tcp的效能大大降低了。而啟動nagle演算法的情況下,在任一時刻也只能有乙個包在傳輸,在這個包被確認前不能傳送其他包,這樣就減少了較小的包數目,提高了tcp通訊的效能。
有一點需要明白,無論是關閉還是開啟nagle演算法,並沒有絕對的好壞,這只是相對的。比如在某些情況下nagle演算法就不適合,比較典型的就是要求時延盡量小的應用,比如在網路遊戲中,人物的動作需要及時的傳輸以確保不會影響玩家的的體驗。
一般nagle演算法預設是開啟的,如果不想使用的話可以在socket程式設計中可以使用tcp_nodelay選項來關閉nagle演算法。
對應的實驗具體參考自:
視窗糊塗症候群
當傳送端應用程序產生資料很慢 或接收端應用程序處理接收緩衝區資料很慢,或二者兼而有之 就會使應用程序間傳送的報文段很小,特別是有效載荷很小。極端情況下,有效載荷可能只有1個位元組 而傳輸開銷有40位元組 20位元組的ip頭 20位元組的tcp頭 這種現象就叫糊塗視窗綜合症 如果傳送端為產生資料很慢的...
TCP 滑動視窗協議
什麼是滑動視窗協議?一圖勝千言,看下面的圖。簡單解釋下,傳送和接受方都會維護乙個資料幀的序列,這個序列被稱作視窗。傳送方的視窗大小由接受方確定,目的在於控制傳送速度,以免接受方的快取不夠大,而導致溢位,同時控制流量也可以避免網路擁塞。下面圖中的4,5,6號資料幀已經被傳送出去,但是未收到關聯的ack...
TCP 滑動視窗協議
本系列文章是博主學習tcp協議以來的個人筆記。博主不能保證本文所述 內容絕對正確,所 以請讀者抱著懷疑的態度閱讀本部落格內的文字。如果讀 者因本部落格內的文字造成損失,本人 無力負責。如果有任何謬誤或者問題,希望讀者不吝賜教。在遍布世界的網際網路線路上進行可靠的資料傳輸談何容易,一來傳輸介質 有差異...