【网络】TCP协议的流量控制和拥塞控制

流量控制

接收端处理数据的速度是有限的,如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送,就会造成丢包,继而引起丢包重传等等一系列反应。

因而TCP支持根据接收端的处理能力,来决定发送端的发送速度,这个机制就叫做流量控制(Tlow Control)。TCP是利用滑动窗口来实现流量控制的。它的具体操作是,接收端主机向发送端主机通知自己可以接受数据的大小,于是发送端会发送不超过这个限度的数据,该大小限度就被称作窗口大小。

  • 接收端将自己可以接受的缓冲区大小放入TCP首部中的“窗口大小”字段,通过ACK端通知发送端;
  • 窗口大小字段越大,说明网络的吞吐量越高;
  • 接收端一旦发现自己的缓冲区快满了,就会将窗口大小设置成一个更小的值通知给发送端;
  • 发送端接收这个窗口之后,就会减慢自己的发送速度;
  • 如果接收端缓冲区快满了,就会将窗口置为0;这时发送方不再发送数据,但是需要定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端;

窗口扩大因子M:

接收端如何把窗口大小告诉发送端呢?在我们的TCP首部中,有一个16为窗口字段,就是存放了窗口大小信息;16位数字最大表示65535,,那么TCP窗口最大就是65536字节吗?

实际上,TCP首部40字节选项上还包含了一个窗口扩大因子M,实际窗口大小是窗口字段的值左移M位;

【网络】TCP协议的流量控制和拥塞控制

 

在图中,当接收端收到3001号开始的数据段后其缓冲区即满,不得不暂时停止接受数据,之后,在收到发送窗口更新通知才得以继续进行。如果这个窗口的更新通知在传送途中丢失,可能会导致无法继续通信。为避免此类问题的发生,发送端主机会时不时的发送一个叫做窗口探测的数据段,此数据段仅含一个字节以获取最新的窗口大小信息。

拥塞控制

虽然TCP有了滑动窗口这个大杀器,能够高效可靠的发送大量的数据,但是如果在刚开始阶段就发送大量数据,仍然可能引发问题;因为网络上有很多的计算机,可能当前的网络状态就已经比较拥堵,在不清楚当前网络状态下,贸然发送大量的数据,很有引起雪上加爽的。

TCP引入慢启动机制,先发少量的数据,探探路,摸清当前的网络拥堵状态,再决定按照多大的速度传输数据。

【网络】TCP协议的流量控制和拥塞控制

 

  • 此处引入一个概念为拥塞窗口
  • 发送开始的时候,定义拥塞窗口大小为1;
  • 每次收到一个ACK应答,拥塞窗口加1;
  • 每次发送数据包的时候,将拥塞窗口和接受端主机反馈的窗口大小作比较,取较小的值作为实际发送的窗口;

像上面这样的拥塞窗口增长速度,是指数级别的,“慢启动”只是指初始时慢,但是增长速度非常快。

  • 为了不增长的那么快,因此不能使拥塞窗口单纯的加倍;
  • 此处引入一个叫做慢启动的阈值;
  • 当拥塞窗口超过这个预知的时候,不再按照指数方式增长,而是按照线性方式增长;

【网络】TCP协议的流量控制和拥塞控制

  • 当TCP开始启动的时候,慢启动阈值等于窗口最大值;
  • 在每次超时重发的时候,慢启动阈值会变成原来的一半,同时拥塞窗口置回1;

少量的丢包,我们仅仅是触发超时重传;大量的丢包,我们就认为网络堵塞

当TCP通信开始后,网络吞吐量会逐渐上升;随着网络发生拥堵,吞吐量会立刻下降;

拥塞控制,归根到底是TCP协议想尽可能快的把数据传输给对方,但是又要避免给网络造成太大压力的折中方案