HTTP 协议基础与状态管理
HTTP 协议定义了客户端与服务端之间的通信规则。在两台计算机之间进行 HTTP 通信时,一条线路上必然一端是客户端,另一端是服务器端。
请求与响应结构
HTTP 通过请求报文和响应报文的交换达成通信:
- 请求报文:包含请求方法、请求 URI、协议版本、请求首部字段(可选)以及内容实体(可选)。
- 响应报文:包含协议版本、状态码、原因短语、响应首部字段(可选)以及内容实体(可选)。
无状态与 Cookie
HTTP 是一种无状态协议,它不对请求和响应之间的通信状态进行保存。这是为了更快地处理大量业务而特意设计的。Cookie 技术正是为了弥补这一特点,实现保持状态功能。
URI 定位资源
URI 用于完整定位请求的资源。例如:
GET http://hackr.jp/index.htm HTTP/1.1
或者在首部字段 Host 中写明网络域名或 IP 地址:
GET /index.htm HTTP/1.1
Host: hackr.jp
常用 HTTP 方法
不同的方法对应不同的操作意图,理解它们的区别对开发至关重要:
- GET:请求访问已被 URI 识别的资源。如果资源是文本则原样返回;如果是 CGI 程序,则返回执行后的输出结果。
- POST:用于传输实体主体。虽然 GET 也能传输数据,但 POST 更安全,适合提交敏感信息。
- PUT:通常用于传输文件,要求在请求报文的主体中包含文件内容,然后保存到请求 URI 指定的位置。
- DELETE:删除指定资源,是与 PUT 方法相反的操作。
- HEAD:与 GET 类似,但只返回报文首部,不返回实体内容,常用于检查资源是否存在。
- OPTIONS:询问针对请求 URI 指定资源支持的 HTTP 方法。当 URI 为'*'号时,代表询问服务器本身支持的方法。
- TRACE:让 Web 服务端将之前的请求通信返回给客户端。在请求过程中可能会经过代理中转,客户端使用该方法可以查询发送出去的请求是怎样被加工修改的。发送时需填入 MAX-Forwards 数值,每经过一个服务端减 1,减到 0 时停止传输。成功响应状态码为 200 OK,实体包含整个请求信息,Content-Type 为 message/http,且不能被缓存。
- CONNECT:要求与代理服务器通信时建立隧道,实现用隧道协议(如 SSL、TLS)进行通信,加密内容经网络隧道传输。
连接优化机制
- 持久连接(Persistent Connections / Keep-alive):只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。这种技术减少了 TCP 重复建立和断开所造成的额外开销及服务器负载,在 HTTP/1.1 中默认即为持久连接。
- 管线化(Pipelining):允许同时并行发送多个请求,无需等待前一个请求完成,进一步提升效率。
Cookie 状态管理流程
Cookie 通过在请求和响应中写入信息来控制客户端的状态。具体流程如下:
-
请求报文(无 Cookie)
GET /reader/ HTTP/1.1 Host: hackr.jp -
响应报文(服务端生成 Cookie) 服务端通过
Set-Cookie首部字段通知客户端保存 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:00 GMT Content-Type: text/plain; charset=UTF-8

