TCP 在连接过程的三次握手完成后,开始传数据,并不是一开始向网络通道中发送大量的数据包,这样很容易导致网络中路由器缓存空间耗尽,从而发生拥塞;而是根据初始的 cwnd 大小逐步增加发送的数据量,cwnd 初始化为 1 个最大报文段 (MSS) 大小(这个值可配置不一定是 1 个 MSS);每当有一个报文段被确认,cwnd 大小指数增长。 开始 —> cwnd = 1 1 个 RTT 后 —> cwnd = 2*1 = 2 2 个 RTT 后 —> cwnd = 2*2= 4 3 个 RTT 后 —> cwnd = 4*2 = 8
cwnd 不能一直这样无限增长下去,一定需要某个限制。TCP 使用了一个叫慢启动门限 (ssthresh) 的变量,一旦 cwnd>=ssthresh(大多数 TCP 的实现,通常大小都是 65536),慢启动过程结束,拥塞避免阶段开始; 拥塞避免:cwnd 的值不再指数级往上升,开始加法增加。此时当窗口中所有的报文段都被确认时,cwnd 的大小加 1,cwnd 的值就随着 RTT 开始线性增加,这样就可以避免增长过快导致网络拥塞,慢慢的增加调整到网络的最佳值。 非 ECN 环境下的拥塞判断,发送方 RTO 超时,重传了一个报文段;
快速重传,TCP 在收到重复的 3 次 ACK 时,会认为重传队列中的第一个报文段被网络丢弃,但由于收到的重复的 3 次 ACK,则认为该报文段之后的三个报文已经被接收端收到,则不等待重传定时器超时,直接重发重传队列中的第一个报文段。
快速恢复的数据包守恒原则,即同一个时刻在网络中的数据包数量恒定,"老" 数据包离开后,才能向网络中发送 "新" 的数据包。如果发送方收到一个重复的 ACK,TCP 的 ACK 机制就表明有一个数据包离开,此时 cwnd 加 1。
非 ECN 环境下,在网络中间路由器丢包时,TCP 协议通过 RTO 超时来重传丢失的包,保证数据可靠性。 对于网络链路中的路由器来说,当中间路由器队列过载导致丢包后,各主机之间的 TCP 连接并不感知中间路由器的转发队列的忙闲状态。而是在 RTO 定时器超时之后,由于没有收到 ACK,开始重传报文。而这个定时器的时间相对较长,通常从几秒到几十秒不等。报文丢弃导致多路 TCP 开始降低发送速率,甚至在一个窗口发送完毕之后,TCP 的重传定时器没有超时之前,整个发送过程会偶尔停滞。在所有 TCP 降低性能之后,路由器的转发队列拥塞得到缓解,不再丢弃报文,所有 TCP 又会同时提高发送速率,到达一定程度之后,路由器又开始丢弃报文,并重复刚才 TCP 的重传过程。该现象的问题有:
路由器的转发队列通常实现了 RED 功能,即路由器会根据当前队列的平均长度来做丢包决策,并随机丢弃一些 TCP 报文段,而不是等到队列满载,很好地避免了所有 TCP 同时超时的问题。
通过在 TCP 和 IP 首部的修改,能解决以下问题:
IP 首部的修改
- 0 1 2 3 4 5 6 7 + -----+-----+-----+-----+-----+-----+-----+-----+|DS FIELD,
- DSCP | ECN FIELD | +-----+-----+-----+-----+-----+-----+-----+-----+DSCP: differentiated services codepoint ECN: Explicit Congestion Notification The Differentiated Services and ECN Fields in IP. + -----+-----+|ECN FIELD | +-----+-----+ECT CE[Obsolete] RFC 2481 names
- for the ECN bits.0 0 Not - ECT 0 1 ECT(1) 1 0 ECT(0) 1 1 CE The ECN Field in IP.
IP 首部的 TOS 字段中的第 7 和 8bit 的 res 字段被重新定义为 ECN 字段,其中有四个取值,在 RFC3168 中描述,00 代表该报文并不支持 ECN,所以路由器的将该报文按照原始非 ECN 报文处理即可,即,过载丢包。01 和 10 这两个值针对路由器来说是一样的,都表明该报文支持 ECN 功能,如果发生拥塞,则 ECN 字段的这两个将修改为 11 来表示报文经过了拥塞,并继续被路由器转发。针对 01 和 10 的具体区别请参考 RFC3168。 所以路由器转发侧要支持 ECN,需要有以下新增功能:
TCP 首部的修改
- 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+|||C |E |U |A |P |R |S |F ||Header Length |Reserved |W |C |R |C |S |S |Y |I ||||R |E |G |K |H |T |N |N |+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+CWR: Congestion Window ReduceECE: ECN-EchoThe new definition of bytes 13 and 14 of the TCP Header.
针对主机侧的修改,首部将 bit8 和 bit9 的 res 字段修改为 CWR 和 ECE。在 RFC3168 中的设计如下:
记录和转载别人的博客,加深记忆。
来源: http://www.cnblogs.com/edisongz/p/6986527.html