TCP滑动窗口实现流量控制

当建立了TCP连接后,接收方会根据自己的窗口大小对发送方进行流量控制。以实现对发送方发送速率的控制,使接收方可以接收到。

下面假设A方为发送方,B方为接收方。A方有1-900子节的数据,每100位放到一个子节段

  1. 首先B方向A方发送一个rwnd包,其中包含其窗口大小300
  2. 此后A方可以在收到确认之前,向B方发送300子节的数据
  3. A方的窗口长度此时为300,移到了1->300的位置
  4. A方每次都向B 方发送100字节的数据,假设200-300的数据丢失了
  5. B方接收到1-200的数据后,向A方发送确认包确认收到了1-200的数据,并更新窗口大小为400
  6. A方接收到确认包后,将已确认的数据移出窗口,窗口向后面的数据移动,再跟据窗口大小更改滑动窗口长度为400,此时滑动窗口移到了200->600的位置
  7. 200-300的数据发送时就开启了重传定时器,等到超时后会重新发送
  8. A方再分别向B方发送300-400/400-500/500-600的数据
  9. 此时重传定时器超时,A方重新发送200-300的数据
  10. B方接受到所有数据后对数据进行累计确认,并将窗口大小更改为0
  11. A方收到0的大小后,会开启一个持续计时器,计时器超时后会发送一个1字节长度的零窗口探测报文查询接收方窗口大小是否更改
  12. 假设过了一段时间,B方向A方发送rwnd包更新窗口大小,但丢失了
  13. 此时A方一直等待B方的rwnd包,B方一直等待A方的数据,形成死锁
  14. 而在持续定时器超时后零窗口探测报文就打破了这个死锁
  15. 如果零窗口探测报文探测到接收方窗口大小仍然为0,重新开启一个持续定时器,超时后继续探测
  16. 如果不为0,再次开始发送数据

猜你喜欢

转载自www.cnblogs.com/ashen1999/p/12736326.html