持久连接节省通信量
HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。每次的请求都会造成无谓的TCP连接建立和断开,增加通信量的开销。
Server: 必须要进行多次通信,好累......
为解决上述TCP连接的问题,HTTP/1.1和一部分的HTTP/1.0想出了持久连接(HTTP Persistent Connections)的方法。持久连接的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。
持久连接旨在建立1次TCP连接后进行多次请求和响应的交互。
Client: Web页面的打开速度变快了!
Server: 只要建立连接就能一次性发送请求的资源了
持久连接的好处在于减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。另外,减少开销的那部分时间,使HTTP请求和响应能够更早地结束,这样Web页面的显示速度也就相应提高了。
在HTTP/1.1中,所有的连接默认都是持久连接,但在HTTP/1,0内并未标准化。
持久连接使得多数请求以管道化(pipelining)方式发送成为可能。不需要响应,直接发送下一个请求。
Client: 不要等待就能直接发送下一个请求!
使用Cookie的状态管理
如果让服务器管理全部客户端状态则会成为负担。
Client: 让我一一记住你们,我的身体可吃不消啊
Cookie技术
通过在请求和响应报文中写入Cookie信息来控制客户端的状态。Cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie
的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文时加入Cookie值后发送出去。服务器端发现客户端发送过来的Cookie后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。
# 没有Cookie信息状态下的请求
Client: 保存Cookie
Server: 生成Cookie记住是向谁发送的
# 第2次以后(存有Cookie信息状态)的请求
Server: 啊,是刚才的那家伙
HTTP请求报文和响应报文的内容如下:
- 请求报文(没有Cookie信息的状态)
GET /reader/ HTTP/1.1
Host: hackr.jp
- 响应报文(服务器端生成Cookie信息)
HTTP/1.1 200 OK
Date: Fri, 7 Jun 2019 10:22:10 GMT
Server: Apache
<Set-Cookie: sid=134077140226724; path=/; expires=Fri, 13 Seq 2019 10:22:10 GMT>
Content-Type: text/plain; charset=UTF-
- 请求报文(自动发送保存着的Cookie信息)
GET /image/ HTTP/1.1
Host: hackr.jp
Cookie: sid=134077140226724
(最近更新:2019年09月18日)