HTTP 是什么?
HTTP 是超文本传输协议,也就是HyperText Transfer Protocol。
如何来理解
拆分成三个词:超文本、传输、协议
协议
http 协议一个用在计算机世界里的协议。它使用计算机能够理解的语言确立了一种计算机之间交流通信的规范(两个以上的参与者),以及相关的各种控制和错误处理方式(行为约定和规范)。传输
传输字面意思就是把一堆东西从 A 点搬到 B 点,或者从 B 点 搬到 A 点。
再加上 http 协议是一个双向协议。
那就可以这样理解, HTTP 是一个在计算机世界里专门用来在两点之间传输数据的约定和规范超文本
在互联网早期的时候只是简单的字符文字,这些被称为文本,但现在文本的涵义已经可以扩展为图片、视频、压缩包等,在 HTTP 眼里这些都算作文本
超文本就是超越了普通文本的文本,它是文字、图片、视频等的混合体总结
HTTP 是一个在计算机世界里专门在 两点 之间 传输 文字、图片、音频、视频等 超文本 数据的 约定和规范
HTTP 状态码
常见的有:200(成功)、302(重定向)、304(看下方的 HTTP 缓存)、403(无权限)、404(无资源)、500(服务器内部错误)、503(系统超载)、504(网关超时)
GET 和 POST 有什么区别?
请求参数
GET:通常在URL上携带,只能为ASCII,且浏览器对URL的长度有限制
POST:报文 body,只要双方协商好,格式没要求,大小可设置,基本无限制遵循模式规则的话
GET 是只读操作,POST 是新增或提交数据操作- 安全性
GET 方法就是安全且幂等的,因为它是「只读」操作,无论操作多少次,服务器上的数据都是安全的,且每次的结果都是相同的。所以,可以对 GET 请求的数据做缓存,这个缓存可以做到浏览器本身上(彻底避免浏览器发请求),也可以做到代理上(如nginx),而且在浏览器中 GET 请求可以保存为书签。 - POST 因为是「新增或提交数据」的操作,会修改服务器上的资源,所以是不安全的,且多次提交数据就会创建多个资源,所以不是幂等的。所以,浏览器一般不会缓存 POST 请求,也不能把 POST 请求保存为书签。
- 安全性
HTTP 缓存
- 强制缓存
强缓存指的是只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存,决定是否使用缓存的主动性在于浏览器这边
所以很多框架有种功能,在css等文件链接的后面加上时间戳,方便调试的时候不生效 - 协商缓存
协商缓存是与服务端协商之后,通过协商结果(304)来判断是否使用本地缓存
HTTP 优点
- 简单
HTTP 基本的报文格式就是 header + body,头部信息也是 key-value 简单文本的形式,易于理解 - 灵活和易于扩展
HTTP 协议里的各类请求方法、URI/URL、状态码、头字段等每个组成要求都没有被固定死,都允许开发人员自定义和扩充 - 应用广泛和跨平台
字面意思,无论台式机的浏览器到手机上的各种 APP,从看新闻、刷贴吧到购物、理财、吃鸡,HTTP 的应用遍地开花
HTTP 缺点
- 无状态
每一次请求都是单独的,需要使用COOKIE 来确定用户等 - 明文传输
不加密,谁都可以查看 - 不安全
通信使用明文(不加密),内容可能会被窃听。比如,账号信息容易泄漏,那你号没了。
不验证通信方的身份,因此有可能遭遇伪装。比如,访问假的淘宝、拼多多,那你钱没了。
无法证明报文的完整性,所以有可能已遭篡改。比如,网页上植入垃圾广告,视觉污染,眼没了。
HTTP 与 HTTPS 有哪些区别
- HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。
- HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。
- 两者的默认端口不一样,HTTP 默认端口号是 80,HTTPS 默认端口号是 443。
- HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。
- 这个涉及到了加密,其实https设计使用到了对称加密和非对称加密两种
- 还有握手过程中,https 比 http多了 TLS 的握手过程;
HTTPS 解决了 HTTP 的哪些问题
- 窃听风险
比如通信链路上可以获取通信内容,用户号容易没。 - 篡改风险
比如强制植入垃圾广告,视觉污染,用户眼容易瞎。 - 冒充风险
比如冒充淘宝网站,用户钱容易没。
HTTP 怎么优化
目的是为了提升速度,原则上来说,用户点击一次页面,会有几十条http请求,且不包括服务器之间的互相请求调用,关键是每次请求的握手和挥手很慢
所以为了提升速度需要减少请求次数
- 避免发送请求
可以看上面的 HTTP 缓存,浏览器缓存了即不用请求 - 减少请求次数
1.减少重定向请求次数
302 还一直访问,浪费服务器资源,重定向的工作交由代理服务器完成,就能减少 HTTP 请求次数了
2.合并请求
多个访问小文件的请求合并成一个大的请求,例如一个图片里很有很多小图片,浏览器css自动切割
3.延迟发送请求
永远只展示用户当前看的,不用全部加载完,例如:无限下滑
4.压缩
虽然建立连接是最浪费时间的,但是传输也需要,所以传输的数据包被压缩小,也可以提升速度
HTTP 和 RPC
HTTP 协议(Hyper Text Transfer Protocol),又叫做超文本传输协议
RPC(Remote Procedure Call),又叫做远程过程调用。它本身并不是一个具体的协议,而是一种调用方式
B(Browser)浏览器,C =(Client)客户端 S(Server)服务端
HTTP 主要用于 B/S 架构,而 RPC 更多用于 C/S 架构。但现在其实已经没分那么清了,B/S 和 C/S 在慢慢融合。很多软件同时支持多端,比如某度云盘,既要支持网页版,还要支持手机端和 PC 端
- 有什么区别
因为跟rpc的高定制化比较,http的header信息等太多太繁琐,浪费性能
但是上述说的都是http1,http2有优化,比rpc更好 - 历史
rpc比http1提出的时间更早,更别说htpp2老系统还会使用rpc
HTTP 和 WebSocket
http是半双工,WebSocket是全双工
基础原理就不说了,太多
WebSocket 是为了双方都可以发送数据,因为有很多场景需要,例如客服系统、客户端弹出提示等