知识参考网络文章,以下为个人总结。
拥塞发生的主要原因:
在于网络能够提供的资源不足以满足用户的需求,这些资源包括缓存空间、链路带宽容量和中间节点的处理能力。由于互联网的设计机制导致其缺乏“接纳控制”能力,因此在网络资源不足时不能限制用户数量,而只能靠降低服务质量来继续为用户服务,也就是“尽力而为”的服务。拥塞其实是一个动态问题,我们没有办法用一个静态方案去解决,从这个意义上来说,拥塞是不可避免的。
流量控制 :
具体的技术是采用滑动窗口,以便通信双方能够充分利用带宽。
滑动窗口允许发送方在收到接收方的确认之前发送多个数据段。窗口大小决定了在收到目的地确认之前,一次可以传送的数据段的最大数目。窗口大小越大,主机一次可以传输的数据段就越多。当主机传输窗口大小数目的数据段后,就必须等收到确认,才可以再传下面的数据段
窗口的大小在通信双方连接期间是可变的,通信双方可以通过协商动态地修改窗口大小。改变窗口大小的唯一根据,就是接收端缓冲区的大小。
流量控制作为接受方管理发送方发送数据的方式,用来防止接受方可用的数据缓存空间的溢出。
流控制是一种局部控制机制,其参与者仅仅是发送方和接收方,它只考虑了接收端的接收能力,而没有考虑到网络的传输能力;
流控制的局限性:会导致了拥塞崩溃现象的发生。
TCP的拥塞控制由4个核心算法组成:
“慢启动”(Slow Start):
发送方维持一个拥塞窗口 cwnd ( congestion window )的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞。
当建立新的TCP连接时,拥塞窗口(congestion window,cwnd)初始化为一个数据包大小。源端按cwnd大小发送数据,每收到一个ACK确认,cwnd就增加一个数据包发送量。
每经过一个传输轮次,拥塞窗口 cwnd 就加倍。
原则:
只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。
“拥塞避免”(Congestion voidance):
引入一个慢启动阈值ssthresh的概念,当cwnd <ssthresh的时候,tcp处于慢启动状态,否则,进入拥塞避免阶段。
让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1
拥塞窗口cwnd按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢得多。
“快速重传 ”(Fast Retransmit)、“快速恢复”(Fast Recovery):
通常认为client接收到3个重复的ack后,就会开始快速重传,如果还有更多的重复ack,就开始快速恢复,事实上,我们可以把快速恢复看作是快速重传的后续处理,它不是一种单独存在的形态。
为什么通常clieng每接收到一个ack,会把cwnd增加一个segment呢?
这是基于“管道”模型(pipe model)的“数据包守恒”的原则(conservation of packets principle),即同一时刻在网络中传输的数据包数量是恒定的,只有当“旧”数据包离开网络后,才能发送“新”数据包进入网络。
如果发送方收到一个ACK,则认为已经有一个数据包离开了网络,于是将拥塞窗口加1。如果“数据包守恒”原则能够得到严格遵守,那么网络中将很少会发生拥塞;
本质上,拥塞控制的目的就是找到违反该原则的地方并进行修正。
congestion window总是处于两种状态的一个。这两种状态是: 慢起动(slow start)和堵塞避免(congestion avoidance)。
cwnd代表congestion window size。我们以片段的个数为单位,来表示cwnd的大小