TCP 的特性:滑动窗口、流量控制

一、TCP 连接可靠性的依据

确认应答、超时重传、连接管理

二、TCP 其他特性
延迟应答、捎带应答、粘包问题、保活机制、面向字节流

(四)滑动窗口

TCP 的可靠传输需要对每一个发送的数据段, 都要给一个 ACK 确认应答,收到 ACK 后再发送下一个数据段。
TCP 的特性:滑动窗口、流量控制

这样传输效率较低,尤其当数据往返时间较长时间。
因此有了滑动窗口的概念,批量传输数据(将多次的等待确认应答的时间重叠在一起),提高传送效率。
TCP 的特性:滑动窗口、流量控制
滑动窗口的工作原理如下图:
TCP 的特性:滑动窗口、流量控制
异常情况:

(1)数据包丢了:
当某一段报文段丢失之后, 发送端会一直收到 1001 这样的 ACK, 表示报文丢失;
如果发送端主机连续多次收到了同样一个 “1001” 这样的应答, 就会将对应的数据 1001 - 2000 重新发送;
这个时候接收端收到了 1001 之后, 再次返回的 ACK 就是 5001了(因为 2001 - 5000)接收端其实之前就已经收到了, 被放到了接收端操作系统内核的接收缓冲区中;
TCP 的特性:滑动窗口、流量控制
(2)数据包已经收到了,ACK 丢了
TCP 的特性:滑动窗口、流量控制
ACK 丢失并不会造成影响,如果 1001 ~ 2000 的 ACK 丢失了,但是收到了 2001 ~ 3000 的 ACK,则默认之前的数据包都已收到了。

(五)流量控制

接收端处理数据的速度是有限的。
如果发送端发的太快, 导致接收端的缓冲区被打满, 这个时候如果发送端继续发送, 就会造成丢包, 继而引起丢包重传等一系列连锁反应。
因此 TCP 支持根据接收端的处理能力, 来决定发送端的发送速度。这个机制就叫做流量控制(Flow Control)。

TCP 的特性:滑动窗口、流量控制
(六)拥塞控制

虽然 TCP 通过滑动窗口能够高效可靠的发送大量数据,但是如果在刚开始就发送大量的数据, 可能因为网络问题出现丢包情况。
因为网络上有很多的计算机, 可能当前的网络状态就已经比较拥堵。在不清楚当前网络状态下, 贸然发送大量数据, 很有可能引起雪上加霜。
因此 TCP引入 慢启动 机制, 先发少量的数据, 摸清当前的网络拥堵状态, 再决定按照多大的速度传输数据。
TCP 的特性:滑动窗口、流量控制
每接收一个数据包,cmd(拥塞窗口) 都会加 1.

慢启动:
为了不增长的那么快, 因此不能使拥塞窗口单纯的加倍。此处引入一个叫做慢启动的阈值,当拥塞窗口超过这个阈值的时候,不再按照指数方式增长, 而是按照线性方式增长。
TCP 的特性:滑动窗口、流量控制
当TCP开始启动的时候,慢启动阈值等于窗口大值。
在每次超时重发的时候,慢启动阈值会变成原来的一半,同时拥塞窗口置回1。

少量的丢包, 我们仅仅是触发超时重传;
大量的丢包, 我们就认为网络拥塞;
当TCP通信开始后, 网络吞吐量会逐渐上升; 随着网络发生拥堵, 吞吐量会立刻下降。
拥塞控制, 是 TCP 协议尽可能快的把数据传输给对方, 但是又避免给网络造成太大压力的折中方案。