慢速启动是传输控制协议使用的一种阻塞控制机制。慢速启动也叫做指数增长期。慢速启动是指每次 TCP 接收窗口收到确认时都会增长。增加的大小就是已确认段的数目。
技术介绍
大家都有过这个经历吧,在双 11 时网购,需要好久才能收到,为什么呢?
在考虑卖家的发货能力,以及买家的收货能力后,我们还需要考虑快递的传输能力。
同理,当主机开始发送数据时,我们需要考虑网络承载能力,如果立即所大量数据字节注入到网络,那么就有可能引起网络拥塞。
如何防止这个问题的发生呢?我们今天来讲一下 TCP 慢启动。
技术图解
慢速启动:

看图说话
通常在刚开始发送报文段时,先把拥塞窗口 cwnd 设置为一个最大报文段的数值。而在每收到一个对新报文段的确认后,把拥塞窗口增加至多一个 MSS 数值。
也就是说,第一次时发送 1 个报文,在收到接收端确认之后,第二次时发送 2 个报文,同样都确认后,第三次时发送 4 个报文,2 倍指数增长。
它的名字虽然叫慢启动,但实际上一点不慢,因为指数增长是很快的,所以它需要一个上限值,默认为 64K。
慢启动的作用就是最大限度使用网络资源。
技术扩展
最大报文段长度选项 MSS,MSS 选项用于在 TCP 连接建立时,收发双发协商通信时每一个报文段所能承载的最大数据长度。
MSS 选项只能在初始化连接请求的报文段中使用。在报文段中发送 MSS 选项的终端利用该选项来对端 TCP 实体通告本端点在一个报文段中所能够接受的最大数据长度。
若没有指定这个选项意味本终端能够接受任何长度的报文段。一个 TCP 连接上允许各种长度报文段的传输,因此连接的两端利用 MSS 选项来协商报文段中最大数据长度是很必要的。
例如在一个小型系统中由于空间限制,TCP 仅能提供较小接受缓冲区。
则它与其它系统通信时,就必须互相协商一个较合适的 MSS,使对端发出报文段中的数据能够存入其接受缓冲器。
由于 TCP 连接的两个端点可能存在差异,在一个 TCP 连接的两个数据流方向上常常可能采用不同的 MSS 值。
进行 MSS 协商的另一个好处是能够提高网络带宽的利用率。在一个局域网中进行通信的两个节点可以选择一个较大的 MSS,使得报文段封装成 IP 分组时能够充分利用网络带宽。
但实际上在一般的 Intenet 环境中,为连接选择一个合适的 MSS 是很困难的。
这是因为 MSS 的取值过大或过小都会影响网络和 TCP 的性能。如报文段太小,将会大大降低网络的利用率。
但如果报文段太大也可能影响网性能。这是由于长 IP 分组在网络中传输时往往需要被分片传输。
分片和重组的过程自然将带来一定的网络处理开销。而且 IP 分组被分片后会独立传输,任何一个分片出现错误或丢失都将导致整个分组被丢弃,这也意味着整个报文段丢失,TCP 只能对整个 IP 分组进行确认和重传。
由于在 IP 通信子网中分组丢失的概率总是存在,因此 MSS 的增加所导致的分片将会使报文段成功达到目的端的概率下降,从而影响 TCP 性能和降低网络的吞吐率。
从理论讲,理想的 MSS 应该能尽可能多地承载用户数据,在传输上又需避免分片。
但实际中确定这样一个最佳的 MSS 是困难的。一种通路 MTU 发现技术可以帮助 TCP 来确定最佳的 MSS 值。
但是,仍然有许多 TCP 的实现并不能提供这样的值。
同时,由于 Internet 中采用的是动态路由选址,TCP 报文段的传输通路可能不断地发生改变,这使动态地计算最佳 MSS 更加困难。