Review
- 2020/04/09
- 2021/02/04
- 2024-09-28 10:34
[!Summary] Books 《图解HTTP》
HTTP(HyperText Transfer Protocol)超文本传输协议,无状态协议(stateless)
一、Introduction #
万维网(WWW)构建技术 #
- HTTP
- HTML
- URL(Uniform Resource Locator, 统一资源定位符)
万维网可简单理解为通过浏览器来浏览内容的技术集合。
HTTP发展史 #
HTTP/0.91990年问世HTTP/1.01996年5月,RFC1945HTTP/1.11997年1月,RFC2068,RFC2616(最新版本),2014/7月 ,HTTP/1.1更新,RFC7320HTTP/2.02015, RFC7540, RFC 7541HTTP/3.02019, 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协议族
- 应用层 FTP, DNS, HTTP
- 传输层 TCP, UDP
- 网络层 IP
- 链路层
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连接的重复建立和断开所造成的额外开销。
优点:
- 减轻了服务器端的负载
- 加快了页面资源的获取速度
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页面。 客户端和服务端就响应的资源内容进行交涉,然后提供给客户端最为合适的资源。 判断基准:语言、字符集、编码方式等
AcceptAccept-LanguageAccept-CharsetAccept-EncodingContent-Language
内容协商技术类型
- 服务器驱动协商(Server-driven):以请求的首部字段为参考,在服务器端自动处理。
- 客户端驱动协商(Client-driven):服务器在响应中提供多个资源的表示方式,客户端根据这些信息选择自己需要的版本,并发送后续请求。
- 透明协商(Transparent negotiation):上面两个的结合体,服务器和客户端各自进行内容协商的方法
Response #
状态码类别 #
| 状态码 | 类别 | 原因短语 |
|---|---|---|
| 1xx | Informational | 接收的请求正在处理 |
| 2xx | Success | 请求正常处理完毕 |
| 3xx | Redirection | 需要进行附加操作以完成请求 |
| 4xx | Client Error | 服务器无法处理请求 |
| 5xx | Server 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 首部信息
使用代理服务器的理由:
- 利用缓存技术减少网络带宽的流量
- 组织内部针对特定网站的访问控制
- 获取访问日志
代理分类基准:
- 是否使用缓存
- 是否会修改报文
缓存代理(Caching Proxy) 预先将资源的副本保存在代理服务器上
透明代理(Transparent Proxy) 不对报文做任何加工的代理类型被称作透明代理
网关 #
转发其他服务器通信数据的服务器 利用网关可以将HTTP请求转化为其他协议通信 能提高通信的安全性
网关的作用 #
- 协议转换: 不同网络可能使用不同的协议,网关可以将一种协议的数据包转换为另一种协议的数据包,实现不同网络之间的互通。
- 数据包过滤: 网关可以根据一定的规则对数据包进行过滤,起到防火墙的作用,保护网络安全。
- 网络地址转换(NAT): 网关可以将私有网络地址转换为公网地址,实现内网设备访问互联网。
- 路由选择: 网关可以根据路由表,选择最佳的路径将数据包转发到目标网络。
隧道 #
隧道是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。 确保客户端和服务器能进行安全的通信
Reference #
URI Design And Ownership: https://tools.ietf.org/html/rfc7320 IETF Document: https://datatracker.ietf.org/