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,则认为该报文段以后的三个报文已经被接收端收到,则不等待重传定时器超时,直接重发重传队列中的第一个报文段。tcp
快速恢复的数据包守恒原则,即同一个时刻在网络中的数据包数量恒定,“老”数据包离开后,才能向网络中发送“新”的数据包。若是发送方收到一个重复的ACK,TCP的ACK机制就代表有一个数据包离开,此时cwnd加1。性能
非ECN环境下,在网络中间路由器丢包时,TCP协议经过RTO超时来重传丢失的包,保证数据可靠性。
对于网络链路中的路由器来讲,当中间路由器队列过载致使丢包后,各主机之间的TCP链接并不感知中间路由器的转发队列的忙闲状态。而是在RTO定时器超时以后,因为没有收到ACK,开始重传报文。而这个定时器的时间相对较长,一般从几秒到几十秒不等。报文丢弃致使多路TCP开始下降发送速率,甚至在一个窗口发送完毕以后,TCP的重传定时器没有超时以前,整个发送过程会偶尔停滞。在全部TCP下降性能以后,路由器的转发队列拥塞获得缓解,再也不丢弃报文,全部TCP又会同时提升发送速率,到达必定程度以后,路由器又开始丢弃报文,并重复刚才TCP的重传过程。该现象的问题有:spa
路由器的转发队列一般实现了RED功能,即路由器会根据当前队列的平均长度来作丢包决策,并随机丢弃一些TCP报文段,而不是等到队列满载,很好地避免了全部TCP同时超时的问题。.net
经过在TCP和IP首部的修改,能解决如下问题:设计
IP首部的修改code
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,须要有如下新增功能:blog
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 Reduce
ECE: ECN-Echo
The new definition of bytes 13 and 14 of the TCP Header.
针对主机侧的修改,首部将bit8和bit9的res字段修改成CWR和ECE。在RFC3168中的设计以下:
记录和转载别人的博客,加深记忆。