一、HTTP基本概念
1、HTTP是什么
HTTP 是超文本传输协议(HyperText Transfer Protocol),基于TCP。
- 超文本:用超链接的方法,将各种不同空间的文字信息组织在一起的网状文本。(它就是超越了普通文本的文本,它是文字、图片、视频等的混合体,最关键有超链接,能从一个超文本跳转到另外一个超文本)
- 传输:(就是把一堆东西从 A 点搬到 B 点,或者从 B 点 搬到 A 点)
- 协议:是通信计算机双方必须共同遵守的一组约定(约定俗成的东西)。如怎么样建立连接、怎么样互相识别等。
2、HTTP常见状态码
一些常见状态码和相关的短语:
- 200 OK:请求成功,信息在返回的响应报文中。
- 301 Moved Permanently:请求的对象已经被永久转移了,新的URL定义在响应报文的Location:首部行中。客户软件将自动获取新的URL。
- 302 Found:表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。(301 和 302 都会在响应头里使用字段 Location,指明后续要跳转的 URL,浏览器会自动重定向新的 URL)
- 400 Bad Request:一个通用差错代码,客户端请求有误,该请求不能被服务器理解。
- 403 Forbidden:服务器禁止访问资源,并不是客户端的请求出错。
- 404 Not Found:被请求的文档不在服务器上。
- 505 HTTP Version Not Supported:服务器不支持请求报文使用的HTTP协议版本。
状态码分类:
| A | B |
|---|---|
| 1×× | 提示信息,表示目前是协议处理的中间状态,还需要后续操作 |
| 2×× | 成功,报文已经收到收到并被正确处理 |
| 3×× | 重定向,资源位置发生变动,需要客户端重新发送请求 |
| 4×× | 客户端错误,请求包含语法错误或无法完成请求 |
| 5×× | 服务器错误,服务器在处理请求的过程中发生了错误 |
二、Get与Post
1、GET和POST区别
GET 和 POST 本质上就是 TCP 链接,并无差别。但是由于 HTTP 的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
| 区别 | GET | POST |
|---|---|---|
| 数据传输方式 | 从服务器获取数据 | 向服务器提交数据 |
| 对数据长度的限制 | 当发送数据时,GET方法向URL添加数据;URL的长度是受限制的(URL的最大长度是2048个字符) | 无限制 |
| 对数据类型的限制 | 只允许ASCII字符 | 无限制 |
| 安全性 | 较差,所发送的数据是URL的一部分,会显示在网页上 | 较好,参数不会被保存在浏览器历史或web服务器日志中 |
| 可见性 | 显示在URL上 | 不显示 |
| 收藏为书签 | 可以 | 不可以 |
| 历史记录 | 可以被保留在历史记录当中 | 不可以被保留 |
| 缓存 | 能被缓存 | 不可以被缓存 |
根据 RFC 规范,GET 的语义是从服务器获取指定的资源,这个资源可以是静态的文本、页面、图片视频等。GET 请求的参数位置一般是写在 URL 中,URL 规定只能支持 ASCII,所以 GET 请求的参数只允许 ASCII 字符 ,而且浏览器会对 URL 的长度有限制(HTTP协议本身对 URL长度并没有做任何规定)。
比如,你打开一篇文章,浏览器就会发送 GET 请求给服务器,服务器就会返回文章的所有文字及资源。
根据 RFC 规范,POST 的语义是根据请求负荷(报文body)对指定的资源做出处理,具体的处理方式视资源类型而不同。POST 请求携带数据的位置一般是写在报文 body 中,body 中的数据可以是任意格式的数据,只要客户端与服务端协商好即可,而且浏览器不会对 body 大小做限制。
比如,你在一篇文章底部,敲入了留言后点击「提交」,浏览器就会执行一次 POST 请求,把你的留言文字放进了报文 body 里,然后拼接好 POST 请求头,通过 TCP 协议发送给服务器。
2、GET和POST方法都是安全和幂等的吗?
3、Get方法参数有大小限制吗
一般HTTP协议里并不限制参数大小限制。但一般由于get请求是直接附加到地址栏里面的,由于浏览器地址栏有长度限制,因此使GET请求在浏览器实现层面上看会有长度限制。
三、HTTP特性
四、HTTP缓存技术
五、HTTP/1.1、HTTP/2、HTTP/3 演变
1、HTTP/1.0 和 HTTP/1.1
- 连接方式:HTTP/1.0 为短连接,HTTP/1.1 支持长连接。
- 状态响应码:HTTP/1.1 中新加入了大量的状态码,光是错误响应状态码就新增了 24 种。比如说,100,206,409,410。
- 缓存机制:在 HTTP/1.0 中主要使用 Header 里的 If-Modified-Since,Expires 来做为缓存判断的标准,HTTP/1.1 则引入了更多的缓存控制策略例如 Entity tag,If-Unmodified-Since, If-Match, If-None-Match 等更多可供选择的缓存头来控制缓存策略。
- 带宽:HTTP/1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP/1.1 则在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
- Host 头(Host Header)处理:HTTP/1.1 引入了 Host 头字段,允许在同一 IP 地址上托管多个域名,从而支持虚拟主机的功能。而 HTTP/1.0 没有 Host 头字段,无法实现虚拟主机。