視窗通知:
傳送端維護傳送視窗大小(不在包中傳輸),接收端在ack中告知接收視窗大小;
傳送視窗初始是傳送緩衝區大小,接收視窗初始是接收緩衝區大小;緩衝區決定視窗的最大值;
傳送視窗一般包括3個部分,從左到右:
已傳送但未收到ack的資料
可以立即傳送的資料
空閒空間;
接收視窗就是接收緩衝區還剩多少空間,接收端處理能力越強,從緩衝區提取資料的速度就越快,接收視窗就越大;
傳送視窗大小由接收視窗決定,傳送端收到ack後:
丟棄快取中對應的資料,左沿向右移動;(收縮)
根據ack告知的接收視窗看是否需要移動右沿;已傳送未 ack 的資料 + 可立即傳送資料 + 空閒 = 接收視窗;(擴張)
作用:提高效率,可以同時傳送多個資料;
流量控制,適配不同處理能力的傳送端和接收端
最優視窗大小(即傳送/接收緩衝區大小)的計算:
接收端接收緩衝區滿時,ack中接收視窗為0,阻止傳送端傳送資料。傳送方需要在接收方緩衝區空出來時得到通知,因此在發現零視窗後會進行視窗探測,即定時傳送含有1位元組內容的segment,通過其ack查詢接收方的接收視窗。
現象:大量的小segment被傳輸(payload太小),造成網路利用率低下
傳送端和接收端都有可能引起這種情況:
傳送端每次只傳送少量資料;
接收端的處理能力不夠或應用層沒有即時從接收緩衝區中取資料,接收視窗一直很小,傳送端只能發小segment。
解決:
* 傳送端: nagle演算法 *
只針對小segment
的stop-wait
協議,大segment不受影響;
在前乙個小segment(小於mss)的ack未到來前,快取並合併其他要傳送的小segment;
如果ack回來的很快,合併不了多少資料;
ack通常是delayed,會導致資料傳送的延時;不適合實時性的應用(可以取消);
目的是減少segment數目。
* 接收端: *
在接收端,當接收視窗小於一定閾值(如mss一半)時,無論是資料確認ack,還是對視窗探測的回應ack,都宣告接收視窗為0,阻止傳送端傳送小報文段。
參考:tcp記憶體的使用
網路程式設計釋疑之 TCP半開連線的處理
熟悉基於tcp協議進行linux高效能 高併發服務端程式設計的朋友肯定應該知道每個檔案描述符及其所佔的資源對併發量的影響。在這種7 24甚至 365不間斷執行的伺服器上,乙個描述符被浪費,兩個被浪費.如果被浪費的多了,那還何談高併發,高效能。除去檔案描述被正常占用的情況外,是什麼導致了我們可用的檔案...
網路程式設計釋疑之 TCP半開連線的處理
熟悉基於tcp協議進行linux高效能 高併發服務端程式設計的朋友肯定應該知道每個檔案描述符及其所佔的資源對併發量的影響。在這種7 24甚至 365不間斷執行的伺服器上,乙個描述符被浪費,兩個被浪費.如果被浪費的多了,那還何談高併發,高效能。除去檔案描述被正常占用的情況外,是什麼導致了我們可用的檔案...
網路程式設計釋疑之 TCP半開連線的處理
熟悉基於tcp協議進行linux高效能 高併發服務端程式設計的朋友肯定應該知道每個檔案描述符及其所佔的資源對併發量的影響。在這種7 24甚至 365不間斷執行的伺服器上,乙個描述符被浪費,兩個被浪費.如果被浪費的多了,那還何談高併發,高效能。除去檔案描述被正常占用的情況外,是什麼導致了我們可用的檔案...