- 拥塞控制原理
- 情况1:两个发送方和一台具有无穷大缓存的路由器
两台主机A和B有一条连接,理想情况下,假如A和B都有无穷大的缓存,来自主机A和主机B的分组通过一台路由器,在一段容量为R的共享式输出链路上传输,路由器带有缓存,当速率超过输出链路的容量时,路由器会缓存。假设路由器的缓存也是无限大的。
不管发送速率多大,吞吐量不会超过R / 2,排队时延会随着发送速率的增大而急剧的增大。这就造成了拥塞。 - 情况2:两个发送方和一台具有有限缓存的路由器
假如发送速率超过输出链路的容量,那么就会被缓存,因为路由器的缓存是有限的,所以此时如果还有数据发送过来那么就会造成丢包,丢包就会造成时延。- 一种理想的情况,发送方先检测路由器是否缓存满了,没满就发送数据,这种和情况1是一样的,吞吐量不会超过R / 2;
- 另一种更实际的情况,发送方得知丢包了,然后选择重传数据,这种情况最大吞吐量是R / 3,
- 最后一种情况就是,发送方发送的超时分组和后来重传的分组同时被接收方收到,这样就会丢弃一个,这种情况的吞吐量是R / 4
- TCP必须使用端到端的拥塞控制而不是网络辅助的拥塞控制,因为IP并不会向端系统提供显式的网络拥塞反馈;
- TCP所采用的方法: 让每一个发送方根据其所感知的网络拥塞程度来限制其能向连接发送流量的速率;
- 如果TCP判断网络通畅,那么它会提高发送速率
- 如果TCP判断网络拥塞,那么它会限制发送速率
- 这种方法需要解决三个问题:
- <1>TCP如何限制发送速率?
- <2>TCP如何感知网络拥塞程度?
- <3>TCP该以何种算法改变其发送速率?
- 对于问题<1>:
- TCP连接的每一端都维护着两个窗口(两个缓存)和几个变量:
- 发送方的窗口(拥塞窗口cwnd):它对发送方能向网络中发送流量的速率进行了限制,指某一源端数据流在一个RTT内可以最多发送的数据包数。发送端根据网络拥塞程度所预设的一个大小值,这个值就是拥塞窗口。
- 接收方的接收窗口
- 几个变量: LastByteRead,rwnd(拥塞窗口)等
- 我们假设,发送方可以在RTT时间范围内连续发送cwnd个字节的数据,所以发送速率即为cwnd/RTT;发送方通过调整窗口大小来对发送数据的速率加以控制
- TCP拥塞控制机制让连接的每一端都记录一个额外的变量,即拥塞窗口。拥塞窗口表示为cwnd, 他能限制一个TCP发送方向网络中发送流量的速率。特别是在一个发送方中从未被确认的数据量不会超过cwnd与rwnd中的最小值,即:
LastByteSent-LastByteAcked <= min{congwin, RcvWindow};
上面约束了发送方中未被确认的数量,因此间接地限制了发送方的发送速率。 - 对于问题<2>:
- 我们将TCP发送方的丢包事件定义为:
- 超时
- 收到接收方的3个冗余ACK
- 网络拥塞如何引发丢包?
- 如果网路拥塞,那么网络中的路由器就会发生缓存溢出,进而导致数据报被丢弃,然后就会引起发送方的丢包事件;此时,TCP发送方就可以认为TCP连接出现了拥塞
- 怎么判断网络通畅?
- TCP将接收方发送的ACK视为网络通畅的标志,
- 如果ACK到达的速率较高,那么TCP的拥塞窗口就会以较高的速率扩大,
- 如果ACK到达的速率较慢,那么TCP拥塞窗口的增加速度也会较慢;
- 因为TCP使用ACK对拥塞窗口做出调节,所以也被称为自计时的;
- TCP发送速率过高,网络就很容易拥塞;
- TCP发送方如果过于谨慎,那么就无法充分利用网络的带宽;
- TCP如何设置自己的发送速率,才能使得网络不会拥塞而且还充分利用带宽呢?关于这个问题,TCP使用下列指导性原则回答这些问题:
- 一个丢失的报文段意味着拥塞,因此当丢失报文段时应当降低TCP发送方的速率;
- 一个确认报文段指示该网络正在向接收方交付发送方的报文段,因此,当收到对先前报文段的确认时,可以增加发送方的速率;
- 带宽检测: TCP调节器传输速率的策略是增加其速率以响应到达的ACK,除非出现丢包,此时才减少发送速率;
- 如果网络中没有明确的拥塞控制状态信令,ACK和丢包事件充当了隐式信号.
- 对于问题<3>:
- 该算法包含三个主要部分:
- 慢启动、拥塞避免:
- 慢启动和拥塞控制是TCP的强制部分;两者的差异在于对收到的ACK做出反应时增加cwnd长度的方式;
- 快速恢复:
- 快速恢复是推荐部分,对于TCP发送方并非是必须的
- 慢启动、拥塞避免:
- 慢启动 :
- TCP连接在开始的时候,其cwnd常设置为一个MSS
- 然后在慢启动状态每收到一个ACK,cwnd就增加一个MSS(收到两个就增加两个);这样的话,在慢启动阶段,发送速率是指数增加的(1,2,4,8…)何时结束这种指数增长?有三种情况:
- 发送了超时(丢包事件、即拥塞)、
- 发生了冗余ACK、
- 发生了cwnd达到ssthresh、
- ssthresh是慢启动阈值的速记;
- ssthresh的用法如下:
- 当cwnd<ssthresh时,使用慢启动算法。
- 当cwnd>ssthresh时,改用拥塞避免算法。
- 当cwnd=ssthresh时,慢启动与拥塞避免算法任意。
- 在慢启动阶段,如果发生了超时事件,那么ssthresh就被设置为当前cwnd的一半,然后将cwnd置为1(每次发送一个MSS,即报文段),并重新开启慢启动;
- 当cwnd逐步增加到ssthresh时,再翻倍增加cwnd就有一点鲁莽了,所以此时TCP结束慢启动,进入拥塞避免模式。
- 在拥塞避免模式里,TCP将更谨慎地增加cwnd;如果收到冗余ACK (3个冗余ACK),那么TCP会做一次快速重传快速重传的链接,然后进入快速恢复阶段;
- 拥塞避免:
- 当cwnd<ssthresh的时候,tcp处于慢启动状态,否则,进入拥塞避免阶段。
- 一旦进入拥塞避免状态,cwnd的值大约是上次遇到拥塞时的一半,所以TCP在每个RTT中,只将cwnd增加一个1个MSS大小;也就是说在拥塞避免阶段,cwnd是线性增加的;
- 当出现超时时,将ssthresh更新为cwnd的一半;将cwnd设置为1,
- 当收到冗余ACK时,将ssthresh置为cwnd值的一半,然后将cwnd减半并且进入快速恢复状态;
- 说明冗余ACK比超时情况好很多
- 快速恢复:
- 在快速恢复阶段,对于引起TCP进入该状态的缺失报文段,每收到一个ACK,cwnd增加一个MSS;
- 最终,当对丢失报文段的一个ACK到达时,TCP降低cwnd后进入拥塞避免状态;
- 如果出现超时事件,快速恢复在执行如同慢启动和拥塞避免中相同动作后(ssthresh被设置为cwnd的一半,cwnd设为1个MSS),进入慢启动状态.
- TCP拥塞控制对因超时而检测到的丢包事件做出的反应与因受到3个冗余ACK而检测到的丢包事件做出的反应是不同的。
- 收到3个冗余ACK后,TCP将拥塞窗口减小一半,然后线性地增长。
- 超时事件发生时TCP发送方进入一个慢启动阶段,即他将阈值设为cwnd的一半,拥塞窗口设置为1MSS,然后窗口以指数速度增长。
- 拥塞窗口持续以指数速率增长,直到拥塞窗口cwnd达到超时事件前窗口值的一半(阈值)为止。
- 当多条连接共享一条瓶颈链路时,那些具有较小RTT的连接能够在链路空闲时更快的抢到可用带宽(即较快的打开其拥塞窗口),因而将比那些具有较大RTT的连接享用更高的吞吐量。
- 情况1:两个发送方和一台具有无穷大缓存的路由器
- 加性增、乘性减(additive-increase multiplicative-decrease,AIMD)
- TCP拥塞控制的思想: 当出现丢包事件时,让发送方降低其发送速率(通过减小拥塞窗口cwnd的大小)。
- 因为:通过该相同的拥塞路由器的其他TCP连接也很可能出现丢包事件,所以他们也可能会减小其cwnd的值来降低发送速率,因此该整体作用是让所有通过这一拥塞路由器路径的源降低他们向网络发送数据的速率,从而减轻了拥塞路由器的拥塞程度
- 但是当出现丢包事件后,TCP发送方应将其拥塞窗口减少多少呢?
- 答:TCP采用一种“乘性减”的方法,即每发生一次丢包事件,就将当前的cwnd值减半。但是不能降低到低于1个MSS。
- 那么当网络无拥塞的时候,即对前面的还没有确认的数据有ACK到达时,他应该怎样来扩大其发送速率?
- 答:如果没有检测到拥塞,则可能有可用(未使用的)宽带可被该TCP连接使用。这种情况下TCP缓慢地增加拥塞窗口的长度,谨慎地探测端到端路径上的额外的可用宽带。TCP发送方是这样做的,即每次它接收到一个确认后就把cwnd增大一点,其目标是在每个RTT内cwnd增加一个MSS。
总而言之,当TCP发送方感受到端到端路径无拥塞时就加性地增加其发送速率,当察觉到路径拥塞时(通过丢包事件)就乘性地减小其发送速率,因此被称为加性增、乘性减算法 - TCP拥塞控制协议的线性增长阶段被称为避免拥塞(congestion avoidance)。cwnd值重复地经历一种升降循环,即重复地线性增长,然后又突然降至其当前值的一半(当发生丢包事件时),这种循环使得TCP连接的cwnd变化呈锯齿形状。
2021-05-22 《计算机网络(自顶向下方法)》第3章——总结中(运输层)(拥塞控制原理)
最新推荐文章于 2022-01-13 17:21:43 发布