您的位置:首页 > 理论基础 > 计算机网络

TCP流量控制和拥塞控制

2017-10-22 15:45 429 查看
一句话总结:通过滑动窗口进行流量控制,接收端根据自己资源情况改变发送端的窗口上限,即是改变滑动窗口的大小;

拥塞控制通过慢启动和拥塞避免,以及快速重传和快速恢复来实现,

慢启动以指数不断增大拥塞窗口大小,到达或超过慢开始阈值ssthresh,拥塞窗口cwnd执行拥塞避免转为线性增长,发生超时后,ssthresh=swnd/2,cwnd=1;

快速重传为提高效率不再等待超时后重发,而是当接收方连续发来3次重复确认,发送方立即重发下一个消息;快速恢复是超时后将拥塞窗口cwnd=ssthresh=swnd/2。

解释快速重传:

发送方发来消息M1,接收方收到,发送ACK_M1

发送方发送消息M2,接收方收到,发送ACK_M2

发送方发送消息M3,接收方没收到M3

发送方发送消息M4,接收方收到M4(接收方说:奇怪了,发送方没给我发M3,难道ACK_M2没有收到,于是连续发送3次重复确认)

......

发送方接收到3次连续M2的重复确认,哦,接收方没收到M3,于是重发消息M3。

下面图画的不错,摘自于:http://www.cnblogs.com/gaopeng527/p/5255757.html

TCP 的流量控制与拥塞控制可以说是一体的。流量控制是通过滑动窗口实现的,拥塞避免主要包含以下2个内容:

(1)慢开始,拥塞避免

(2)快重传,快恢复

 

1.流量控制——滑动窗口

TCP采用大小可变的滑动窗口进行流量控制,窗口大小的单位是字节。

发送窗口在连接建立时由双方商定。但在通信的过程中,接收端可根据自己的资源情况,随时动态地调整对方的发送窗口上限值(可增大或减小)。

为什么要设置窗口?

我们可以把窗口理解为缓冲区(但是有些窗口和缓冲区又不太一样)。

如果没有这些“窗口”,那么TCP没发送一段数据后都必须等到接收端确认后才能发送下一段数据,这样做的话TCP传输的效率实在是太低了。

解决的办法就是在发送端等待确认的时候继续发送数据,假设发送到第X个数据段是收到接收端的确认信息,如果X在可接受的范围内那么这样做也是可接受的。这就是窗口(缓冲区)引入的缘由。

1.1 窗口

(1)接收端窗口 rwnd     

接收端缓冲区大小。接收端将此窗口值放在 TCP 报文的首部中的窗口字段,传送给发送端。

(2) 拥塞窗口 cwnd (congestion window)    

发送端缓冲区大小

(3)发送窗口swnd

             发送窗口的上限值 = Min [rwnd, cwnd]

当 rwnd < cwnd 时,是接收端的接收能力限制发送窗口的最大值。

当 cwnd < rwnd 时,则是网络的拥塞限制发送窗口的最大值。 

1.2 滑动窗口

发送端已发送了 400 字节的数据,但只收到对前 200 字节数据的确认,同时窗口大小不变。还可发送 300 字节。

 

 

发送端收到了对方对前 400 字节数据的确认,但对方通知发送端必须把窗口减小到 400 字节。现在发送端最多还可发送 400 字节的数据。

 

2. 拥塞控制

2.1 慢开始和拥塞避免

2.1.1 慢开始原理

(1)在主机刚刚开始发送报文段时可先将拥塞窗口 cwnd 设置为一个最大报文段 MSS 的数值。

(2)在每收到一个对新的报文段的确认后,将拥塞窗口增加至多一个 MSS 的数值。

(3)用这样的方法逐步增大发送端的拥塞窗口 cwnd,可以使分组注入到网络的速率更加合理。

2.1.2 实例讲解

 

 

注:图中窗口的单位都是报文段

(1)当 TCP 连接进行初始化时:

发送窗口:swnd = 1 

慢开始阈值:ssthresh = 16

(2)发送端收到 ACK1 (确认 M0,期望收到 M1)后,将 cwnd 从 1 增大到 2,于是发送端可以接着发送 M1 和 M2 两个报文段(指数增长)

(3)接收端发回 ACK2 和 ACK3。发送端每收到一个对新报文段的确认 ACK,就把发送端的拥塞窗口加 1。现在发送端的 cwnd 从 2 增大到 4,并可发送 M4 ~ M6共 4个报文段。(指数增长)

(4)当swnd >= ssthresh,swnd执行拥塞避免算法,swnd窗口按线性规律增长。 (加法增大)

(5)当发送 超时,此时swnd = 24 :

ssthresh = swnd/2 = 12;(乘法减小)

swnd = 1

(6)重复地2步。

2.2 快重传和快恢复

2.2.1 快重传

发送端只要一连收到三个重复的 ACK 即可断定有分组丢失了,就应立即重传丢失的报文段而不必继续等待为该报文段设置的重传计时器的超时

2.2.2 快恢复

(1) 当发送端收到连续三个重复的 ACK 时,就重新设置慢开始门限 ssthresh。

(2) 与慢开始不同之处是 swnd 不是设置为 1,而是设置为 ssthresh + 3 * MSS。 

(3) 若收到的重复的 ACK 为 n 个(n > 3),则将 cwnd 设置为 ssthresh + n * MSS。

(4) 若发送窗口值还容许发送报文段,就按拥塞避免算法继续发送报文段。

(5) 若收到了确认新的报文段的 ACK,就将 swnd 缩小到 ssthresh。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  流量 tcp