一,窗口控制
1,为什么要进行窗口控制?
TCP是以1个段(一个段包含若干个字节)为单位,每发一个段就要进行一次确认应答。这样的传输方式有一个缺点,那就是,包的往返时间越长消耗的转发时间就越多。为了解决这个问题,TCP引入了窗口这个概念。确认应答不再是以每个段,而是以更大的单位(就是窗口的大小)进行确认,转发时间将会被大幅度的缩减。引入了控制窗口以后,发送端发送了一个段之后不用等待确认应答,而是继续发送。
2,什么是窗口控制?
窗口大小就是指无需等待确认应答而可以继续发送的段的最大值,例如:窗口大小为4,就可以连续发送4个段。通过对多个段同时进行确认应答,减少了包的转发时间。在收到确认应答的情况下,将窗口移动到确认应答的序列号的位置,这种机制也称为滑动窗口控制。
二,流控制
TCP提供了一种机制可以让发送端根据接收端的实际接收能力控制发送的数据量,这就是所谓的流量控制。具体的操作过程是,接收端向发送端通知自己可以接受数据的大小,于是发送端发送的数据不会超过这个大小。该大小限制就被称作窗口大小,前面介绍的窗口大小的值就是由接收端决定的。TCP首部中有一个字段,用来表示窗口的大小。接收端将自己可以接收的数据段的大小,放到这个字段然后通知发送端。如果接收端的缓冲区一旦面临数据溢出时,窗口的大小也会被随之调整,设置为一个更小的值,来通知发送端,从而控制数据发送量。
三,拥塞控制
有了TCP的窗口控制,接收端与发送端之间不再以一个数据段为单位发送数据,可以连续发送数据段。然而,如果在通信刚开始就发送大量数据,可能会引起网络拥堵。TCP为了防止这个问题发生,在通信开始时会使用一个慢启动机制,对发送的数据量进行控制。
1,慢启动
在刚开始通信时,为了对发送的数据量进行调整,可以定义一个"拥塞窗口"。初始化时把这个"拥塞窗口"的大小定义为一个段。随着包的往返,"拥塞窗口"的大小呈指数增长。为了防止"拥塞窗口"过大,设置一个"慢启动阈值",当"拥塞窗口" == "慢启动阈值"开始执行拥塞避免算法,"拥塞窗口"的大小按线性规律增长。
2,拥塞控制具体过程
(1)TCP连接初始化,将拥塞窗口设置为1。
(2)执行慢开始算法,"拥塞窗口"按指数规律增长,"拥塞窗口" == "慢启动阈值"开始执行拥塞避免算法,"拥塞窗口"按线性规律增长。
(3)当网络发生拥塞时,把"慢启动阈值"值更新为拥塞前"慢启动阈值"的一半,"拥塞窗口"重新设置为1,按照前面的步骤(2)继续执行。