图解HTTP读书笔记
图解HTTP读书笔记(三)
本文包含原书第三章HTTP报文内的HTTP信息、第四章返回结果的HTTP状态码和第五章与HTTP协作的Web服务器的内容。
HTTP报文内的HTTP信息
HTTP报文及其结构
HTTP协议交互的信息称为HTTP报文,客户端发送的报文称为请求报文,服务器端响应的报文称为响应报文。
HTTP报文大致可以分为报文首部和报文主体两块。两者由空行(CR+LF)来划分。通常,并不一定有报文主体。下图显示了HTTP报文的结构:
由图可见,报文首部由以下数据组成。
- 请求行:用于请求的方法,请求URI和HTTP版本。
- 状态行:响应状态码,原因短语和HTTP版本。
- 首部字段:请求和响应的各种条件和属性,分别是通用首部,请求首部、响应首部和实体首部。
编码提升传输速率
HTTP传输数据时既可以按照数据原貌进行传输,也可以在传输过程中通过编码提升传输速率。
报文主体和实体主体的差异
- 报文是HTTP通信的基本单位,由8位组字节流组成通过HTTP通信传输。
- 实体作为请求或响应的有效载荷数据(补充项)被传输,主要由实体首部和实体主体组成。
- HTTP报文的主体用于传输请求或响应的实体主体。
- 差异:通常报文主体等于实体主体。只有在传输中进行编码操作时,实体主体的内容发生变化时,才导致两者发生差异。
压缩传输的内容编码
内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并负责解码。
常用的内容编码有以下几种:
- gzip(GNU zip)
- compress(UNIX 系统的标准压缩)
- deflate(zlib)
- identity(不进行压缩)
分割发送的分块传输编码
分块传输编码会将实体主体分为多个部分。
使用分块传输编码的实体主体会由接收的客户端负责解码,恢复到编码前的实体主体。
发送多种数据的多部分对象集合
HTTP协议中采纳了多部分对象集合,允许发送的一份报文主体内可含有多类型实体。通常用于上传文本文件或图片等。
可以通过设置Content-Type属性对其进行规定。多部分对象集合包含的对象如下:
- multipart/form-data:在 Web 表单文件上传时使用;
- multipart/byteranges:状态码206(Partial Content 部分内容)响应报文包含了多个范围的内容时使用;
获取部分内容的范围请求
指定范围发送的请求叫做范围请求。
执行范围请求时,会用到首部字段 Range 来指定资源的 byte 范围。
若想获得300-3000字节和5000字节到最后的资源,byte范围的指定形式如下:
Range: bytes=300-3000, 5000-
针对范围请求,响应会返回状态码为 206 Partial Content 的响应报文。对于多重范围的范围请求,响应会在首部字段 Content-Type 标明 multipart/byteranges 后返回响应报文。
如果服务器端无法响应范围请求,则会返回状态码 200 OK 和完整的实体内容
内容协商返回最合适的内容
内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为合适的资源。内容协商会以响应资源的语言、字符集、编码方式等作为判断的基准。
包含在请求报文中的某些首部字段就是判断的基准,如下:
- Accept
- Accept-Charset
- Accept-Encoding
- Accept-Language
- Content-Language
HTTP状态码
HTTP状态码描述客户端HTTP请求的返回结果。服务器返回的响应报文中第一行为状态行,包含了状态码以及原因短语,用来告知客户端请求的结果。
下表简单罗列了5种HTTP响应类别:
类别 | 原因短语 | |
---|---|---|
1xx | Informational(信息性状态码) | 接收的请求正在处理 |
2xx | Success(成功状态码) | 请求正常处理完毕 |
3xx | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4xx | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5xx | Server Error(服务器错误状态码) | 服务器处理请求出错 |
数字中的第一位指定了响应类别,后两位无分类。
HTTP 状态码总共有 60 余种,但是经常用的只有14 种,下面将详细介绍。
2XX 成功
2XX 的响应结果表明请求被正常处理了。
- 200 OK:表示客户端发来的请求在服务器端被正常处理了。
- 204 NO CONTENT:服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。
一般在只需要从客户端往服务器发送信息,而不需要返回数据时使用。 - 206 Partial Content:客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求。响应报文包含由 Content-Range 指定范围的实体内容。
3XX 重定向
3XX 响应结果表明浏览器需要执行某些特殊的处理以正确处理请求。
- 301 Moved Permanently:永久性重定向。表示请求的资源已被分配了新的 URI,以后应使用资源现在所指定的URI。
- 302 Found:临时性重定向。表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI 访问。
- 303 See Other:表示由于请求对应的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源。
303 和 302 状态码有着相同的功能,但是 303 状态码明确表示客户端应当采用 GET 方法获取资源。 - 304 Not Modified:表示客户端发送附带条件的请求,服务器端允许请求访问资源,但因发生请求未满足条件的情况后,直接返回 304 Not Modified(服务器端资源未改变,可直接使用客户端未过期的缓存)。
304 状态码虽然被划分在 3XX 类别中,但是和重定向没有关系。 - 307 Temporary Redirect:临时重定向。该状态码与 302 Found 有着相同的含义。
注意:虽然 HTTP 协议规定 301、302 状态下重定向时不允许把 POST 方法改成 GET 方法,但是大多数浏览器都会在 301、302 和 303 状态下的重定向把 POST 方法改成 GET 方法。
尽管 302 标准禁止 POST 变换成 GET,但实际使用时大家并不遵守。307 会遵照浏览器标准,不会从 POST 变成 GET。
4XX 客户端错误
4XX 的响应结果表明客户端是发生错误的原因所在。
- 400 Bad Request:表示请求报文中存在语法错误。需修改请求的内容再次发送请求。
- 401 Unauthorized:表示发送的请求需要有通过 HTTP 认证(BASIC认证、DIGEST认证)的认证信息。若之前已进行过 1 次请求,则表示用户认证失败。
- 403 Forbidden:表明对请求资源的访问被服务器拒绝了,服务器端没有必要给出拒绝的详细理由。
- 404 Not Found:表明服务器上无法找到请求的资源。
5XX 服务器错误
5XX 的响应结果表明服务器本身发生错误。
- 500 Internal Server Error:表明服务器端在执行请求时发生了错误。
- 503 Service Unavailable:表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
与HTTP协作的Web服务器
一台 Web 服务器可搭建多个独立域名的 Web 网站,也可作为通信路径上的中转服务器提升传输效率。
用单台虚拟主机实现多个域名
虚拟主机即物理层面只有一台服务器,但只要使用虚拟主机的功能,则可以假想已具有多台服务器。
在相同的 IP 地址下,由于虚拟主机可以寄存多个不同主机名和域名的 Web 网站,因此在发送 HTTP 请求时,必须在 Host 首部内完整指定主机名和 URI。
通信数据转发程序:代理、网关、隧道
这些应用程序和服务器可以将请求转发给通信线路上的下一站服务器,并且能接收从那台服务器发送的响应再转发给客户端。
代理
- 代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。
- 代理不改变请求 URI,会直接发送给前方持有资源的目标服务器(源服务器)。
- 在HTTP通信过程中可以级联多台代理服务器,并且转发时需要附加 Via 首部字段以标记经过的主机信息。
- 理由:利用缓存技术减少网络带宽的流量,组织内部针对特定网站的访问控制,以获取访问日志为主要目的,等等。
- 代理依据是否使用缓存或是否会修改报文进行分类。
缓存代理:代理转发响应时,缓存代理会预先将资源的副本保存在代理服务器上。当代理再次接收到相同资源的请求时,就可以不从源服务器那里获取资源,而是将之前缓存的资源作为响应返回。
透明代理:转发请求或响应时,不对报文做任何加工的代理类型被称为透明代理。反之,对报文内容进行加工的代理被称为非透明代理。
网关
- 网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的服务器一样对请求进行处理。有时客户端可能都不会察觉,自己的通信目标是一个网关。
- 网关的工作机制和代理十分类似,而网关能使通信线路上的服务器提供非 HTTP 协议服务。
- 利用网关可以提高通信的安全性,因为可以在客户端与网关之间的通信线路上加密以确保连接的安全。
隧道
- 隧道是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。
- 目的是确保客户端能与服务器进行安全的通信。
- 隧道本身不会去解析 HTTP 请求。也就是说,请求保持原样中转给之后的服务器。
- 隧道会在通信双方断开连接时结束。
保存资源的缓存
- 缓存是指代理服务器或客户端本地磁盘内保存的资源副本。
- 好处:利用缓存可减少对源服务器的访问,因此也就节省了通信流量和通信时间。
- 缓存服务器是代理服务器的一种,当代理转发从服务器返回的响应时,代理服务器将会保存一份资源的副本在代理服务器上。
缓存的有效期限
- 因为被缓存资源的具有有效性问题,所以即便缓存服务器内有缓存,也不能保证每次都会返回对同资源的请求。
- 当判断缓存过期后,客户端/缓存服务器会再次从源服务器上获取"新"资源。
客户端的缓存
- 客户端缓存:也称临时网络文件,存于客户端浏览器中,请求时会确认有效性。
- 浏览器缓存如果有效,可以直接从本地磁盘内读取。
- 若判断浏览器缓存过期后,浏览器会再次请求新资源。