学习之路-http连接管理
1.TCP连接
要想快速正确的发送数据,就需要了解TCP的一些基本常识。
TCP为http提供了一条可靠的比特传输管道。从TCP连接的一端填入的字节会从另一端以原有的顺序、正确的传送出来。http传送报文时是以流的形式打开TCP连接,tcp收到数据流之后,会将数据流看成被称作段的小数据块,并将其封装在IP分组中,通过因特网传输。
http事务时延:
(1)如果最近没有对url主机名进行过访问,DNS解析主机名为 IP地址可能需要10s。
(2)每建立一条新的TCP连接,通常最多需要1-2s,但是数百个 http事务的话,这个值会快速叠加上去。
(3)web服务器回送http响应,这也需要时间。
对TCP的性能考虑:http为tcp上层,所以http的书屋性能很大程度上取决于底层tcp通道的性能。
(1)TCP握手的时延:(如下图)新的TCP连接时,客户端要向服务端发送一个小的TCP分组(40-60字节),这个分组中设置了一个特殊的SYN标记,说明这是一个连接请求。服务器如果接受了连接,会向客户端返回一个TCP分组,包括SYN和ACK标记都被置位,说明连接已接受。最后客户端回送一条确认连接成功建立的消息。程序员看不到这些分组,只会看到创建TCP连接时存在的时延。
(2)TCP慢启动:为了防止因特网的突然过载和拥堵,TCP连接会自我调节,起初限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度。简单的说TCP限制了传输的分组数,每成功接收一个分组,就获得2个分组的权限。一次类推:1,2,4,8.....
2.HTTP连接
connection首部:在某些情况下,相邻的两个http应用程序会为它们的连接应用一组选项。connection首部有一个由逗号分隔的连接标签列表,承载3中不同类型的标签
(1)http首部字段名,列出只与此连接有关的首部
(2)任意标签值,用于描述此连接的非标准选项
(3)值close,说明操作完成之后需关闭连接
如图:
串行事务处理:每个事务都需要串行的建立一条新的连接,连接延时可能回合慢启动叠加。比如加载一个页面加载一副图片,其他地方没有动静,会让人觉得很慢。另一个缺点是浏览器无法再对象加载完毕后获知对象的尺寸和加载进度,用户面对的是一片空白屏幕。
并行连接:允许客户打开多条连接,并执行多个http事务。并行连接前提是带宽足够好,同事还要控制并行的连接个数,一般设置为4个。否则并行连接不一定比串行连接快。不过并行连接会给客户端一种错觉,感觉比串行连接快。
持久连接:就是常说的长连接,http允许http设备在事务处理结束之后将TCP连接保持打开状态,以便未来的http请求重用现存的连接。
持久连接和并行连接配合使用可能是最高效的方式
3.HTTP版本
http有3个版本,分别为0.9,1.0和1.1.本文主要说1.0和1.1。
http1.0用的是keep-alive连接。默认为短连接,支持长连接,可通过connection:keep-Alive来设置持久化连接。
http1.1是目前最新的版本,使用的是persistent连接。默认为持久连接(长连接),想要在事务处理结束后关闭连接可设置connection:close首部。
另外http1.1允许在持久连接上可选的使用请求管道,即管道化连接,在响应到达之前,可以将多条请求放入队列,当第一条请求通过网络流向另一端服务器时,第二条和第三条请求也可以开始发送了。这样做可以降低网络的环回时间。另外客户端不应该使用POST方式请求,应为此时管道化会产生副作用。如果发出一些数据请求之后,收到返回结果之前,连接关闭了,客户端无法确定服务器激发了多少次事务,有些事务,如GET一个html页面,可以反复发生多次,也不会产生变化,而像非幂等事务POST提交一张订单,就不能重复执行,不然会有多张订单的危险。