图解 HTTP

Review

  1. 2020/04/09
  2. 2021/02/04
  3. 2024-09-28 10:34

[!Summary] Books 《图解HTTP》

HTTP(HyperText Transfer Protocol)超文本传输协议,无状态协议(stateless)

一、Introduction #

万维网(WWW)构建技术 #

  1. HTTP
  2. HTML
  3. URL(Uniform Resource Locator, 统一资源定位符)

万维网可简单理解为通过浏览器来浏览内容的技术集合。

HTTP发展史 #

  1. HTTP/0.9 1990年问世
  2. HTTP/1.0 1996年5月,RFC1945
  3. HTTP/1.1 1997年1月,RFC2068,RFC2616(最新版本),2014/7月 ,HTTP/1.1更新,RFC7320
  4. HTTP/2.0 2015, RFC7540, RFC 7541
  5. HTTP/3.0 2019, RFC 9000 (QUIC protocol), RFC 9114 (HTTP/3 Protocol)

与HTTP密不可分的协议

  • DNS(Domain Name System):负责域名解析,域名到IP地址的解析
  • TCP(Transmission Control Protocol,传输控制协议):确保可靠性
  • IP(Internet Protocol):负责传输
  • ARP(Address Resolution Protocol,地址解析协议)根据IP地址查询MAC地址

TCP/IP协议族

  1. 应用层 FTP, DNS, HTTP
  2. 传输层 TCP, UDP
  3. 网络层 IP
  4. 链路层

URI & URL #

  • URI(Uniform Resource Identifier,统一资源标识符):http、ftp、file、mailto等都有URI;用字符串标识某一互联网资源。
  • URL(Uniform Resource Locator,统一资源定位符):专用于Web页面的网页地址;表示资源互联网上所处的位置;

表示指定的URI

  • 绝对URI
  • 绝对URL
  • 相对URL(是指从浏览器中基本URI处指定的URL)

绝对URI格式

  • 协议
  • 登录信息
  • 服务器地址
  • 服务器端口号
  • 带层次的文件路径
  • 查询字符串
  • 片段标识符

Request & Response #

请求报文 #

请求行:请求方法,请求URI,协议版本 请求首部字段(Request Header Fields) 通用首部字段(General Header Fields) 实体首部字段(Entity Header Fields) 实体主体

响应报文 #

状态行:协议版本,状态码,原因短语 响应首部字段(Response Header Fields) 通用首部字段 实体首部字段 实体主体

请求&响应 请求行 响应行 首部字段

  • 请求首部
  • 响应首部
  • 通用首部
  • 主体首部
Request #

HTTP/1.1请求方法

Request Method描述
GET
POST
PUT
PATCH
HEAD获得报文首部
用于确认URI的有效性及资源更新的日期时间等
DELETE
OPTIONS
TRACE追踪路径
让web服务器端将之前的请求通信还回给客户端,配合Max-Forwards首部字段
容易引发XST(Cross-Site Tracing, 跨站追踪)
CONNECT要求用隧道协议连接代理
主要使用SSL(Secure Sockets Layer, 安全套接字)和TLS(Transport Layer Security, 传输层安全)协议把通信内容加密后经网络隧道传输。
持久连接(Keep-Alive) #

只要任意一端没有明确提出断开连接,则保持TCP连接状态。减少了TCP连接的重复建立和断开所造成的额外开销。

优点:

  1. 减轻了服务器端的负载
  2. 加快了页面资源的获取速度

HTTP/1.1默认开启持久连接。

管线化技术(Pipelining) #

在 HTTP/1.1 协议中,管道化允许客户端在不等待服务器响应的情况下,连续发送多个请求,即同时并行发送多个请求。但浏览器实现有限制:最大并行请求个数一般6~8个。

限制:

  • 顺序性: 服务器必须按照请求的顺序返回响应。
  • 头部阻塞: 如果一个请求的响应很大或发生错误,后续的请求可能会被阻塞。
  • 实现复杂性: 服务器端需要维护一个请求队列,并对请求进行排序和处理。
  • 网络拥塞: 过多的管道化请求可能会导致网络拥塞。
编码 #

内容编码

  • gzip(GNU zip)
    • compress(UNIX系统的标准压缩)
  • deflate(zlib)
  • identity(不进行编码)

在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面,这种把实体主体分块的功能称为分块传输编码(Chunked Transfer Coding) 每一块都会用十六进制标记块的大小,而实体主体的最后一块会使用“0(CR+LF)”来标记

HTTP/1.1使用传输编码(Transfer Coding)技术

多部分对象集合包含的对象如下:(RFC2046)

  • multipart/form-data:在web表单文件上传时使用
  • multipart/byteranges:状态码206(Partial Content部分内容)响应报文包含了多个范围的内容时使用 配合请求头如:Content-Type: multipart/form-data 使用 boundary 字符串来划分多部分对象集合指明的各类实体。
范围请求 #

为实现从之前下载中断处恢复下载 指定范围发送的请求叫做范围请求(Range Request) Range: bytes=5001-10000 Range: bytes=5001- Range: bytes=-3000, 5000-7000

成功状态码:206 如果服务端不能处理,返回200及完整实体

内容协商(Content Negotiation) #

内容协商 是 HTTP 协议中的一种机制,它允许服务器根据客户端的请求,提供最适合客户端的资源表示。简单来说,就是同一个资源,可以有多种不同的版本,服务器会根据客户端的请求,选择最适合的版本返回给客户端。

内容协商的应用场景

  • 多语言网站: 根据用户的语言偏好,提供不同语言的页面。
  • 自适应页面: 根据设备的屏幕尺寸和分辨率,提供不同布局的页面。
  • 图片格式优化: 根据客户端支持的图片格式,提供最合适的图片格式(如 JPEG、PNG、WebP)。

当浏览器默认语言为中文或英文,访问相同的URI的Web页面时,则会显示对应的中文或英文的web页面。 客户端和服务端就响应的资源内容进行交涉,然后提供给客户端最为合适的资源。 判断基准:语言、字符集、编码方式等

  • Accept
  • Accept-Language
  • Accept-Charset
  • Accept-Encoding
  • Content-Language

内容协商技术类型

  • 服务器驱动协商(Server-driven):以请求的首部字段为参考,在服务器端自动处理。
  • 客户端驱动协商(Client-driven):服务器在响应中提供多个资源的表示方式,客户端根据这些信息选择自己需要的版本,并发送后续请求。
  • 透明协商(Transparent negotiation):上面两个的结合体,服务器和客户端各自进行内容协商的方法
Response #
状态码类别 #
状态码类别原因短语
1xxInformational接收的请求正在处理
2xxSuccess请求正常处理完毕
3xxRedirection需要进行附加操作以完成请求
4xxClient Error服务器无法处理请求
5xxServer Error服务器处理请求出错
常用状态码 #
状态码描述
200 OK请求被成功处理
204 No Content场景:只需要从客户端往服务器发送消息,而不需要接收新消息情况下使用
206 Partial Content范围请求
301 Moved Permanently永久性重定向;返回Location字段指示新URI;用于版本升级或域名迁移之类的。搜索引擎会将权重从旧 URL 转移到新 URL,因此对于SEO来说非常重。浏览器会缓存重定向,下次请求直接访问新 URL。
302 Found临时性重定向;请求的资源暂时被移到新 URI,但下一次请求仍应使用原 URI。302 会将 POST 请求转换为 GET 请求。
303 See Other请求的响应可以在另一个 URI 中找到,且总是使用 GET 方法获取。类似于302,但明确规定客户端应当采用 GET 方法获取资源
304 Not Modified客户端发送附带条件(If-Match, If-Range, If-Modified-Since)的请求,服务器端判断为改变,返回304(服务器端资源未改变,可直接使用客户端未过期的缓存)不返回主体部分。
307 Temporary Redirect临时重定向;请求的资源暂时被移到新 URI,且后续请求应继续使用原 URI。同302,不改变请求方法
400 Bad Request请求报文存在错误
401 Unauthorized未认证
403 Forbidden不允许访问;
可能未授权文件系统访问
可能是未授权的发送源IP地址
404 Not Found没找到资源
500 Internal Server Error服务器执行请求时发生错误
可能代码bug
可能临时的故障
502 Bad Gateway作为网关或代理服务器时,从上游服务器收到的响应无效。
503 Service Unavailable表明服务器处于超负载或正在进行停机维护,现在无法处理请求。
504 Gateway Timeout作为网关或代理服务器时,未能及时从上游服务器收到响应。

[!Warning] 温馨提示

  • 当301,302,303响应状态码返回时,几乎所有的浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求会自动再次发送。
  • 301,302标准是禁止将POST改成GET方法的,但实际浏览器都实现了改变。
  • 307 会保留原有的请求方法。

通信数据转发程序 #

代理 #

代理是一种有转发功能的应用程序,扮演了服务器和客户端“中间人”的角色 每次通过代理服务器转发请求或响应时,会追加写入Via 首部信息

使用代理服务器的理由:

  1. 利用缓存技术减少网络带宽的流量
  2. 组织内部针对特定网站的访问控制
  3. 获取访问日志

代理分类基准:

  • 是否使用缓存
  • 是否会修改报文

缓存代理(Caching Proxy) 预先将资源的副本保存在代理服务器上

透明代理(Transparent Proxy) 不对报文做任何加工的代理类型被称作透明代理

网关 #

转发其他服务器通信数据的服务器 利用网关可以将HTTP请求转化为其他协议通信 能提高通信的安全性

网关的作用 #
  • 协议转换: 不同网络可能使用不同的协议,网关可以将一种协议的数据包转换为另一种协议的数据包,实现不同网络之间的互通。
  • 数据包过滤: 网关可以根据一定的规则对数据包进行过滤,起到防火墙的作用,保护网络安全。
  • 网络地址转换(NAT): 网关可以将私有网络地址转换为公网地址,实现内网设备访问互联网。
  • 路由选择: 网关可以根据路由表,选择最佳的路径将数据包转发到目标网络。
隧道 #

隧道是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。 确保客户端和服务器能进行安全的通信

Reference #

URI Design And Ownership: https://tools.ietf.org/html/rfc7320 IETF Document: https://datatracker.ietf.org/