图解HTTP 学习笔记二
告知服务器意图的HTTP方法
GET - 获取资源
POST - 传输实体主体
PUT - 传输文件
HEAD - 获得报文首部
DELETE - 删除文件
OPTIONS - 询问支持的方法
TRACE - 追踪路径
CONNECT - 要求用隧道协议链接代理
在常用的HTTP方法当中,GET与POST无疑是使用最多的。
GET方法用来请求访问已被URI(统一网络资源标识符)识别的资源。指定的资源经服务器端解析后返回响应内容。
POST方法用来传输实体的主体。
至于GET请求与POST请求的区别,移步这里。
HTTP报文
HTTP报文.pngHTTP报文组成通过上图便可以做一个相对详尽的了解。
以下摘录书中的一些说明:
HTTP首部字段结构 由首部字段名和字段值构成的,中间用冒号“:” 分隔。例如: Content-Type: text/html
另外,字段值对应单个 HTTP 首部字段可以有多个值,如下所示。Keep-Alive: timeout=15, max=100
当HTTP首部字段重复时,由于没有明确的规范,所以根据浏览器内部处理的逻辑不同,会有不同的结果。有些浏览器会优先处理第一次出现的首部字段,而有些则会优先处理最后出现的首部字段
HTTP 首部字段将定义成缓存代理和非缓存代理的行为,分成 2 种类型。
- 端到端首部(End-to-end Header)
分在此类别中的首部会转发给请求 / 响应对应的最终接收目标,且必须保存在由缓存生成的响应中,另外规定它必须被转发。 - 逐跳首部(Hop-by-hop Header)
分在此类别中的首部只对单次转发有效,会因通过缓存或代理而不再转发。HTTP/1.1 和之后版本中,如果要使用 hop-by-hop 首部,需提供 Connection 首部字段。
下面列举了 HTTP/1.1 中的逐跳首部字段。
除这 8 个首部字段之外,其他所有字段都属于端到端首部。
- Connection
- Keep-Alive
- Proxy-Authenticate
- Proxy-Authorization
- Trailer
- TE
- Transfer-Encoding
- Upgrade
HTTP状态码
HTTP状态码这张图对常用的十四种状态码做了简介。
以下附上一些书中的说明,便于以后查阅:
- 状态码204 不会使浏览器页面发生更新,一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。
- 状态码206 响应报文中包含由 Content-Range 指定范围的实体内容。
- 状态码301 301与302状态码相似,但 302 状态码代表的资源不是被永久移动,只是临时性质的。换句话说,已移动的资源对应的 URI 将来还有可能发生改变。比如,用户把 URI 保存成书签,但不会像 301 状态码出现时那样去更新书签,而是仍旧保留返回 302 状态码的页面对应的 URI。
- 状态码307 当 301、302、303 响应状态码返回时,几乎所有的浏览器都会把 POST 改成 GET,并删除请求报文内的主体,之后请求会自动再次发送。301、302 标准是禁止将 POST 方法改变成 GET 方法的,但实际使用时大家都会这么做。
- 状态码401 返回含有 401 的响应必须包含一个适用于被请求资源的 WWW-Authenticate 首部用以质询(challenge)用户信息。当浏览器初次接收到 401 响应,会弹出认证用的对话窗口。
- 状态码403 未获得文件系统的访问授权,访问权限出现某些问题(从未授权的发送源 IP 地址试图访问)等列举的情况都可能是发生 403 的原因。
持久连接节省通信量
HTTP协议的初始版本中,美进行一次通信就要断开一次TCP连接,这种方式在最开始的时候是没有问题的,但是随着HTTP的普及与互联网的发展,发送请求访问HTML页面资源的同时,也会请求该HTML页面里包含的其他资源。因此,每次的请求都会造成无谓TCP连接建立和断开,增加通信量的开销。从HTTP 1.1开始,所有连接默认为持久化连接。
持久连接 只要任意一端没有明确提出断开连接,则保持TCP连接状态。持久连接旨在建立1次TCP连接后进行多次请求和响应的交互。
持久化连接减少TCP连接的重复建立和断开所造成的额外开销,减轻服务器端负载,使HTTP请求和响应能够更早地结束,提高了Web页面的显示速度。
持久连接使得多数请求以管线化(pipelining)方式发送成为可能。从前发送请求后需等待并收到响应,才能发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求。管线化技术比持久化还要快,请求数量越多,时间差就越明显。
使用Cookie的状态管理
HTTP是无状态协议,它不对之前发送过的请求和响应的状态进行管理,也就是说无法根据之前的状态进行本次请求的处理。而为了使HTTP可以保存状态,就引入了Cookie技术。
书中Cookie示意图1 书中Cookie示意图2Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。
Cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。
服务器端发现客户端发送过来的Cookie后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。