观感度:🌟🌟🌟🌟🌟html
口味:黑糖珍珠前端
烹饪时间:15min
git
前端圈技术的爆发式增加随之而来的开发人员学不动的疲惫感、焦虑感和不想跳出温馨圈的拖延懒惰。github
jQuery华丽谢幕,React v16已经普及、Angular9和Vue3即将发布。三大框架愈来愈贴近WebComponents标准。 TypeScript遍地开花,小程序日益火爆,快应用/PWA紧随其后……算法
站在浪潮之巅的咱们最须要的是停下来思考,轰轰烈烈的技术本质是什么?小程序
其实,轰轰烈烈的技术本质,是基础知识和核心概念。浏览器
看你这篇题目的文章,是要讲HTTP咯?HTTP那么简单,咱们你们天天都用,有什么好讲的?安全
在停下来思考技术本质的同时,咱们也要不断的提升本身的认识层次,你所谓的简单是由于你没有听到“遥远的哭声”。服务器
(shout out to 男神黄执中)网络
有请咱们今天的主角登场:HTTP
我将带你从HTTP的历史发展到各版本迭代主要特性来从全局的角度从新认识HTTP。
先来明确一下时间线,回到30年前的那个春天。
一切的一切都始于1989年的3月,万维网之父蒂姆·伯纳斯·李(Tim Berners-Lee)的一篇论文,创造了万维网,创造了HTTP。
1991年HTTP/0.9
发布 (没有RFC,版本号是后加上去的)
1996年5月HTTP/1.0
在RFC1945发布
1997年1月HTTP/1.1
发布 RFC2616是当前最新版本
2014年HTTP/1.1
再次修订,将大文档拆分为六份较小的文档, RFC7230-7235
2015年HTTP/2
发布 RFC7540 (基于谷歌的SPDY协议)
2018年,互联网标准化组织IETF
提议将HTTP over QUIC
改名为HTTP/3
若是但愿全面的了解HTTP/3
,推荐 Daniel Stenberg(CURL 做者)的HTTP/3详解
固然若是你想看最新同步的中文,能够看我翻译的版本。 欢迎指正错误和StarHTTP/3详解中文版
纵观HTTP的历史发展长河,究其缘由,是技术和需求一直在推进着它的发展。
HTTP是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。
HTTP一般跑在TCP/IP协议栈
之上,依靠IP协议实现寻址和路由
、TCP协议实现可靠数据传输
、DNS协议实现域名查找
、SSL/TLS协议实现安全通讯
。固然,WebSocket、HTTPDNS依赖于HTTP。
GET/index.html
复制代码
HTTP/0.9
当时是为了学术交流,基于请求和响应的模式,在网络中传输HTML超文本的内容。
如上所示,只有一个请求行,没有HTTP请求头和请求体。一样,服务器也没有响应头信息,只是返回了数据。
由于都是HTML格式的文件,决定了返回的文件内容经过ASCII字符流进行传输。
1994年低开启拨号上网,网景也在同年推出了第一款浏览器,人们对万维网的需求再也不仅局限于学术交流。
W3C和HTTP工做组HTTP-WG也在这个时代建立。为了知足人们对浏览器的需求(不光是HTML,还有CSS、JS、图片、音视频等),文件格式再也不局限于ASCII编码。
HTTP/1.0
的解决办法是引入了请求头和响应头。
accept: text/html
accept-encoding: gzip, deflate, br
accept-Charset: ISO-8859-1,utf-8
accept-language: zh-CN,zh
复制代码
同时也引入了状态码,为了减轻服务器的压力,提供了Cache机制。服务器须要统计客户端的基础信息(Windows 和 macOS),加入了用户代理字段。
一个TCP链接上能够传输多个HTTP请求,只要浏览器或者服务器没有断开链接,该TCP会一直保持。
持久链接是默认开启的,若是想要关闭,在请求头中加上Connection:close便可关闭。
目前浏览器中对于同一个域名,默认容许同时创建6个TCP持久链接。
HTTP/1.1
中试图经过管线化的技术来解决队头阻塞的问题。可是由于各类缘由,被各大厂商放弃治疗了。
HTTP/1.0
中每一个域名都只绑定惟一的IP地址,所以一个服务器只能支持一个域名。
可是随着虚拟主机技术的发展,一台物理主机上绑定多个虚拟主机的需求大大提高,每一个虚拟主机都有本身单独的域名,这些单独的域名都公用同一个IP地址。
所以,请求头中也增长了Host字段,表示当前的域名地址,服务器可根据不一样的Host值作不一样的处理。
HTTP/1.0
须要在响应头中设置完整的数据大小Content-Length:900,这样,浏览器就能够根据设置的数据大小来接收数据。
因为服务器端技术发展,页面都是动态生成的,传输数据以前并不知道最终数据大小, 致使浏览器不知道什么时候会接受完全部的文件数据。
HTTP/1.1
经过引入Chunk transfer机制来解决问题,服务器将数据分割成若干个任意大小的数据块,每一个数据块发送时会附上上一个数据块的长度,最后使用一个长度为0的块做为发送数据完成的标志。
HTTP1.1
引入了客户端Cookie机制和安全机制。
TCP 的慢启动
同时开启了多条 TCP 链接,那么这些链接会竞争固定的带宽
HTTP/1.1
队头阻塞的问题
HTTP/2
使用多路复用机制解决了上述问题。
一个域名只使用一个 TCP 长链接和消除队头阻塞问题。经过引入二进制分帧层,实现了 HTTP 的多路复用技术。
服务器能够提早将数据推送到浏览器,浏览器有权选择是否接受。浏览器发送RST_STREAM帧能够选择拒收。
头部的压缩大大的提高了传输效率。HTTP/2开发了“HPACK”算法,在客户端和服务器创建“字典”,用索引号表示重复的字符串,还采用哈夫曼编码来压缩整数和字符串。
能够设置让某些重要的数据优先被服务器处理并返回。
在 TCP 传输过程当中,因为单个数据包的丢失而形成的阻塞称为 TCP 上的队头阻塞。 HTTP/2
只解决了应用层面的队头阻塞,队头阻塞的问题还存在于TCP协议自己。
TCP
以及TCP+TLS
创建链接的所产生的延时也是影响传输效率的一个主要因素。
咱们把在互联网的各处搭建的设备叫作中间设备(中间件),好比路由器、NAT、防火墙、交换机等,它们一般依赖一些不多升级的软件,这些软件使用了大量的 TCP 特性,设置以后便不多进行更新。这就对咱们咱们更新TCP的时候形成了很大的困难, 新协议的数据包通过这些中间件时,它们不会去理解包的内容从而丢弃掉这些数据包。
由于 TCP 协议都是经过操做系统内核来实现的,应用程序只能使用不能修改。一般操做系统的更新都滞后于软件的更新,因此想要更新操做系统内核中的TCP协议也是很是困难的。
HTTP/3
选择了一个折衷的方法——UDP 协议,基于 UDP 实现了相似于 TCP 的多路数据流、传输可靠性等功能,咱们把这套功能称为QUIC 协议。
实现了相似 TCP 的流量控制、传输可靠性的功能
集成了 TLS 加密功能
实现了 HTTP/2 中的多路复用功能
实现了快速握手功能
关于HTTP/3更多详细的内容,请移步我翻译成中文版的HTTP/3详解。
欢迎Star仓库连接和提出错误或不对的地方。
参考:
《浏览器工做原理与实践》
《透视HTTP协议》
《趣谈网络协议》
《Web协议详解与抓包实战》
欢迎关注个人我的公众号,优质文章将同步推送。
你的前端食堂,记得按时吃饭。