2.7持久连接节省通信流量
HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。
--------------------------------------------
————————SYN————————>
<——————SYN/ACK——————
————————ACK————————>
------HTTP请求----->
客户端 <-----HTTP响应------ 服务器
<———————FIN————————
————————ACK————————>
————————FIN————————>
<———————ACK—————————
----------------------------------------------
原先的通信都是容量很小的文本传输,所以即使这样频繁的发送请求也没有问题。但是随着网络的进步,文档中包含大量图片的情况多了起来。
例如,如果浏览器页面包含多个资源或者图片的HTML界面时,在发送请求访问HTML页面资源的同时,也会请求该HTML页面里包含的其他资源。因此,每次都会造成无效的TCP连接建立和断开,增加通信量的开销。
2.7.1持久连接
为了解决上述连接问题,HTTP/1.1和HTTP/1.0推出了持久连接方法。
持久连接——HTTP Persistent Connections,即HTTP keep-alive或HTTP connection reuse。
--------------------------------------------
————————SYN————————>
<——————SYN/ACK——————
————————ACK————————>
------HTTP请求----->
<-----HTTP响应------
|
客户端 || 服务器
|
------HTTP请求----->
<-----HTTP响应------
<———————FIN————————
————————ACK————————>
————————FIN————————>
<———————ACK—————————
----------------------------------------------
持久连接的好处在于减少了TCP连接的重复建立和断开所造成的额外开销,减少了服务器端的负载。
减少开销的那部分时间,使HTTP请求和响应可以更早的结束,这样使web页面的显示速度也就相应的提高了。
2.7.2管线化
持久连接使得多数请求以管线化方式发送成为可能。
从前发送请求后需等待并收到响应,之后才能发送下一个请求。
管线化技术出现后,不用等待响应亦可直接发送下一个请求。
比如,当请求一个包含10张图片的HTML Web页面,与挨个连接相比,用持久化连接可以让请求更快结束。而管线化技术则比持久化连接还快。请求数越多,时间差越明显。
--------------------------------------------
建立TCP连接
------HTTP请求①----->
<-----HTTP响应②------
|
|
|
------HTTP请求①----->
<-----HTTP响应②------
----------------------------------------------
2.8使用Cookie的状态管理
由于HTTP是无状态协议,它不对之前发生过的请求和响应的状态进行管理。也就是说,无法根据之前的状态进行本次的请求处理。
而Cookie的出现,则完美解决了这个问题。
Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。
Cookie会根据从服务器端发送的响应报文的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。服务器端发现客户端发送过来地Cookie之后,会去检查是从哪一个客户端发送过来地连接请求,然后比对服务器上地记录,最后得到之前的状态信息。
--------------------------------------
①请求报文(没有Cookie信息的状态)
GET /reader/ HTTP/1.1
Host: hackr.jp
--------------------------------------
②响应报文(服务器端生成Cookie信息)
HTTP/1.1 200 OK
Date: Thu, 12 Jul 2012 07:12:00 GMT
Server: Apache
<Set-Cookie: sid=1342077140226724; path=/; expires=Wed,=>10-Oct-12 07:12:20 GMT>
Content-Type:text/plain; charset=UTF-8
---------------------------------------
③请求报文(自动发送保存着的Cookie信息)
GET /image/ HTTP/1.1
Host:hackr.jp
Cookie: sid=1342077140226724
---------------------------------------
有关请求报文和响应报文内Cookie对应的首部字段