HTTP

HTTP 有哪些常见状态码

2xx(成功状态码)

200 OK

请求成功,服务器已成功处理了客户端的请求,并返回了请求的内容。

3xx(重定向状态码)

301 Moved Permanently

被请求的资源已永久移动到新位置,服务器返回这个状态码时,会在响应头的 Location 字段给出资源的新 URL。搜索引擎会更新其索引中的链接。

应用场景:如果一个网站更改了页面的 URL 结构,希望将旧的 URL 永久重定向到新的 URL

302 Found

表示请求的资源临时移动到了新位置。与 301 不同的是,搜索引擎不会更新索引中的链接

304 Not Modified

说明无需再次传输请求的内容,也就是说可以使用缓存的内容

4xx(客户端错误状态码)

400 Bad Request

客户端请求的语法错误,服务器无法理解。

应用场景:例如,客户端发送的请求格式不符合 HTTP 协议规范,或者请求参数有误,像在 URL 中传递了错误格式的参数

401 Unauthorized

请求要求用户的身份认证。对于需要登录才能访问的资源,如果用户未提供有效的认证信息,就会返回这个状态码。

403 Forbidden

服务器理解请求客户端的请求,但是拒绝执行此请求。这通常是因为服务器端的权限设置,导致用户虽然经过身份认证,但仍然没有足够的权限访问该资源。

404 Not Found

服务器找不到请求的资源。这是在网络浏览中最常见的状态码之一。

5xx(服务器错误状态码)

500 Internal Server Error

服务器内部错误,无法完成请求。这是一个比较笼统的服务器端错误状态码。

应用场景:当服务器端的代码出现异常(如程序崩溃、数据库连接错误等),导致无法正常处理请求时,就会返回 500 Internal Server Error。

502 Bad Gateway

作为网关或者代理服务器,从上游服务器接收到无效的响应。

应用场景:在一个复杂的网络架构中,当代理服务器或网关无法从后端服务器获取正确的响应时,例如后端服务器出现故障或者响应格式错误,就会返回 502 Bad Gateway 状态码。

503 Service Unavailable

服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。

应用场景:在网站流量过高导致服务器过载,或者服务器正在进行维护操作时,会返回 503 Service Unavailable 状态码。

504 Geteway Timeout

一般表现为应用层服务 (upstream) 超时,如查库操作耗时十分钟,超过了 Nginx 配置的超时时间


HTTP 状态码 502 和 504 有什么区别

这两种异常状态码都与网关 Gateway 有关,首先明确两个概念

  • Proxy (Gateway),反向代理层或者网关层。在公司级应用中一般使用 Nginx 扮演这个角色
  • Application (upstream serrver),应用层服务,作为 Proxy 层的上游服务。在公司中一般为各种语言编写的服务器应用,如 Go/Java/Python/PHP/Node 等

此时关于 502 与 504 的区别就很显而易见

  • 502 Bad Gateway。一般表现为你自己写的应用层服务(Java/Go/PHP)挂了,网关层无法接收到响应
  • 504 Gateway Timeout。一般表现为应用层服务 (upstream) 超时,如查库操作耗时十分钟,超过了 Nginx 配置的超时时间

HTTP1.1、HTTP2、HTTP3

https://juejin.cn/post/6844903667569541133#帧-Frame

HTTP1.1

HTTP1.1存在的问题

  • 收到上一个http请求的响应之后才能发送下一个http请求
  • tcp链接数限制:对同一个域名,只能建立6-8个tcp链接
  • 建立每个tcp链接都需要经过dns解析,三次握手,tls握手,慢启动(开始时只发送较少数据)这些过程
  • 队头阻塞:前一个请求挂了,后面请求无法发送
  • 首部没有压缩,重复内容发送多次(cookie)

为什么HTTP1.1无法并发的发送多个请求?(同时发多个,同时收多个)

因为http1.1是基于文本的协议,比如客户端向服务器发送了两个请求 GET /query?q=AGET /query?q=B,服务器返回了两个结果,客户端是没有办法根据响应结果来判断响应对应于哪一个请求的,而http2基于二进制分帧实现多路复用,数据流以消息的形式发送,而消息又由一个或多个帧组成,多个帧之间可以乱序发送,因为根据帧首部的流标识可以重新组装。

HTTP 1.1 中的 keep-alive 有什么作用

http 1.1 中,在响应头中设置 keep-alive 可以在一个 TCP 连接上发送多个 http 请求

  1. 避免了重开 TCP 连接的开销
  2. 避免了刷新时重新建立 SSL 连接的开销
  3. 避免了QPS过大时,服务器的连接数过大

在服务器端使用响应头开启 keep-alive

1
2
Connection: Keep-Alive
Keep-Alive: timeout=5, max=1000

HTTP2

关于 http2 可以阅读谷歌 web.dev 的文档 Introduction to HTTP/2

关于 HTTP2 有以下改进

二进制分帧

  • 帧和流:把请求和响应分成一个个二进制帧(首部帧,数据帧),一个完整的请求和响应是一个流每一个帧都有一个stream id,标识每一个帧属于哪个流
  • 复用同一个tcp链接,并发的发送一个个二进制帧,在接收方再进行重组
  • 同一域名只需要一个tcp链接

多路复用 (Stream/Frame)

  • 并发的发送一个个二进制帧

头部压缩: (HPack)

  • 头部压缩算法压缩首部内容
  • 客户端浏览器都保存一张HPACK表,

服务端推送: (Server Push)

  • 不同于http1.1解析完html才请求资源,服务端提前返回这些资源文件

HTTP2中可以弃用哪些针对HTTP1.1的优化点

合并文件、内联资源、雪碧图、域名分片对于 HTTP/2 来说是不必要的,使用 h2 尽可能将资源细粒化,文件分解地尽可能散,不用担心请求数多

HTTP3

HTTP3解决的问题:

  • HTTP2虽然实现了多路复用,但仍基于TCP,一个TCP包丢失,整个链接上的所有流都被阻塞,直到该包被重新传输
  • tcp和tls握手时延问题

HTTP Proxy原理

webpack-dev-server 中proxy原理,以及如何解决跨域
本质上是因为服务端不存在跨域的问题,跨域是浏览器的限制

Proxy的原理
代理服务器会自动提取请求数据包中的HTTP请求数据发送给服务端,并服务端的HTTP响应数据转发给发送请求的客户端,HTTP代理服务器使用的端口通常是8080。

  • 对于Web客户端来说,代理扮演的服务器角色,接收请求(Request),返回响应(Response)。
  • 对于Web服务器来说,代理扮演的客户端角色,发送请求(Request),接收响应(Response)。

简单请求和非简单请求

什么情况下会发送 OPTIONS 请求

当一个请求跨域且不是简单请求时就会发送 OPTIONS 请求

满足以下条件就是一个简单请求:

  1. Method: 请求的方法是 GETPOSTHEAD
  2. Header: 请求头是 Content-TypeAccept-LanguageContent-Language
  3. Content-Type: 请求类型是 application/x-www-form-urlencodedmultipart/form-datatext/plain

而在项目中常见的 Content-Type: application/jsonAuthorization: <token> 为典型的非简单请求,在发送请求时往往会带上 Options

更详细内容请参考 CORS - MDN