3.3 网络传输优化
这里从两方面来进行优化,具体如下。
1. TCP三次握手优化
上文在介绍步骤2时提到,初始化网络连接会经过TCP三次握手,而众多传输协议都基于TCP网络传输,因此进行Web网络传输优化,TCP是其中重要的环节。建立一次TCP连接需要进行三次握手,三次握手给TCP带来了很大的延迟,那是否可以减少握手的次数呢?
当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。如果没有三次握手,有可能会出现一些已经失效的请求包突然又传到服务端的情况,服务端认为这是客户端发起的一次新的连接,于是发出确认包,表示同意建立连接,而客户端并不会有响应,导致服务器空等,白白浪费服务器资源或造成死锁。
- 长连接:HTTP 1.1引入了长连接,通过在请求头中加入Connection: keep-alive,来告诉请求响应完毕后不要关闭连接。不过HTTP长连接也是有限制的,服务器通常会设置keep-alive超时时间和最大请求数,如果请求超时或者超过最大请求数,服务器会主动关闭连接。
- TFO(TCP快速打开):用于三次握手过程,它通过握手开始时的SYN包中的TFO cookie(一个TCP选项)来验证一个之前连接过的客户端。如果验证成功,它可以在三次握手最终的ACK包收到之前就开始发送数据。
- 流量控制:传输数据时,如果发送方传输的数据量超过了接收方的处理能力,那么接收方会出现丢包。为了避免出现此类问题,流量控制要求数据传输双方在每次交互时声明各自的接收窗口rwnd的大小,以表明自己最大能保存多少数据。
- 慢启动:流量控制可以避免发送方过载接收方,但是却无法避免过载网络,这是因为接收窗口rwnd只反映了服务器个体的情况,却无法反映网络整体的情况。为了避免出现过载网络的问题,慢启动引入了拥塞窗口cwnd的概念,用来表示发送方在得到接收方确认前,最大允许传输的未经确认的数据。与rwnd不同的是,cwnd只是发送方的一个内部参数,无须通知接收方,其初始值往往比较小,然后随着数据包被接收方确认,窗口会成倍扩大。
注意,慢启动的过程中,随着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. 网络传输优化
关于网络传输优化,可以从以下几个方面考虑:
- 利用浏览器缓存,尽量不请求服务器端;
- 特殊情况须向服务器端发送请求以获取数据时,可以精简传输内容;
- 利用Gzip压缩传输内容,客户端接收压缩的内容后由浏览器解压,以提高宽带利用率;
- 减少cookie、session传递。
3.4 本章小结
本章主要讲述了分布式环境中网络及网络传输的过程。在网络传输过程中协议是基础,其中TCP/IP协议起了非常重要的作用。TCP协议能确保数据稳定传输,并且能监控传输过程中是否会出现数据失真、数据丢失等情况。若传输过程中出现问题,TCP协议会自动请求重新传输数据,并重组数据报。
在数据传输过程中,传输协议有自己的技术标准。OSI是一个开放的通信系统互连参考模型,通过它的7层结构可以让网络传输变得稳定。通过有效的网络优化手段(TCP三次握手、精简传输内容、浏览器缓存等),能让网络传输变得更高效。