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=A
和 GET /query?q=B
,服务器返回了两个结果,客户端是没有办法根据响应结果来判断响应对应于哪一个请求的,而http2基于二进制分帧实现多路复用,数据流以消息的形式发送,而消息又由一个或多个帧组成,多个帧之间可以乱序发送,因为根据帧首部的流标识可以重新组装。
HTTP 1.1 中的 keep-alive 有什么作用
在
http 1.1
中,在响应头中设置keep-alive
可以在一个 TCP 连接上发送多个 http 请求
- 避免了重开 TCP 连接的开销
- 避免了刷新时重新建立 SSL 连接的开销
- 避免了QPS过大时,服务器的连接数过大
在服务器端使用响应头开启 keep-alive
1 | Connection: Keep-Alive |
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
请求
满足以下条件就是一个简单请求:
Method
: 请求的方法是GET
、POST
及HEAD
Header
: 请求头是Content-Type
、Accept-Language
、Content-Language
等Content-Type
: 请求类型是application/x-www-form-urlencoded
、multipart/form-data
或text/plain
而在项目中常见的 Content-Type: application/json
及 Authorization: <token>
为典型的非简单请求,在发送请求时往往会带上 Options
更详细内容请参考 CORS - MDN