这里从两方面来进行优化,具体如下。
1. TCP三次握手优化
上文在介绍步骤2时提到,初始化网络连接会经过TCP三次握手,而众多传输协议都基于TCP网络传输,因此进行Web网络传输优化,TCP是其中重要的环节。建立一次TCP连接需要进行三次握手,三次握手给TCP带来了很大的延迟,那是否可以减少握手的次数呢?
当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。如果没有三次握手,有可能会出现一些已经失效的请求包突然又传到服务端的情况,服务端认为这是客户端发起的一次新的连接,于是发出确认包,表示同意建立连接,而客户端并不会有响应,导致服务器空等,白白浪费服务器资源或造成死锁。
注意,慢启动的过程中,随着cwnd的增加,可能会出现网络过载,其外在表现就是丢包,一旦出现此类问题,cwnd的大小会迅速衰减,以便网络能够缓过来。网络中实际传输的未经确认的数据大小取决于rwnd和cwnd中的较小值。那么,如何调整rwnd到合理值?
当遇到过网络传输速度过慢的问题,例如“百兆网路”,最大传输数据理论值至少10MB,但实际可能只有1MB,存在的最大问题是接收窗口rwnd设置不合理。实际上接收窗口rwnd的合理值取决于BDP的大小,也就是带宽和延迟的乘积。假设宽带100Mbps,延迟100ms,计算过程如下:
BDP=100Mbps * 100ms =(100 / 8)*(100 / 1000)= 1.25MB
如果想最大限制提升吞吐量,接收窗口“rwnd”的大小需要大于1.25MB。那如何调整cwnd到合理值?
cwnd的初始值取决于MSS的大小,计算方法为min(4 * MSS, max(2 * MSS, 4380)),以太网标准的MSS大小通常是1460,所以cwnd的初始值是3MSS。当我们浏览视频或者下载软件的时候,cwnd初始值的影响并不明显,这是因为传输的数据量比较大,时间比较长,相比之下,即便慢启动阶段cwnd初始值比较小,也会在相对短的时间内加速到满窗口。当我们浏览网页时,情况就不一样了,这是因为传输的数据量比较小,时间比较短,相比之下,如果慢启动阶段cwnd初始值比较小,那么很可能还没来得及加速到满窗口,通信就结束了。
2. 网络传输优化
关于网络传输优化,可以从以下几个方面考虑: