从HTTP 0.9到3.0版本特征

91 阅读6分钟

今天学习的内容有点硬核,但特别重要!如果你正在学前端,或者对网络通信有一点点好奇,这篇文章一定能帮你把今天学的HTTP协议和GET/POST的区别理得明明白白。

一、HTTP的优缺点:

优点

  • 灵活可扩展:语法上只规定了基本格式,空格区分单词,换行区分字段,同时支持css、js、图片、视频等任意数据的传输
  • 请求响应模式:客户端发送请求->服务端处理客户端请求->服务器返回响应,这种请求响应模式非常的直观
  • 广泛支持和跨平台:几乎所有的操作系统、编程语言、浏览器等都内置了http的支持,http基于tcp/ip,使得不同的平台和设备间的通信变得简单

缺点

  • 无状态:虽然无状态有利于服务器扩展,但当构建有状态的web应用时(如用户登录),需要额外机制(如cookie、sessionid等),增加了开发的复杂度和请求的数据
  • 明文传输:http默认是明文传输的,请求、响应以及头部信息再网络上都是可见的,容易被攻击者窃听、篡改、冒充
  • 队头阻塞:http开启长连接,多个请求可以共用一个连接,但响应必须按顺序返回,当一个请求时间过长,后续请求会处于阻塞状态

二、HTTP版本的进化:都是为了“更快”!

你有没有想过,为什么我们打开网页有时候快有时候慢?除了网速,其实背后还有一个很重要的角色:HTTP协议。它就像是浏览器和服务器之间沟通的“语言”,不同版本的HTTP,沟通效率完全不同。

1. HTTP 0.9:最原始的版本

最早的HTTP版本是0.9,它非常简陋:

  • 只支持GET请求
  • 响应式只能是HTML文本,连css、js、图片以及视频都不能传
  • 没有请求头(header),也就是你无法设置Content-Type来告诉服务器你需要的数据类型

2. HTTP 1.0

随着网页越来越复杂,0.9不够用了,于是1.0来了:

  • 引入header,可以设置Content-Type告诉服务器你想要的数据类型
  • 引入了cookie,但仍然是无状态的
  • 每次请求都需要建立新的TCP连接,用完就断(十分消耗资源)

3. HTTP 1.1:终于可以“保持通话”了!

用户越来越多,每次建立连接太浪费了,于是1.1来了个大升级:

长连接(Keep-Alive)

一个TCP连接可以处理多个请求,不用每次都重新建连接。比如你打开一个网页,HTML、CSS、JS、图片都可以通过同一个连接连续请求,大大节省时间。

管道化(Pipelining)

你可以一次性发多个请求,不用等上一个响应回来。但服务器必须按顺序返回响应。

这就好比你去超市买东西,你把购物清单一次性递给收银员,但她必须按顺序扫码结账。如果第一个商品扫得很慢,后面的就得等着——这就是队头阻塞

数据分块传输(Chunk)

大数据可以分成一块一块地传,不用等全部准备好再发。

由于队头阻塞,这里还衍生了一个问题,怎么优化网络速度?

怎么优化网页加载速度?

既然1.1还有队头阻塞的问题,我们就得想办法优化:

  • 路由懒加载:比如用React/Vue的时候,不同页面拆成不同JS文件,用到再加载;
  • 合并文件:把多个CSS或JS合并成一个,减少请求次数;
  • Base64图片:把小图片转成Base64字符串直接写在HTML或CSS里,减少请求;
  • 图标字体库(如Iconfont):用字体代替图片,一个文件多个图标;
  • 开启压缩:服务器压缩文件再发过来;
  • 域名分片(Domain Sharding) :把资源放在不同子域名下,突破浏览器对同一域名并发请求数的限制(一般是6个);
  • 浏览器缓存:强缓存和协商缓存,减少重复请求。

4. HTTP 2.0:真正的“多车道”高速路!

2.0解决了1.1的队头阻塞问题:

并发、多路复用

一个TCP连接上可以并发多个请求,多路复用把数据拆成数据帧交错传输,请求和响应并行独立,不会阻塞

二进制帧

请求和响应数据拆成了二进制数据帧,通过一个连接并发传输,每个数据帧都有编号,指定是哪个文件,客户端和服务器可以根据编号,将数据重组,无需排队,谁先准备好就先发送谁

头部压缩

重复的header不再每次都传,节省带宽。

服务器推送

服务器可以主动推送资源。比如你请求首页,服务器顺便把CSS和JS也推给你,减少等待时间。

5. HTTP 3.0:告别TCP,拥抱UDP!

3.0直接换掉了传输层协议,用QUIC协议基于UDP实现,更轻量、更快、更抗丢包。

三、GET 和 POS的区别

用途

  • GET常用于获取数据
  • POST常用于来提交数据

安全

  • GET请求的参数通常在URL中明文传输
  • POST请求的参数则在请求体中相对安全
  • 但是在抓包的情况下,都是一致的

缓存

  • GET请求后浏览器会主动缓存,GET请求可以被收藏为书签
  • POST请求则不被缓存,不能设置为书签

长度限制

  • GET请求受URL长度限制,最大为2048个字节,也就是2kb
  • POST请求理论上是无长度限制的

幂等性

  • 即发送一次和多次请求,对服务器状态的改变效果是完全一样的。
  • GET请求是幂等的
  • POST请求非幂等的,可能会创建新的资源

发送包数量

  • GET请求会一次性发送请求数据包
  • POST请求会先发送请求头数据包,当收到服务器响应的100,再发送请求头数据包

四、HTTPS:HTTP的安全升级版

HTTPS = HTTP + SSL/TLS

  • 通过非对称加密和对称加密结合的方式加密数据传输;
  • 需要身份验证,防止中间人攻击;
  • 建立安全通道,保证数据不被窃取或篡改。

对称加密: 简单来说,数据的加密和解码都用得是同一个密钥,服务器会把密钥发送给浏览器,但是这就存在一个问题,公钥会被黑客截获,之后他也可以解密我们的数据

非对称加密: 简单来说,服务器有一对密钥,一个是私钥,一个是公钥,将公钥发送给浏览器,浏览器用公钥加密的数据,只能用服务器的私钥来解密,但是私钥只存在服务器,私钥加密的数据只能由对应的公钥进行解密

总结一下今天学了啥:

  1. HTTP版本的进化:从0.9到3.0,每一次升级都是为了更快、更高效地传输数据;
  2. GET和POST的区别:不只是“取”和“送”的区别,还有安全性、长度、缓存、幂等性等多方面的差异;
  3. HTTPS是HTTP的安全版,通过加密保证数据传输安全。

这些知识虽然底层,但却是前端性能优化、网络请求设计的基础。