TCP使用端到端拥塞控制的原因:IP不能向端系统提供显式的网络拥塞反馈
让每一个发送方根据所感知到的网络拥塞程度来限制其能向连接发送流量的速率
- TCP发送方如何限制向连接发送的流量
运行在发送方的TCP拥塞控制机制跟踪一个额外的变量,即拥塞窗口,表示为cwnd,对一个TCP发送方能向网络中发送流量的速率进行了限制
L a s t B y t e S e n t − L a s t B y t e A c k e d ≤ m i n { c w n d , r w n d } LastByteSent-LastByteAcked\leq min\{cwnd,rwnd\}LastByteSent−LastByteAcked≤min{cwnd,rwnd}
假设:
- TCP接收缓存足够大,可以忽略接收窗口
- 发送方总是有数据要发送,拥塞窗口中的所有报文段都要被发送
- 通过调节cwnd的值,发送方可以调整向连接发送数据的速率
- TCP发送方感知与目的地之间出现了拥塞的方式
- 发生丢包事件:要么出现超时,要么收到来自接收方的3个冗余ACK
- TCP使用确认来触发增大拥塞窗口长度,TCP是自计时的
- 确定应当发送的速率:
- 一个丢失的报文段表意味着拥塞,因此当丢失报文段时应当降低TCP发送方的速率
- 一个确认报文段指示该网络正在向接收方交付发送方的报文段,因此,当对先前未确认报文段的确认到达时,能够增加发送方的速率
- 带宽探测:ACK指定路径无拥塞,丢包事件指定路径拥塞
TCP拥塞控制算法
快速恢复是推荐部分,对于TCP发送方来说不是必需的。
慢启动

在慢启动阶段。cwnd的值以1个MSS开始并且每当传输的报文段首次被确认就增加一个MSS,这样下去每过一个RTT,发送速率就会翻番。
结束慢启动指数增长的时期:
- 如果存在一个由超时指示的丢包事件,TCP发送方将cwnd设置为1并重新开始慢启动过程。将第二个变量的值ssthresh设置为cwnd/2。
- 直接与ssthresh的值相关联,当cwnd的值等于ssthresh时,结束慢启动并且TCP转移到拥塞避免模式
- 检测到3个冗余ACK,执行一种快速重传并进入快速恢复状态
拥塞避免
进入拥塞避免状态,每个RTT只将cwnd的值增加一个MSS。对于TCP发送方无论何时到达一个新的确认,就将cwnd增加一个MSS字节。
结束拥塞避免的线性增长的时期:和慢启动相同
快速恢复
对于引起TCP进入快速恢复状态的缺失报文段,对收到的每个冗余的ACK,cwnd的值增加一个MSS。
- 当对丢失报文段的一个ACK到达时,TCP在降低cwnd后进入拥塞避免状态
- 如果出现超时事件。快速恢复在执行如同在慢启动和拥塞避免中相同的动作后,迁移到慢启动状态
- 如果出现丢包事件,cwnd的值被设置为1个MSS,并且ssthresh的值设置为cwnd的一半
TCP拥塞控制:回顾
假定丢包由3个冗余的ACK而不是超时指示,TCP的拥塞控制是:每个RTT内cwnd线性增加1MSS,然后出现3个冗余ACK时cwnd减半。
TCP拥塞控制:加性增、乘性减(AIMD)
对TCP吞吐量的宏观描述
窗口长度为 w ww 字节,往返时间是 RTT 秒,当一个丢包事件发生的时候,用 W WW 来表示 w ww 的取值,当发送速率增到 W / R T T W/RTTW/RTT 时,网络丢弃来自连接的分组,然后发送速率就会减半。
每经过一个RTT发送速率增加 MSS/RTT,直到再次达到 W / R T T W/RTTW/RTT 为止。这一过程不断自我重复,因为TCP吞吐量在两个极值之间线性增长,所以有
一 条 连 接 的 平 均 吞 吐 量 = 0.75 × W R T T 一条连接的平均吞吐量=\frac{0.75×W}{RTT}一条连接的平均吞吐量=RTT0.75×W
经高带宽路径的TCP
丢包率 L LL 往返时间 RTT 最大报文长度 MSS
一条连接的平均吞吐量 = 1.22 × M S S R T T L \frac{1.22×MSS}{RTT\sqrt{L}}RTTL1.22×MSS
公平性
考虑K条TCP连接,每条都有不同的端到端路径,都经过一段传输速率为R bps的瓶颈链路。如果每条连接都得到相同份额的链路带宽,则认为这个拥塞机制控制是公平的。
TCP趋于在竞争的多条TCP连接之间提供对一段瓶颈链路带宽的平等分享。
公平性和UDP
运行在UDP上的多媒体应用是不公平的,因为它们不和其他连接合作。也不适时调整其传输速率
公平性和并行TCP连接
当一个应用使用多条并行连接时,占用了一条拥塞链路中较大比例的带宽。