天天看點

一文帶你搞定TCP滑動視窗

什麼是滑動視窗?

視窗是作業系統開辟的一塊緩存空間,發送方在收到接收方ACK應答之前,必須在緩沖區保留已發送的資料,如果按期收到确認應答,資料就可以從緩沖區移除。

什麼是滑動視窗大小?

視窗大小就是指無需等待ACK,可以繼續發送資料的最大值。

什麼是累計确認?

假設發送方發送了100-199、200-299、300-399的資料包,接收方都收到了,但此時200-299的ACK發生了丢失,但是發送方依然可以通過300-399的資料包的ACK 400知道200-299的資料包已被發送方接收,這種模式就叫做累計确認。

視窗大小由誰決定?

TCP首部中的視窗大小是接收方告訴發送方自己還有多少緩沖區可以接收,發送端會根據這個值來發送資料,避免接收端處理不過來。

視窗大小由接收方的視窗大小決定,通常情況下發送方發送的資料大小不能超過接收方的視窗大小。

發送方滑動視窗

一文帶你搞定TCP滑動視窗

發送方的視窗主要分為四部分:

  • #1:已發送并收到ACK确認的資料,1~31位元組
  • #2:已發送但未收到ACK确認的資料,32~45位元組
  • #3:未發送但總大小在接收方處理範圍内的資料,46~51位元組
  • #4:未發送但總大小超過接收方處理範圍的資料,52以後的位元組

發送視窗需要借助三個指針來實作:

  • SND.WND:發送視窗的大小(由接收方指定)
  • SND.UNA:表示已發送但未收到ACK确認的資料的第一個位元組,這裡是絕對指針
  • SND.NXT:表示未發送但是可以發送範圍的第一個位元組号,這裡是絕對指針:
  • #4區域的第一個位元組可以通過SND.UNA+SND.WIND計算得出

可用視窗的大小為:SND.WIND - (SND.NXT - SND.UNA)

接收方的滑動視窗

一文帶你搞定TCP滑動視窗

接收方視窗分為三部分:

  • #1+#2:已成功接收并确認的資料(等待應用程式讀取)
  • #3:未收到但是可以接收的資料
  • #4:未收到并且無法接收的資料

接收視窗需要借助兩個指針實作:

  • RCV.WND:接收方的視窗大小,該值會告訴發送方
  • RCV.NXT:期望發送方下一次發送過來資料的位元組号
  • #4的第一個位元組号可以使用RCV.NXT + RCV.WND獲得

接收視窗和發送視窗大小相等麼?

接收方視窗約等于發送視窗大小。