HTTP基础之四(HTTP、TCP性能考量)

从上一篇里面的浏览器到服务器的过程可以知道,每次请求完成都会关闭连接,新的请求会建立新的连接。HTTP依赖于TCP,所以优化HTTP性能必须从TCP入手分析。下图展示延迟的阶段:

从上图可以看出影响延迟的几个部分
①DNS查询(从hostname找到ip的过程)

②建立连接的过程

③发起请求到服务器端处理请求

④服务器发送响应到客户端

上面说的是影响网络延迟或性能的几个部分,至于影响多大,需要看硬件性能和网络和服务器的负载,以及服务器程序的性能,还有客户端到服务器端的距离。

 

 

TCP连接握手延迟

建立连接时,客户端和服务器需要彼此发送少量数据进行交互,这个会极大影响HTTP性能。过程如下图:

在发生任何数据之前,可以看出需要发送俩次数据包(SYN,SYN+ACK)

具体步骤说明(其实就是TCP的三次握手):

①新建TCP连接,客户端发送一个小的TCP数据包(40-60个字节),包含SYN(synchronism)标志位,代表请求开始。

②服务器端接收到连接请求时,计算连接参数,并且也发回一个小的TCP数据包,包含SYN和ACK两个标志位,代表请求接收

③客户端接收服务器返回的数据,会发送一个包含ACK的数据包,告诉浏览器此时连接已经建立成功,可以开始发送数据了。现代的TCP栈允许客户端此时在ACK的数据包里面发送一些数据,比如图上的GET / HTTP

 

延迟应答(TCP为何可以保障数据可靠传输?)

由于网络本身不能保障数据的可靠传输,所以TCP内部实现了应答机制类保障数据可靠传输。我们已经知道数据会被拆分为TCP数据片段,每一个数据片段能够获取一个序列号以及数据完整性校验和。当接收方验证数据为完整,这时会发送一个应答数据包给发送方。当发送方在一段时间内没有接收到数据完整的应答数据包时,会进行重发。由于应答的数据包很小,所以TCP运行它们捎带一些其它的数据,这样可以使网络利用更有效率。

 

TCP慢启动

TCP慢启动不是说启动慢,而是起初建立的连接会对最大的连接速度进行限制,但是随着该连接成功传输的数据越来越多,这个限制就会逐渐降低。这个有点能者多劳的意思,提供性能。这个主要是为了防止突然网络负载和拥塞。当一个连接第一次成功传输了一个数据包,下一次就可以传输2个,下次就是4个,以此类推。所以,这样看来,存在时间越长的连接,传输能力越强。所以HTTP包含了重用已有连接的功能。

 

Nagle算法和TCP_NODELAY

TCP具有一个把数据切成片段的接口,每一个片段的大小可以让应用程序自己定义,设置一次切1byte都可以。但是TCP数据片段至少携带40个bytes的标志和头信息。这就会导致一种情况,当传输大量的数据包,但是每个数据包包含很少量的数据。所以Nagle这个人就提出了一种算法来改善,简单来讲就是让每个包满载传递,如果所有的数据包都有了应答,那么可以发送不是满载的数据包,如果有其他的数据包还在传输中,那么就会把现在缓冲的数据发到未装满的数据包里面,等候发送。这个算法也带来了性能问题(在满足使用场景的情况下)。HTTP应用程序通常会设置一个参数TCP_NODELAY到TCP栈上面,以此禁用该算法,提升性能。

 

TIME_WAIT和端口耗尽

当一个TCP端点关闭了连接,它会在内存里面存放一个小控制块记录最近使用的IP和端口。这个信息会保留一会儿,典型的是2倍于最大数据片段生存时间(called “2MSL”,通常为2mins)确保在这个时间里面,不会重复创建一个具有同样IP和端口的新连接。

作者:张雪飞
出处:https://zhangxuefei.site/p/1034
版权说明:欢迎转载,但必须注明出处,并在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

发表评论

电子邮件地址不会被公开。 必填项已用*标注