TCP 流量控制 和拥塞控制

TCP 流量控制

  1. 一条TCP连接的每一侧主机都为该连接设置了接收缓存。
  2. 当TCP连接收到正确、按序的字节后,它就将数据放入接收缓存。
  3. 相关联的应用进程会从该缓存中读取数据,但不必是数据刚一到达就立即读取。
  4. TCP为它的应用程序提供流量控制服务,以消除发送方使接收方应用缓存溢出的可能性。
  5. 假设TCP接收方丢弃失序的报文段。

TCP让发送方维护一个称为 接收窗口 的变量(2B)
接收窗口给发送方一个提示: 该接收方还有多少可用的缓存空间,接收缓存用RcvBuffer表示其大小。
image
LastByteRcv - lastByteRead <= rcvBuffer
主机A轮流跟踪两个变量LastByteSent和LastByteAcked,主机A发送到连接中但是还未被确认的数据量。
主机A在连接的整个生命过程中需要保证 LastByteSent - LastByteAcked <= rwnd。
当cwnd == 0当时候,主机A继续发送只有一个字节数据的报文段,这些报文段会被接收方进行确认。

TCP 拥塞控制

拥塞: congestion
在一个发送方中未被确认的数据量会小于 min(cwnd, rwnd)
TCP拥塞控制算法包括3个主要部分: 1. 慢启动 2. 拥塞避免 3. 快速恢复

1. 慢启动

当一条TCP连接开始时,cwnd的值通常初始值置为一个MSS的较小值, 使初始发送速率为MSS/RTT
假设MSS=500B,RTT=200ms,那么发送速率约为220kbps,远小于带宽,TCP希望发送方迅速找到可用带宽的数量。
慢启动: cwnd的值以1个MSS开始,并且每当传输的报文段首次被确认就增加一个MSS。
比如一个发过去了,然后下一次发了2个,然后收到2个,然后就会发4个MSS。
这个过程是指数增长的。

何时结束这种指数增长?

  1. 存在一个由超时指示的丢包事件
    TCP发送方将cwnd=1,并重新开始慢启动过程
    将ssthresh = cwnd/2,将监测到拥塞时将ssthresh设置为拥塞窗口的一半
  2. 与ssthresh相关联,cwnd = ssthresh 时
    结束慢启动,将TCP转移到拥塞避免模式
    当TCP处于拥塞避免模式时,TCP会更为谨慎的增加cwnd。
  3. 当监测到3个冗余ACK时,这时TCP执行一种快速重传
    由慢启动状态进入到快速恢复状态

2. 拥塞避免

当进入到拥塞避免状态时,cwnd的值大约变为上次遇到拥塞值时的一半,距离拥塞可能并不遥远。
TCP无法每过一个RTT将cwnd的值提高一倍,每个RTT只将cwnd的值增加一个MSS。完成方式有:

  1. 对于TCP发送方无论何时到达的一个确认,就将cwnd增加一个MSS * (MSS/cwnd)字节。
    假设MSS = 1460B, CWND= 14600B, 则在一个RTT内发送10个报文段。每个到达ACK增加(1/10) *MSS的拥塞窗口长度。
    何时结束拥塞避免的线性增加?
  2. 出现超时时
    ssthresh = cnwd/2
    cwnd = 1, 然后进入慢启动过程
  3. 当监测到3个ACK时,cwnd也要收到3个MSS,
  4. TCP Tahoe版本: ssthresh变为cwnd 的一半, cwnd = 1 ->进入慢启动状态
  5. TCP Reno版本: ssthresh 变为cwnd的一半,cwnd = ssthresh + 3 -> 快速恢复版本->进入拥塞避免状态

3. 快速恢复

对于引起TCP进入快速恢复状态的缺失报文段,对收到的每个冗余的ACK,cwnd的值增加一个MSS。
最终,当对丢失报文段的一个ACK到达时,TCP在降低cwnd后进入拥塞避免状态。

posted @   CrazyShanShan  阅读(92)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示