来自how tomcat works第四章
http长连接( persistent connection )是http1.1中新增的特性。
在此之前,如果浏览器向服务器请求资源,服务器在发送该资源后就将连接关闭。这样客户端需要使用不同的连接下载页面引用的其他资源,多余的连接需要耗费资源,是访问变慢。
所以在HTTP1.1中引入了persistent connection,当页面下载的时候,服务器并不直接关闭连接,而是等待web客户端请求页面引用的其他资源,使用同一个连接来完成传输。
persistent connection是http1.1的默认连接方式。
浏览器也可以在http request header中使用connection:keep-alive来显示指明。
数据分块
使用长连接的结果是,服务器可以使用同一个连接以字节流的方式发送不同的资源,客户端也可以发送多个请求。
数据发送方必须为每个请求或响应发送数据长度,接收方以此来决定如何解析收到的数据。
但通常,发送方在发送数据时,并不知道将要发送多少数据,只是在待发送数据的开始一些字节可用时,就开始发送。
这时,http header中的content-length字段不可用。
所以,需要有一种方式来告诉接收方如何解析收到的字节流。
HTTP1.1使用一个特别的头部transfer-encoding来表示有多少以块形式的字节流将会被发送。对每块来说,在数据之前,长度(十六进 制)后面接着CR/LF将被发送。整个事务通过一个零长度的块来标识。假设你想用2个块发送以下38个字节,第一个长度是29,第二个长度是9。
I'm as helpless as a kitten up a tree.
你将这样发送:
1D/r/n
I'm as helpless as a kitten u
9/r/n
p a tree.
0/r/n
1D,是29的十六进制,指示第一块由29个字节组成。0/r/n标识这个事务的结束。