计算机网络--拥塞控制
引言:
TCP与UDP各有各的优缺点,相比于UDP,TCP具有拥塞控制与滑动窗口机制等功能,这里先给自己整理一哈拥塞(se)控制。
为什么要用拥塞控制:
因为由于一些原因(接收过多的报文,超过路由器的处理能力)路由器可能会丢弃一些报文,然而定时器这个时候就会处于超时状态,发送端就会重新发送报文,这样反而会恶性循环,加重路由器的拥塞。那么为了控制这种情况设计人员在TCP的加入了拥塞控制功能。
分析有哪些方法可以解决这种情况:
- 在发生拥塞的时候,路由器进行流量限制
- 发送端减慢自己发送报文的速度
显然,TCP协议是利用第二种,控制发送端的发送报文速率进行拥塞控制的。
几个名词的认识:
- Sender window = Min {rwnd, cwnd}–发送窗口–缓存
- rwnd: receiver’s advertised window (接收方宣告窗口)—— a receiver-side limit——流量控制
- cwnd: congestion window(拥塞窗口) —— a sender-side limit(反映了网络的拥塞状况)——拥塞控制
- 慢启动和拥塞避免
- 快速重传和快速恢复
- ssthresh:人为设置的阈值
拥塞控制的过程:
-
建立一条新的TCP连接以后,执行慢启动:
···初始状态cwnd=1(1个最大报文段)
···发送方只允许发送1个TCP报文段(因为发送窗口=1)------慢启动实际并不慢,每过1个RTT,cwnd就翻倍,呈2的指数增长(当窗口为1时发送一个报文,经过一个RTT后,窗口大小加1为2,当窗口大小为2时发送两个报文,经过一个RTT时,窗口加2,是每当收到一个报文窗口就加1,以此类推)·等待ACK(即接收端接收报文后会返回一个指定报文)
···每收到1个ACK,
···发送窗口向右滑动1个报文段的长度
···cwnd+1 发送方连续发送2个报文段
···直到发送窗口大小=ssthresh(慢启动阈值) -
·在慢启动阶段,拥塞窗口以指数形式增长,要避免发生拥塞,当拥塞窗口达到某个值后,必须减慢拥塞窗口的增长规律
·当发送窗口大小=ssthresh时,发送方进入拥塞避免阶段
·在这个阶段中,只有当窗口中所有报文都确认后,拥塞窗口+1
·实质上:每收到1个ACK,cwnd=cwnd+1/ cwnd
·当RTT较大时,可以认为是每隔一个RTT,拥塞窗口cwnd+1 à 加性增加(Addictive Increase)
·拥塞避免直到出现重传定时器超时,即发生拥塞 -
·推测拥塞:超时重传–因为重传定时器超时
·ssthresh(慢启动阈值)设置为当前cwnd(拥塞窗口)的一半
·即ssthresh = [cwnd / 2]
·cwnd(拥塞窗口)= 1
·重新执行慢启动:也就是说如果还出现报文超时,那么ssthresh就要一直减半1,但是我好像记得书上有一个公式计算RTT和阈值的,书暂时不在身边网上也找不到,如果记得我我在补上。 -
·如果不是超时,而是连续收到3个ACK,处理方式是:
·ssthresh(慢启动阈值)设置为当前cwnd(拥塞窗口)的一半–这个与上面的操作是一样的
·cwnd=当前阈值–但是这里就与上面不同了,而是设置为当前慢启动阈值,连续收到3个ACK,说明1个报文段可能丢失了,但后面的几个报文段又安全到达
·开始拥塞避免阶段