zoukankan      html  css  js  c++  java
  • 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,再次开始发送数据
  • 相关阅读:
    474. Ones and Zeroes
    [LeetCode]464. Can I Win
    413. Arithmetic Slices
    numpy学习(布尔型索引)
    numpy学习(数组和标量之间的运算切片)
    numpy学习(数组的定义及基础属性)
    关于静态显示游标的遍历
    关于oracle的数组
    shutil模块
    开源库(不定义更新)
  • 原文地址:https://www.cnblogs.com/ashen1999/p/12736326.html
Copyright © 2011-2022 走看看