深入剖析TCP協議的send與recv

2021-09-01 20:26:02 字數 2069 閱讀 3181

**:

深入剖析tcp協議的send與recv

一、 滑動視窗的概念

tcp資料報的tcp頭部有乙個window欄位,它主要是用來告訴對方自己能接收多大的資料(注意只有tcp包中的資料部分占用這個空間),這個欄位在通訊雙方建立連線時協商確定,並且在通訊過程中不斷更新,故取名為滑動視窗。有了這個字段,資料傳送方就知道自己該不該傳送資料,以及該發多少資料了。tcp協議的流量控制正是通過滑動視窗實現,從而保證通訊雙方的接收緩衝區不會溢位,資料不會丟失。

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

二、 滑動視窗移動規則

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

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

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

三、send行為

預設情況下,send的功能是拷貝指定長度的資料到傳送緩衝區

,只有當資料被全部拷貝完成後函式才會正確返回,否則進入阻塞狀態或等待超時。如果你想修改這種預設行為,將資料直接傳送到目標機器,可以將傳送緩衝區大小設為0(或通過tcp_nodelay禁用nagle演算法),這樣當send返回時,就表示資料已經正確的、完整的到達了目標機器。注意,這裡只表示資料到達目標機器網路緩衝區,並不表示資料已經被對方應用層接收了。

協議層在資料傳送過程中,根據對方的滑動視窗,再結合mss值共同確定tcp報文中資料段的長度,以確保對方接收緩衝區不會溢位。當本方傳送緩衝區尚有資料沒有傳送,而對方滑動視窗已經為0時,協議層將啟動探測機制,即每隔一段時間向對方傳送乙個位元組的資料,時間間隔會從剛開始的30s調整為1分鐘,最後穩定在2分鐘。這個探測機制不僅可以檢測到對方滑動視窗是否變化,同時也可以發現對方是否有異常退出的情況。

push標誌指示接收端應盡快將資料提交給應用層。如果send函式提交的待傳送資料量較小,例如小於1460b(參照mss值確定),那麼協議層會將該報文中的tcp頭部的push欄位置為1;如果待傳送的資料量較大,需要拆成多個資料段傳送時,協議層只會將最後乙個分段報文的tcp頭部的push欄位置1。

四、recv行為

預設情況下,recv的功能是從接收緩衝區讀取(其實就是拷貝)指定長度的資料。如果將接收緩衝區大小設為0,recv將直接從協議緩衝區(滑動視窗區)讀取資料,避免了資料從協議緩衝區到接收緩衝區的拷貝。recv返回的條件有兩種:

1. recv函式傳入的應用層接收緩衝區已經讀滿

2. 協議層接收到push欄位為1的tcp報文,此時recv返回值為實際接收的資料長度

協議層收到tcp資料報後(儲存在滑動視窗區),本方的滑動視窗合攏(視窗值減小);當協議層將資料拷貝到接收緩衝區(滑動視窗區—>接收緩衝區),或者應用層呼叫recv接收資料(接收緩衝區—>應用層緩衝區,滑動視窗區—>應用層緩衝區)後,本方的滑動視窗張開(視窗值增大)。收到資料更新window後,協議層向對方傳送ack確認。

協議層的資料接收動作完全由傳送動作驅動,是乙個被動行為。在應用層沒有任何干涉行為的情況下(比如recv操作等),協議層能夠接收並儲存的最大資料大小是視窗大小與接收緩衝區大小之和。windows系統的視窗大小預設是64k,接收緩衝區預設為8k,所以預設情況下協議層最多能夠被動接收並儲存72k的資料。

TCP協議深入理解

tcp協議在能夠傳送資料之前就建立起了 連線 要實現這個連線,啟動tcp連線的那一方首先將傳送乙個syn資料報。這只是乙個不包含資料的資料報,然後,開啟syn標記。如果另一方同時在它收到syn標記的埠通話,它將發回乙個syn ack syn和ack標誌位都被開啟,並將ack 確認 編號字段設定為剛收...

TCP協議深入理解

任何一方都可以關閉乙個tcp連線,要求雙方傳送乙個fin訊號關閉自己的通訊頻道。一方可以在另一方之前關閉,或者雙方同時關閉tcp連線。因此,當一 方傳送乙個fin訊號時,另一方可傳送 fin ack 開始關閉自己一方的通訊並且確認收到了第乙個fin訊號。傳送第乙個fin訊號的人接下來再發 送乙個 f...

深入淺出TCP與IP協議筆記

tcp ip 4層結構 應用層 傳輸層 網路層 鏈路層 探索過程問題 乙個主機的資料要經過哪些過程才到達對方的主機上 一組電訊號就是乙個資料報,乙個資料報稱為一幀,制定這個規則的就是乙太網協議 0 物理介質 http傳送乙個請求時,應用層,傳輸層,網路層和鏈路層的相關協議依次對 該請求 進行 包裝 ...