tcp滑動窗口的發送窗口和接收窗口的說法正確嗎?
經常看到一個說法,發送方的發送窗口大小取決於接收方的接收窗口大小。
我的疑惑是:
把滑動窗口切分為發送窗口和接收窗口,這個有依據么?在tcp/ip詳解中並沒有提到這兩個概念,我理解的滑動窗口是發送方和接收方共同維護的一個協議。可以這麼說,滑動窗口實際上都是由接收方確認,何來的發送窗口一說呢?
我們提到滑動窗口(slide window ) 指的是發送方維護的窗口:
窗口的左側是:「成功發送、並已經被接收方確認的位元組序列號」
窗口的右側是:「 我方(發送方)目前可以發送的最大位元組序列號」
Window size = 窗口右側 - 窗口左側
這個window size 就是接收方告訴我方(發送方)的大小,我們一般稱之為 advertised window size 。
由於窗口的左側會一直向右移動(因為成功發送的數據位元組序列號一直在變大),相應的窗口右側也會向右移動(水漲船高),所以稱這種動態的窗口為滑動窗口。
當滑動窗口的左側與右側完全重合,則意味著接收方通告我方(發送方)的 window size = 0 ,我方就要暫時停止數據的發送。直到對方TCP buffer有空餘的空間,告訴我方新的 window size,或者我方主動去查詢是否可以發送數據。
我們以上談的都是發送窗口,有沒有接收窗口呢?
一個TCP接收方接收到一個TCP segment,如何知道這個segment 是屬於哪個session ? 這個segment 是否合法?
第一個問題很簡單,根據五元組,很容易區分屬於哪個session,然後就不分青紅皂白接受了嗎?不是!需要檢查其合法性,checksum 校驗、長度檢查、狀態位檢查等,我們稱這些校驗為 sanity check。
還需要校驗segment 的sequence number (序列號)以及 acknowledge number是否合法,至少sequence number 應該位於一個框架內,大了越界非法,小了越界也非法,都會被丟棄。只有這個框架內segment才會接收(同時考慮 acknowledge number 合法)這個框架就是接收方用於檢查segment 是否合法的一個重要手段!
同理對於 acknowledge number 也界內檢查合法性,越界丟棄,界內接收(同時考慮 sequence number 合法)。
試想如果不進行這兩者的檢查,任何第三方都可以偽造一個segment,用於Reset 這個工作正常的 TCP session,這顯然很不安全。而有了這兩項檢查,偽造工作難度大大提高,因為 Initial sequence number 是動態隨機的,偽造一個能騙過接收方的segment 需要的是運氣!
我來回答一下,有什麼不對的地方請大神指正。 @車小胖
首先理解兩句話:伺服器必須將確認信息發回客戶端以表明數據接收。伺服器必須處理數據,將它傳遞給目標應用程序處理。區分開這兩件事情是非常重要的,區分開這兩件事情是非常重要的,區分開這兩件事情是非常重要的。
你在發送數據的時候,是發送給伺服器的,在基本的滑動窗口機制中,伺服器數據於接收時確認,但並不一定立即從緩存中傳輸出去。也就意味著當接收數據速度快於接收TCP處理速度時,緩存有可能被填滿。當這一情況發生時,接收設備需要調小窗口已防止緩存過載。如果相反,它會調大窗口。在這裡決定窗口大小的不是接收窗口,而是伺服器緩存的空閑空間。
現實中伺服器可能需要處理數十,數百乃至數千個TCP連接。TCP可能無法立刻處理數據,或應用應用程序本身無法接過多數據。任何一種情況 下,伺服器TCP都無法立刻將數據從緩存中移出。這時,除了發回確認信息給客戶端以外,伺服器會想要告知客戶端更改窗口大小,以表示緩存已經被部分 寫入了。
The congestion window (cwnd)
is a sender-side limit on the amount of data the sender can transmit
into the network before receiving an acknowledgment (ACK), while the
receiver"s advertised window (rwnd) is a receiver-side limit on the
amount of outstanding data. The minimum of cwnd and rwnd governs
data transmission.
rfc5681,應該可以回答這個問題了吧。很明確,發送端的窗口和接收端是分開的。這篇就是規定發送端窗口是怎麼動的。
滑動窗口大小是一個值,在通信的雙方都有。
去掉你的窗口就OK
發送方的發送(窗口)大小取決於接收方的接收窗口大小。
推薦閱讀:
※為什麼網關與主機可以不在同一個網段?
※ip地址是否可以取代mac地址,Fibre Channel over IP是否只使用ip地址進行通信?
※TCP協議自2000年後有什麼變化?
※所有的網路請求底層協議是不是都是TCP/IP?