1、拥塞检测
没有一个精确的方法或者说一个明确的信号告知发送方拥塞状况是否已发生。通常看是否有丢包情况来推断是否出现拥塞。在TCP中,丢包也被用作判断拥塞发生与否的指标,用来衡量是否实施相应的响应措施。
注意:在当今的有线网络中造成丢包的主要原因是拥塞,而在无限网络中却是传输和接收错误。
2、一些名词
1.拥塞窗口cwnd(congestion window):反映网络传输能力的变量。
2.接收端通知窗口awnd
3.发送端实际可用窗口W,W通常以包或字节为单位。可知:
W = m i n ( a w n d , c w n d ) W = min(awnd, cwnd) W=min(awnd,cwnd)4.在外数据值(flight size):已经发出但还未经确认的数据量大小。
通常在外数据值总是小于等于W
5.带宽延迟积(Bandwidth-Delay Product)BDP,也称最佳窗口大小。
在网络中如何确定一个连接的BDP是一个难点,需要考虑诸多因素,如路由、时延、统计复用(即共用传输资源)水平随时间的变坏性等。
3、自同步
TCP发送方的拥塞控制操作是由ACK的接收来驱动或控制的。发送方在接收到一个ACK后表明一个数据包已传输完毕,表明网络中“多”出了一个数据包的位置,可以继续发送一个数据包了。这种由一个ACK到达(称作ACK时钟)触发一个新数据包传输的关系称为自同步(self-clocking)。
4、慢启动
一开始发送方并不知道cwnd的值,不清楚应该发送多少数据包(但肯定是小于awnd),所以将cwnd先设为1,即1SMSS(发送端的最大段大小)。在收到好的ACK(指新接收的ACK号大于之前收到的ACK)后,以指数方式增长。例如,初始cwnd=1,收到一个ACK后,cwnd=2,接着cwnd=4,8,16以此类推,如此增长直到出现超时重传(RTO),此时认为cwnd过大导致网络拥塞,将cwnd大幅度减小,减至原值一半,作为慢启动阈值(slow start threshold ssthresh),由此切换为拥塞避免算法。
慢启动在TCP连接建立时或检测到由重传超时导致的丢包是执行。
5、拥塞避免
慢启动直到RTO出现确定ssthresh,然后再慢启动到达到ssthresh,转换为拥塞避免算法。每接收到一个新的ACK,cwnd会做出以下更新: c w n d t