计网学习笔记(8)- TCP

网络拥塞

在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种现象称为拥塞 (congestion)。

出现拥塞的原因:∑对资源需求 > 可用资源

如果一个路由器没有足够的缓存空间,它就会丢弃一些新到的分组。但当分组被丢弃时,发送这一分组的源点就会重传这一分组,甚至可能还要重传多次。这样会引起更多的分组流入网络和被网络中的路由器丢弃。可见拥塞引起的重传并不会缓解网络的拥塞,反而会加剧网络的拥塞。

拥塞控制就是防止过多的数据注入到网络中,使网络中的路由器或链路不致过载。

拥塞控制与流量控制的区别

流量控制往往指点对点通信量的控制,是个端到端的问题(接收端控制发送端)。流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。拥塞控制和流量控制之所以常常被弄混,是因为某些拥塞控制算法是向发送端发送控制报文,并告诉发送端,网络已出现麻烦,必须放慢发送速率。这点又和流量控制是很相似的。

分组的丢失是网络发生拥塞的征兆而不是原因。

TCP 的拥塞控制方法

  • TCP 采用基于窗口的方法进行拥塞控制。该方法属于闭环控制方法。

  • TCP发送方维持一个拥塞窗口 CWND (Congestion Window)

    • 拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。
    • 发送端利用拥塞窗口根据网络的拥塞情况调整发送的数据量。
    • 所以,发送窗口大小不仅取决于接收方公告的接收窗口,还取决于网络的拥塞状况,所以真正的发送窗口值为:


原则

只要网络没有出现拥塞,拥塞窗口就可以再增大一些,以便把更多的分组发送出去,这样就可以提高网络的利用率。但只要网络出现拥塞或有可能出现拥塞,就必须把拥塞窗口减小一些,以减少注入到网络中的分组数,以便缓解网络出现的拥塞。

判断
  • 重传定时器超时
    现在通信线路的传输质量一般都很好,因传输出差错而丢弃分组的概率是很小的(远小于 1 %)。只要出现了超时,就可以猜想网络可能出现了拥塞。

  • 收到三个相同(重复)的 ACK
    个别报文段会在网络中丢失,预示可能会出现拥塞(实际未发生拥塞),因此可以尽快采取控制措施,避免拥塞。

TCP拥塞控制算法

慢开始

算法的思路:由小到大逐渐增大拥塞窗口数值。

  • 初始拥塞窗口 cwnd 设置:
    把初始拥塞窗口 cwnd 设置为不超过2至4个SMSS 的数值。

  • 慢开始门限 ssthresh(状态变量):防止拥塞窗口cwnd 增长过大引起网络拥塞。

  • 拥塞窗口 cwnd 控制方法:在每收到一个对新的报文段的确认后,可以把拥塞窗口增加最多一个 SMSS 的数值。

拥塞窗口cwnd每次的增加量 = MIN (N, SMSS)

计网学习笔记(8)- TCP_第1张图片

使用慢开始算法后,每经过一个传输轮次 (transmission round),拥塞窗口 cwnd 就加倍。

一个传输轮次所经历的时间其实就是往返时间 RTT。

传输轮次强调:收到了对已发送的最后一个字节的确认。
例如,拥塞窗口 cwnd = 4,这时的往返时间 RTT 就是发送方连续发送 4 个报文段,并收到这 4 个报文段的确认,总共经历的时间。

慢开始门限 ssthresh 的用法如下:
  • 当 cwnd < ssthresh 时,使用慢开始算法。(拥塞窗口加倍)

  • 当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。(拥塞窗口加1)

  • 当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞避免算法。

拥塞避免

当网络出现拥塞时,无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(重传定时器超时):
  • ssthresh = max(cwnd/2,2)

  • cwnd = 1

  • 执行慢开始算法

计网学习笔记(8)- TCP_第2张图片

快重传

采用快重传FR (Fast Retransmission) 算法可以让发送方尽早知道发生了个别报文段的丢失。
快重传算法首先要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认。

发送方只要一连收到三个重复确认,就知道接收方确实没有收到报文段,因而应当立即进行重传(快重传),这样就不会出现超时,发送方也不就会误认为出现了网络拥塞。使用快重传可以使整个网络的吞吐量提高约20%。
快重传并非取消重传计时器,而是在某些情况下可更早地重传丢失的报文段。

计网学习笔记(8)- TCP_第3张图片

快恢复

当发送端收到连续三个重复确认时,由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,而是执行快恢复算法 FR (Fast Recovery) 算法:

  • 慢开始门限 ssthresh = 当前拥塞窗口 cwnd / 2。

  • 新拥塞窗口 cwnd = 慢开始门限 ssthresh。(cwnd不从1开始)

  • 开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大。(cwnd加1)

AIMD 算法

在拥塞避免阶段,拥塞窗口是按照线性规律增大的。这常称为“加法增大” AI (Additive Increase)。当出现超时或3个重复的确认时,就要把门限值设置为当前拥塞窗口值的一半,并大大减小拥塞窗口的数值。这常称为“乘法减小”MD (Multiplicative Decrease)。

发送窗口的上限值 = Min [rwnd, cwnd]

路由器的分组丢弃策略

当队列已满时,以后再到达的所有分组将都被丢弃。这就叫做尾部丢弃策略 (tail-drop policy)。

重传会使 TCP 连接的发送端认为在网络中发生了拥塞。于是在 TCP 的发送端就采取了拥塞控制措施,但实际上网络并没有发生拥塞。

主动队列管理 AQM

所谓“主动”就是不要等到路由器的队列长度已经达到最大值时才不得不丢弃后面到达的分组,应当在队列长度达到某个值得警惕的数值时(即当网络拥塞有了某些拥塞征兆时),就主动丢弃到达的分组。

随机早期检测 RED (Random Early Detection)(已不推荐使用)

使路由器的队列维持两个参数:队列长度最小门限 THmin 和最大门限 Thmax 。
RED 对每一个到达的分组都先计算平均队列长度 LAV 。

  • 若平均队列长度小于最小门限 THmin,则将新到达的分组放入队列进行排队。

  • 若平均队列长度超过最大门限 THmax,则将新到达的分组丢弃。

  • 若平均队列长度在最小门限 THmin 和最大门限THmax 之间,则按照某一概率 p 将新到达的分组丢弃。

计网学习笔记(8)- TCP_第4张图片
  • 当 LAV = Thmin 时,丢弃概率 p = 0。

  • 当 LAV = Thmax 时,丢弃概率 p = 1。

  • 当 THmin = LAV = THmax时, 0 < p < 1 。

你可能感兴趣的:(计网学习笔记(8)- TCP)