1. 程式人生 > >TCP滑動視窗和socket緩衝區之間的關係(記錄)

TCP滑動視窗和socket緩衝區之間的關係(記錄)

一、TCP的滑動視窗大小實際上就是socket的接收緩衝區大小的位元組數

二、對於server端的socket一定要在listen之間設定緩衝區大小,因為,accept時新產生的socket會繼承監聽socket的緩衝區大小。對於client端的socket一定要在connet之前設定緩衝區大小,因為connet時需要進行三次握手過程,會通知對方自己的視窗大小。在connet之後再設定緩衝區,已經沒有什麼意義。

三、由於緩衝區大小在TCP頭部只有16位來表示,所以它的最大值是65536,但是對於一些情況來說需要使用更大的滑動視窗,這時候就要使用擴充套件的滑動視窗,如光纖高速通訊網路,或者是衛星長連線網路,需要視窗儘可能的大。這時會使用擴充套件的32位的滑動視窗大小。

四、滑動視窗聽移動規則:

1、視窗合攏:在收到對端資料後,自己確認了資料的正確性,這些資料會被儲存到緩衝區,等待應用程式獲取。但這時候因為已經確認了資料的正確性,需要向對方傳送確認響應ACK,又因為這些資料還沒有被應用程序取走,這時候便需要進行視窗合攏,緩衝區的視窗左邊緣向右滑動。注意響應的ACK序號是對方傳送資料包的序號,一個對方傳送的序號,可能因為視窗張開會被響應(ACK)多次。

2、視窗張開:視窗收縮後,應用程序一旦從緩衝區中取出資料,TCP的滑動視窗需要進行擴張,這時候視窗的右邊緣向右擴張,實際上視窗這是一個環形緩衝區,視窗的右邊緣擴張會使用原來被應用程序取走內容的緩衝區。在視窗進行擴張後,需要使用ACK通知對端,這時候ACK的序號依然是上次確認收到包的序號。

3、視窗收縮,視窗的右邊緣向左滑動,稱為視窗收縮,Host Requirement RFC強烈建議不要這樣做,但TCP必須能夠在某一端產生這種情況時進行處理。