广义上我们口中的 http
我们口中常说的 http 应该是指 http 1.1
http0.9中,每次通信完成后,都会断开tcp连接,造成资源浪费。
http1.0可以在header中加入keep alive来确保长连接,但还是有点麻烦。
于是,http1.1 默认可以 keep alive,并且引入管道机制(pipeline),客户端可以发送多个请求,但是服务端按照顺序来一一回复。这也是HTTP1.1的设计缺点,多个请求过来时,队列容易被大型缓慢得请求堵塞,尽管前端可以优化请求数量,例如雪碧图,合并脚本和样式表等。
后来,谷歌开发出一种新的通信协议,并在Chrome试水成功,名为:spdy(撕破腚眼),后来大多数 feature 都在 http2 中得到继承,例如 head 头中的元数据信息不再限制为仅支持 ASCII 编码的字符集,并且还支持二进制编码,以便于将来高级应用的解析。并且,每次通信的过程中,不会再有队列堵塞的情况发生,一个请求太大,执行多少就先返回多少,在执行下一个任务,等下一个执行完,接着处理上一个。另外,可以中途取消某个通信帧,还可以给每个请求标注 level 让服务器按照 level优先级处理。还有服务器和客户端都会维护一张表,将重复的头部元数据都塞到表里,每次通信,发送表的索引,提升通信效率。
除此以外,服务端可以强推送,例如,客户端请求某个 html,服务器可以显而易见的知道里面有很多图片及脚本文件,不用浏览器请求,就会自动推送给浏览器。
前面也说到字符集的编码标准。下面来捋一下:
- 计算机开始普及时,为了让大多数的信息都可以被计算机识别,人们建立了一套 “阿拉伯数字 + 英语 + 常用符号” 的编码标准来映射对应的字符,从而让计算机更好的识别,处理这些字符。这个字符集定义了 从 a-z A-z 0-9 , . ? / [ ] 等常用的字符。该标准成为: ASCII 编码。
- 后来,使用计算机的人越来越多,比如中国,但是 ASCII 码没有定义中文字符,于是,中国有了一套 gb2312 字符编码标准,同理,大多数国家都应该有一套自己的文字编码标准,后来被统一为 unicode 编码。 unicode 编码定义了绝大多数的文字、符号等。
- utf-8, utf-16 的诞生,是为了提升编码的效率,避免浪费位存。