什么是滑動窗口?
窗口是操作系統開辟的一塊緩存空間,發送方在收到接收方ACK應答之前,必須在緩沖區保留已發送的數據,如果按期收到確認應答,數據就可以從緩沖區移除。
什么是滑動窗口大?。?/strong>
窗口大小就是指無需等待ACK,可以繼續發送數據的最大值。
什么是累計確認?
假設發送方發送了100-199、200-299、300-399的數據包,接收方都收到了,但此時200-299的ACK發生了丟失,但是發送方依然可以通過300-399的數據包的ACK 400知道200-299的數據包已被發送方接收,這種模式就叫做累計確認。
窗口大小由誰決定?
TCP首部中的窗口大小是接收方告訴發送方自己還有多少緩沖區可以接收,發送端會根據這個值來發送數據,避免接收端處理不過來。
窗口大小由接收方的窗口大小決定,通常情況下發送方發送的數據大小不能超過接收方的窗口大小。
發送方滑動窗口
發送方的窗口主要分為四部分:
- #1:已發送并收到ACK確認的數據,1~31字節
- #2:已發送但未收到ACK確認的數據,32~45字節
- #3:未發送但總大小在接收方處理范圍內的數據,46~51字節
- #4:未發送但總大小超過接收方處理范圍的數據,52以后的字節
發送窗口需要借助三個指針來實現:
- SND.WND:發送窗口的大?。ㄓ山邮辗街付ǎ?/li>
- SND.UNA:表示已發送但未收到ACK確認的數據的第一個字節,這里是絕對指針
- SND.NXT:表示未發送但是可以發送范圍的第一個字節號,這里是絕對指針:
- #4區域的第一個字節可以通過SND.UNA+SND.WIND計算得出
可用窗口的大小為:SND.WIND - (SND.NXT - SND.UNA)
接收方的滑動窗口
接收方窗口分為三部分:
- #1+#2:已成功接收并確認的數據(等待應用程序讀?。?/li>
- #3:未收到但是可以接收的數據
- #4:未收到并且無法接收的數據
接收窗口需要借助兩個指針實現:
- RCV.WND:接收方的窗口大小,該值會告訴發送方
- RCV.NXT:期望發送方下一次發送過來數據的字節號
- #4的第一個字節號可以使用RCV.NXT + RCV.WND獲得
接收窗口和發送窗口大小相等么?
接收方窗口約等于發送窗口大小。