HTTP与常用状态码
各大版本的区别
HTTP 1.0
- 缓存头 主要用Expires
- 每次请求都要建立tcp链接
HTTP 1.1
- 缓存头 新增 Cache Control、Etag等
- 新增断点续传功能: 206(Partial Content);请求头range头
- 支持长连接并默认开启,Connection: keep-alive,一个TCP传递多个HTTP请求和响应;
缺点:
- 单个 TCP 连接在同一时刻只能处理一个请求;开启Pipelining功能后可以在一个连接中发送多个请求,但必须是有序的;
- 连接数过多。我们假设Apache设置了最大并发数为300,因为浏览器限制,浏览器对同域名发起的tcp的最大请求数为6,也就是服务器能承载的最高并发为50,当第51个人访问时,就需要等待前面某个请求处理完成。
HTTP 2.0
- 支持以二进制分帧的形式进行传递
- 多路复用(每个TCP连接上有多个request, 可以混杂在一起,不同的request会有不同的id,便于服务器端识别; 同域名下的多个请求可复用在同一个tcp连接上面)
- 使用encoder进行header压缩
- 服务端推送
状态码
1 表示消息 2 表示成功 3 表示重定向 4 表示请求错误 5 表示服务器错误
1xx
101 服务器基于客户端来切换协议,实际应用: 交易所的ws连接传输内容
2xx
200 ok
204 成功但未返回内容
206 成功处理部分请求; 实际应用: 1.大文件下载的断点续传 2.视频播放/传输
有个重要的点是 响应头会有 Content-Range: bytes 500-999999/2000000
标识(可以随意打开一个b站视频看network,它就是基于这个实现的)
3xx
301 永久移动
302 临时移动 (302 Found 资源存在但改变了位置)
304 Not Modified (协商缓存用)
307 (307 Temporary Redirect 307 Internal Redirect; 前者是标准状态码,后者是非标的应该是Nginx那层做重定向时候加的; 307是基于302状态码增加: 不允许重定向POST到GET)
303(允许任意请求到 GET 的重定向,由于浏览器对302滥用重定向,所以规范用303来支持了这一点)
308状态码(它是基于301状态码增加: 不允许浏览器将原本为 POST 的请求重定向到 GET 请求上)
如何重定向: 基于响应头的Header 的 Location 字段
状态码 | 释义 | 能不能被浏览器改变请求方法 | SEO影响 | HTTP协议版本 |
---|---|---|---|---|
301 | 原资源不可访问,永久移动到新URI | 能改变 | 抓取新内容,保存新网址 | HTTP1.0 |
302 | 旧资源还在,暂时访问新的URI | 能改变 (通常POST 到 GET) | 抓取新内容,保存旧网址 | HTTP1.0 |
307 | 同302; | 不能改变 | 同302; | HTTP1.1 |
实例: HTTP重定向到HTTPS这个环节, 谷歌、淘宝、知乎等都使用了307重定向;
知乎专栏的307重定向 (307 Internal Redirect)
谷歌首页的307重定向 (307 Internal Redirect)
4xx
400 客户端请求错误
401 未认证
403 禁止访问,比如外网访问内网域名
404 找不到
5xx
500 服务器错误
502 网关错误
503 服务不可用, 通常是服务挂了
504 网关超时
相关文章
https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/14#issuecomment-465547222
https://juejin.cn/post/6844903489596833800#comment 1 1.1 和 2 区别
https://zhuanlan.zhihu.com/p/61423830 你猜一个 TCP 连接上面能发多少个 HTTP 请求
https://zhuanlan.zhihu.com/p/43789231 彻底搞懂HTTPS的加密原理
https://zhuanlan.zhihu.com/p/128000072 万字长文,一文搞懂TCP、IP和HTTP、HTTPS
https://github.com/febobo/web-interview/issues/144 面试官:说说HTTP 常见的状态码有哪些,适用场景?
https://zhuanlan.zhihu.com/p/60669395 HTTP 中的 301、302、303、307、308 响应状态码