HTTP协议用于客户端和服务器端之间的通信。
请求访问文本或图像等资源的一端称为客户端。而提供资源响应的一端成为服务器端。
在两台计算机之间使用HTTP协议通信时,在一条线路上必定有一端是客户端,另一端则是服务器端。
HTTP是不保存状态的协议
HTTP是一种不保存状态,既无状态(stateless)协议。HTTP协议自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理。
使用HTTP协议每当有新的请求发送时,就会有对应的新响应产生。协议本身并不保留之前一切的请求或响应报文的信息。这是为了更快地处理大量事物,确保协议的可伸缩性,而特意把HTTP协议设计成如此简单。
HTTP/1.1虽然是无状态协议,但为了实现期望的保持状态功能,于是引入了cookie技术。
持久连接节省通信量
HTTP 协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。以当年的通信情况来看,因为都是些容量很小的文本传输,所以即使这样也没有多大问题。可随着HTTP的普及,文档中包含大量图片的情况多了起来。
比如,使用浏览器一个包含多张图片的HTML页面时,在发送请求访问HTML页面资源的同时,也会请求该HTML页面里包含的其他资源。因此每次的请求都会造成无畏的TCP连接建立和断开,增加通信量的开销。
持久连接
为解决上述TCP连接的问题,HTTP/1.1和一部分的HTTP /1.0想出了持久连接(HTTP Persistent Connections ,也称为HTTP keep-alive或HTTP connection reuse)的方法。持久连接的特点就是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。
持久连接旨在建立一次TCP连接后进行多次请求和响应的交互。
管线化
持久连接使得多数请求以管线化方式发送成为可能。从前发送请求后需等待并收到响应,才能发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求。
这样就能够同时并行发送多个请求,而不需要一个接一个地等待响应了。
使用Cookie的状态管理
HTTP是无状态协议,他不对之前发生过的请求和响应状态进行管理。也就是说,无法根据之前的状态进行本次的请求处理。
假设要求登录认证的Web页面本身无法进行状态的管理(不记录已登陆的状态),那么每次跳转新页面就要再次登陆,或者要在每次请求报文中附加参数来管理登录状态。
保留无状态协议这个特征的同时又要解决类似的矛盾问题,于是引入了Cookie技术。Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。
Cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie,当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。