技术介绍
大家都有过这个经历吧,在双 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 更加困难。
本文链接:https://my.lmcjl.com/post/19518.html
4 评论