跳转至

HTTP

HTTP/1.0 是无状态协议。 HTTP/1.1 和 HTTP/2 是有状态协议。 HTTP/1.x/2.0 都是基于 TCP 的。 HTTP/3 是基于 QUIC 协议的,而 QUIC 协议是基于 UDP 协议的。UDP 是无连接的,无状态的协议,因此 HTTP/3 也是无状态协议。 https://zhuanlan.zhihu.com/p/45173862

1 HTTP(HyperText-Transfer-Protocol)

1.1 HTTP 协议格式

HTTP 的请求和响应的消息协议是一样的,分为三个部分,起始行消息头消息体。这三个部分以 CRLF 作为分隔符。最后一个消息头有两个 CRLF,用来表示消息头部的结束。 1. HTTP 请求的起始行称为请求行,形如 GET /index.html HTTP/1.1 2. HTTP 响应的起始行称为状态行,形如 200 ok 3. 消息头部有很多键值对组成,多个键值对之间使用 CRLF 作为分隔符,也可以完全没有键值对。形如 Content-Encoding: gzip 4. 消息体是一个字符串,字符串的长度是由消息头部的 Content-Length 键指定的。

客户端报文示例:

GET /hello.txt HTTP/1.1
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi

服务端响应报文示例:

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain
GET、HEAD请求没有消息体,POST、PUT请求有消息体

1.2 http 状态码

状态码 状态码英文名称 中文描述
200 OK 请求成功。一般用于 GET 与 POST 请求
301 Moved Permanently 永久性重定向。请求的资源已被永久的移动到新 URI,返回信息会包括新的 URI,浏览器会自动定向到新 URI。今后任何新的请求都应使用新的 URI 代替
302 Found 临时性重定向。与 301 类似。但资源只是临时被移动。客户端应继续使用原有 URI
304 Not Modified 极少人知道这个错误,因为大部分后端开发者的前端 Javascript 开发经验都严重不足。当你用 Chrome 打开一个经常访问的网站,看看 Network 传输的静态资源就可以看到很多 304 状态码。它表示该资源被浏览器缓存了不需要重新请求服务器。
400 Bad Request 用于参数验证,少了一个参数或者参数类型错误之类的。
401 Unauthorized 权限不足,这个很好理解,就是资源存在但是不让你访问。
403 Forbidden 资源禁止访问,如果你的 IP 列为黑名单了,就会发生这种错误。
404 Not Found 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置 " 您所请求的资源无法找到 " 的个性页面。也可以在服务器拒绝请求且不想说明理由时使用
500 Internal Server Errorv 服务器内部错误,无法完成请求,也可能是 web 应用存在 bug 或某些临时故障
502 Bad Gateway 后端服务挂掉或者压力过大的时候, Nginx 接到的请求无法及时传递给后端的服务进行处理,这个时候就会出现 502 错误。这个也非常常见,知乎豆瓣网站经常开小差的时候发生的错误就是这个。

参考 https://juejin.cn/post/6844904202863394830

1.3 HTTP 请求方法

1.3.1 GET

  1. GET 是最常用的方法。通常用于请求服务器发送某个资源

1.3.2 HEAD

类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头

1.3.3 POST

POST 方法起初是用来向服务器输入数据的。实际上,通常会用它来支持 HTML 的表单。表单中填好的数据通常会被送给服务器,然后由服务器将其发送到它要去的地方 (比如,送到一个服务器网关程序中,然后由这个程序对其进行处理)。

1.3.4 PUT

从客户端向服务器传送的数据取代指定的文档的内容。与 GET 从服务器读取文档相反,PUT 方法会向服务器写入文档。有些发布系统允许用户创建 Web 页面,并用 PUT 直接将其安装到 Web 服务器上去。

2 HTTP1.1

https://zhuanlan.zhihu.com/p/51185862

3 HTTP2.0

HTTP/2.0 是 HTTP 协议的第二个版本,它的主要目标是改进传输性能,实现低延迟和高吞吐量。 HTTP/2.0 的特点有: - HTTP/2.0 使用二进制协议,而不是文本协议。 - HTTP/2.0 支持多路复用,可以同时发送多个请求和响应。 - HTTP/2.0 使用头部压缩技术,可以减少网络带宽的使用。 - HTTP/2.0 支持服务器推送,可以在客户端请求之前向客户端推送资源。

4 HTTP3.0

  • HTTP/3.0 使用 QUIC 协议作为传输层协议,而不是 TCP。
  • HTTP/3.0 使用了基于 UDP 的 QUIC 协议,可以减少网络延迟和提高网络吞吐量。
  • HTTP/3.0 支持多路复用,可以同时发送多个请求和响应。
  • HTTP/3.0 支持 0-RTT 连接,可以在客户端和服务器之间建立更快的连接。

5 HTTPS

HTTPS 协议(HyperText Transfer Protocol over Secure Socket Layer),可以理解为 HTTP+SSL/TLS,即 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL,用于安全的 HTTP 数据传输。

6 HTTP 各版本对比

6.1 HTTP1.1 和 HTTP1.0 对比

  1. 连接方式:HTTP1.0 默认使用短连接,每次请求都需要建立新的 TCP 连接,连接不能复用;而 HTTP1.1 支持持久连接 和请求的流水线处理,在一个 TCP 连接上可以传送多个 HTTP 请求和响应,减少建立和关闭 TCP 连接的消耗和延迟,提高效率。
  2. 缓存处理:HTTP1.0 主要使用 header 里的 If-Modified-Since、Expires 来做为缓存判断的标准,HTTP1.1 则引入了更多的缓存控制策略例如 Entity tag、If-Unmodified-Since、If-Match、If-None-Match 等更多可供选择的缓存头来控制缓存策略。
  3. 错误处理:HTTP1.0 只有响应码,没有状态码;而 HTTP1.1 则引入了状态码,使得错误处理更加规范化。
  4. Host 头处理:HTTP1.0 中认为每台服务器都绑定一个唯一的 IP 地址,因此请求消息中的 URL 并没有传递主机名(hostname),但随着虚拟主机技术的发展,使得一台物理服务器可以承载多个主机名和多个网站,这时就需要在 HTTP 请求头中提供 Host 字段来明确指出请求的对象是哪个主机名。
  5. 其他特点:HTTP1.1 还支持分块传输编码、支持断点续传、支持管道化处理等

6.2 HTTP2.0 对比 HTTP1.1

  1. 二进制分帧:HTTP2.0 采用二进制格式传输数据,而非 HTTP1.x 的文本格式,这样可以更加高效地解析和传输数据。
  2. 多路复用:HTTP2.0 支持多路复用,即在一个 TCP 连接上可以同时传输多个请求和响应,避免了 HTTP1.x 中的队头阻塞问题,提高了并发性能。
  3. 首部压缩:HTTP2.0 使用 HPACK 算法对首部进行压缩,减少了首部大小,降低了网络延迟。
  4. 服务器推送:HTTP2.0 支持服务器推送,即服务器可以在客户端请求之前将客户端需要的资源推送给客户端,提高了性能。
  5. 其他特点:HTTP2.0 还支持流量控制、优先级设置、服务器端推送等。

6.3 HTTP3.0 对比 TTP2.0

  1. 传输协议:HTTP3.0 使用 QUIC 协议作为传输协议,而 HTTP2.0 使用 TCP 协议。
  2. 二进制分帧:HTTP3.0 采用二进制格式传输数据,与 HTTP2.0 相同。
  3. 多路复用:HTTP3.0 支持多路复用,与 HTTP2.0 相同。
  4. 首部压缩:HTTP3.0 使用 QPACK 算法对首部进行压缩,与 HTTP2.0 相同。
  5. 服务器推送:HTTP3.0 支持服务器推送,与 HTTP2.0 相同。
  6. 其他特点:HTTP3.0 还支持零 RTT 连接、连接迁移、拥塞控制等。

7 Session、Cookie、Token

Session、Cookie、Token 都是用于身份验证的技术,但它们之间有一些区别。 - Cookie 是存储在客户端的文本文件,其中包含有关用户的信息。当用户访问网站时,服务器会读取 cookie 并使用其中的信息来识别用户。由于 cookie 存储在客户端,因此它们可以在多个页面之间共享,并且可以在浏览器关闭后保留。 - Session 是存储在服务器上的数据结构,用于存储有关用户的信息。当用户访问网站时,服务器会创建一个新的 session,并将其与该用户相关联。服务器会将 session ID 发送到客户端,客户端将其存储在 cookie 中。在每个请求中,客户端都会将 session ID 发送回服务器以进行身份验证。 - Token 是一种无状态的身份验证机制,它不需要存储在服务器上。它通常是一个字符串,由服务器生成并发送给客户端。客户端将 token 存储在本地,并在每个请求中将其发送回服务器以进行身份验证。

这些技术都有自己的优缺点,具体使用哪种技术取决于应用程序的需求和安全性要求。如果需要在 多个页面之间共享数据,则应使用 cookie。如果 需要更高的安全性,则应使用 session

8 X-Forwarded-For

X-Forwarded-For 是一个 HTTP 扩展头部,最开始是由 Squid 这个缓存代理软件引入,用来表示 HTTP 请求端真实 IP。如今它已经成为事实上的标准,被各大 HTTP 代理、负载均衡等转发服务广泛使用,并被写入 RFC 7239(Forwarded HTTP Extension)标准之中。