天天看點

TCP滑動視窗協定

了解滑動視窗,先了解下面四個小知識

  • TCP使用兩個緩存和兩個視窗控制位元組流的傳輸過程。發送方有一個發送緩存,用了存儲程序準備發送的資料。接收方有一個接收緩存,用來存儲接收成功的資料,等待接收方應用程式讀取。接收方通過接收緩存的空餘空間,計算出接收視窗的大小,并且會通過應答封包告知發送方。發送方也有一個發送視窗,隻要這個視窗不為0,發送方就可以發送資料。
  • TCP不可能為對每個位元組都進行确認,而是采用累積确認的方式對發送的資料進行确認。如果發送方收到ACK封包中的确認序号為:522,則表示編号為521号之前的資料都已經被成功接收,下面開始接收編号522之後的資料了。
  • 每次成功發送資料之後,發送視窗就會在發送緩沖區中按順序移動,将新的資料包含到視窗中準備發送
  • 每個視窗用三個指針表示,第一個指向視窗的第一個位元組,第二個指向視窗中馬上要發送的位元組,第三個指向視窗的最後一個位元組。

傳輸位元組的狀态分類

  • 已經成功發送的
  • 已經發送,還沒有收到确認封包的
  • 準備發送的資料
  • 還沒準備發送的資料。

滑動視窗移動樣例(參考部落格:滑動視窗介紹)

TCP建立連接配接的初始,B會告訴A自己的接收視窗大小,比如為‘20’:

位元組31-50為發送視窗

資料報丢失的原因

  • 交換機或路由器過載使TCP包或确認包丢失;
  • 接收端對TCP包的确認速度慢,緻使發送端逾時重發;
  • 接收端緩存溢出;
  • TCP資料包在傳輸過程中丢失或損壞;
  • 發送端與接收端之間的距離太遠或傳輸速度太慢

總結