TCP 流量控制 和拥塞控制
TCP 流量控制
- 一条TCP连接的每一侧主机都为该连接设置了接收缓存。
- 当TCP连接收到正确、按序的字节后,它就将数据放入接收缓存。
- 相关联的应用进程会从该缓存中读取数据,但不必是数据刚一到达就立即读取。
- TCP为它的应用程序提供流量控制服务,以消除发送方使接收方应用缓存溢出的可能性。
- 假设TCP接收方丢弃失序的报文段。
TCP让发送方维护一个称为 接收窗口 的变量(2B)
接收窗口给发送方一个提示: 该接收方还有多少可用的缓存空间,接收缓存用RcvBuffer表示其大小。
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。
这个过程是指数增长的。
何时结束这种指数增长?
- 存在一个由超时指示的丢包事件
TCP发送方将cwnd=1,并重新开始慢启动过程
将ssthresh = cwnd/2,将监测到拥塞时将ssthresh设置为拥塞窗口的一半 - 与ssthresh相关联,cwnd = ssthresh 时
结束慢启动,将TCP转移到拥塞避免模式
当TCP处于拥塞避免模式时,TCP会更为谨慎的增加cwnd。 - 当监测到3个冗余ACK时,这时TCP执行一种快速重传
由慢启动状态进入到快速恢复状态
2. 拥塞避免
当进入到拥塞避免状态时,cwnd的值大约变为上次遇到拥塞值时的一半,距离拥塞可能并不遥远。
TCP无法每过一个RTT将cwnd的值提高一倍,每个RTT只将cwnd的值增加一个MSS。完成方式有:
- 对于TCP发送方无论何时到达的一个确认,就将cwnd增加一个MSS * (MSS/cwnd)字节。
假设MSS = 1460B, CWND= 14600B, 则在一个RTT内发送10个报文段。每个到达ACK增加(1/10) *MSS的拥塞窗口长度。
何时结束拥塞避免的线性增加? - 出现超时时
ssthresh = cnwd/2
cwnd = 1, 然后进入慢启动过程 - 当监测到3个ACK时,cwnd也要收到3个MSS,
- TCP Tahoe版本: ssthresh变为cwnd 的一半, cwnd = 1 ->进入慢启动状态
- TCP Reno版本: ssthresh 变为cwnd的一半,cwnd = ssthresh + 3 -> 快速恢复版本->进入拥塞避免状态
3. 快速恢复
对于引起TCP进入快速恢复状态的缺失报文段,对收到的每个冗余的ACK,cwnd的值增加一个MSS。
最终,当对丢失报文段的一个ACK到达时,TCP在降低cwnd后进入拥塞避免状态。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?