48

前端隐秘角落 - HTTP请回答

 3 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzU0OTExNzYwNg%3D%3D&%3Bmid=2247486918&%3Bidx=1&%3Bsn=11259420c6657d652e54043558a3e3ec
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

HTTP请回答

MfIBZjm.png!mobile

    ( ° ° )     T  

前言

1989年,《千千阙歌》、《梦醒时分》这些现在依然耳熟能详的歌曲刚刚通过卡带录音机传遍大街小巷。 beyond则以一首《真的爱你》荣获了当年十大金曲奖。 周润发出演《阿郎的故事》成为第九届香港电影金像奖的最佳男主角,而罗大佑通过影片的主题曲《恋曲1990》、《你的样子》也成为了一代经典。 海子却在留下了“面朝大海,春暖花开”之后,永远的离开了我们。 而在遥远的瑞士日内瓦西北郊区的法瑞边境上,一个叫 蒂姆·伯纳斯·李 的研究员决定改变世界。

第一章 眼见他起高楼,眼见他宴宾客

1991年,最举世瞩目的事件莫过于苏联的解体。这标志着全世界结束了冷战时期的两极争霸格局,而美国成为了世界上的唯一超级大国。这一事件直到今天仍然深深的影响着我们的生活。而在科技界,另一件大事也同样对今后的世界产生了不亚于苏联解体的影响。那就是1991年8月6日,世界上的第一个网站 http://info.cern.ch/ 正式上线,世界上的第一个网页 

http://info.cern.ch/hypertext/WWW/TheProject.html

向世人宣告了互联网的诞生。而今你依然可以点开它,看到它,看到30年前的互联网宣言。互联网建立在 TCP/IP协议 基础上,最初由四个部分组成,包括: 超文本标记语言html超文本传输协议http网络浏览器网络服务器 。如果用我们熟知的图书馆去做对比,那么读者相当于浏览器,图书馆相当于服务器,http相当于图书的借阅流程,html相当于借到的图书。当时的借阅流程还相当的简陋,以至于后来将没有版本的初代 http协议 定义为 0.9 版本,连1.0都算不上。它只有一行指令,因此也叫它 单行协议

发出指令:

// 借我 射雕英雄传
GET /shediao.html

返回内容:

// 文字纯享版射雕英雄传
<HTML>
第一回 风雪惊变 钱塘江浩浩江水,日日夜夜无穷无休的从临安牛家村边绕过,东流入海……
</HTML>

这一时期的互联网只有一个 GET 方法,只能返回 HTML字符串 ,因此你也只能看看小说,看看小说,看看小说了。

第二章 当历史被创造时,你不知道你就在其中

NzyQfyz.jpg!mobile

小说看腻了,就想看图片。上图是世界上第一张通过可以互联网浏览的图片。1992年7月18日为了测试互联网的图表展示,老李向同事要了一张真实的图片上传到互联网。顺带一提,她们是欧洲核子研究中心的员工组成的乐队 Les Horribles Cernettes ,感兴趣可以在各大音乐平台上搜索到他们的歌曲。当你看着这张 互联网第一图 ,通过互联网听着图片上的乐队唱着当年不可能在互联网上听到的歌曲时(现在互联网刚突破练气境界,只能看看图片),会不会有种时空错乱的感觉而想要呼唤一下:请回答1992呢?再顺带一提,现在看到的其实都是赝品,保存着这张照片的电脑在1998年的时候报废了,原始文件也丢失了。

1992年底世界上只有 26 个网站,英文字母都数的过来,93年网站数量翻了 10 倍达到了史无前例的 200 个,是的史无前例。95年8月你猜网站数量到了多少, 上万 了。再到了98年网站数量已经到了 百万 级别,妥妥的指数级增长。由此看来指数性发展就是互联网天生的基因。 欧洲核子研究中心对于互联网的免费开放以及兼容性、体验性在当时俱佳的 NCSA Mosaic 浏览器功不可没,一定程度上它也是网景浏览器的前身。

在1991年到1995年之间,浏览器和服务器不断的基于现实需求对 http协议 内容进行扩展尝试,并最终在 96 年发布了 http1.0协议 。典型请求如下:

发出指令,我要向图书馆借本带插图的射雕

// 借我 射雕英雄传 我要走最新的1.0流程
GET /sheidao.html HTTP/1.0
// 亮出帅气的头
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)

图书馆返回

// 暗号200 找到这本书了 
200 OK
// 亮出帅气的头
Date: Tue, 18 Nov 1994 09:11:39 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/html
// 带图的射雕英雄传
<HTML>
第一回 风雪惊变 钱塘江浩浩江水,
日日夜夜无穷无休的从临安牛家村边绕过,
东流入海……
<IMG SRC="/qiantangdachao.gif">
</HTML>

然而当我想看书里的 插图 时,却发现这并非是一张图片,而是一张 借图卡 ,我还要再去一趟图书馆用借图卡再借图片来看。

// 借我 钱塘大潮的图片 我要走最新的1.0流程
GET /qiantangdachao.gif HTTP/1.0
// 亮出帅气的头
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)
// 暗号200 找到了
200 OK
// 亮出帅气的头
Date: Tue, 18 Nov 1994 09:11:42 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/gif
(这里是图片内容:气势磅礴的钱塘江大潮)

通过两次请求,我终于看到了插图本的射雕。

通过和上面的 0.9版本 对比,我们可以发现:

  1. 请求部分: 在原来 单行协议 的基础上,后面又跟了一个 http协议版本号 ,也就是告诉图书馆,我要走哪套借书流程;亮出了帅气的头部,也就是 http header ,在这里可以对协议进行非常方便的扩展,比如通过 header 里的 Content-Type 字段,除了 html 文本,我们还可以请求图片及其他类型的资源。同时,在原来 GET 方法的基础上,又增加了 POSTHEAD 方法。

  2. 返回部分:增加了 http 状态行包括 状态码状态描述 ,可以让浏览器清楚请求的结果。同请求部分一样,返回部分增加了 http头部

由于 1.0 版本更像是自下而上的总结式文档,因此其中有许多没有严格定义的部分。

第三章 星星之火 可以燎原

1996年,对大部分美国的上市公司而言,一个公开的网站已成为必需品。在1997年初,就在 HTTP/1.0 发布的几个月之后 HTTP1.1 标准发布。1998年,微软发布window98,。纳斯达克综合指数在整个90年代末期因为互联网而一路飙升造就了上个世纪末的互联网泡沫。而在中国人民日益增长的上网需求和电脑昂贵价格的矛盾之间,网吧如雨后春笋般的出现在祖国大地。在这段时间,随着 HTTP 新的标准化协议、新的操作系统、成百上千万新的网站的出现,互联网在中国发生了神奇的反应,开启了无数人的梦想与希望,改造了无数的行业,缔造了一轮新的技术革命。

在这种氛围下,我又要去图书馆借书了,这次我要使用最新的 1.1 流程。

// 借我 射雕英雄传 走最新的1.1流程
GET /shediao.html HTTP/1.1
// 亮出帅气的头,脑门上写着
// 我要借的是武侠馆的书
Host: www.wuxiabook.cn
// 我来时候乘坐的可是最新版的火狐坐骑
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
// 我只看如下格式的书
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
// 我只看英文原版的书
Accept-Language: en-US,en;q=0.5
// 我只看10到11章
Range: bytes=10-11
// 我只接受这些编码
Accept-Encoding: gzip, deflate, br
// 是谁介绍我来的
Referer: https://developer.mozilla.org/en-US/docs/Glossary/Simple_header

图书馆返回:

// 咱们走最新的1.1流程 暗号200 找到了
HTTP/1.1 200 OK
// 你先别走,万一你还借别的书还是我服务
Connection: Keep-Alive
// 咱们图书馆用这种编码
Content-Encoding: gzip
// 这次借你的是这个类型的
Content-Type: text/html; charset=utf-8
// 借出时间
Date: Wed, 20 Jul 2016 10:55:30 GMT
// 借出的版本
Etag: "547fa7e3fc0832eb251a69ef56031dd3bff2ace9"
// 我最多等你5ms空闲
Keep-Alive: timeout=5, max=1000
// 这本书上次啥时候发的版
Last-Modified: Tue, 19 Jul 2016 00:59:33 GMT
// 118章里的10,11章
Content-Range: bytes 10-11/118
// 一共两章
Content-Length: 2
// 图书馆发电机型号
Server: Apache
// 图书的编码方式
Transfer-Encoding: chunked
// 射雕本书
(content)

1.0 流程相比, 1.1 版本默认 keep-alive ,关于 连接模型 ,我们放到第四部分统一聊聊;增加了更多的 缓存策略 ,如 Entity tagIf-Unmodified-SinceIf-MatchIf-None-Match 。增加了 host 头部字段,这样保证在 一个ip地址 上也能找到不同的主机服务;增加了 响应分块 ,想看射雕第几章就看第几章。

通过以上改进,在互联网的性能、效率和体验都大大提升,人们真正的奔驰在了信息高速公路上。

第四章 未来可期

98年后搜狐新浪等门户网站一时独领风骚,99年腾讯上场,2000年百度进击,2003年淘宝上线,由此开启了十几年的 PC互联网 时代。2009年,中国进入 3G时代 ,2010年苹果公司发布 iphone4 ,由此又开始了 移动互联网 时代直到 5Giphone12 发布的今天。而我们的 HTTP 协议也经历了从无到有,两次改版,达到了比较友好的状态,但互联网的脚步是永不停歇的。目前还有两个问题,一个是 安全问题 ,谁都可以去图书馆以我的名义借书,谁都可以自称图书馆,以图书馆的名义服务;另一个是 速度问题 ,前面你们也看到了我想看个插图的射雕,一张图都跑了两次。要是按照1.0那套流程,我这书里要是插了几百张图,等我看完书走的路都可以种几百亩蚂蚁森林了。

关于 安全问题 ,没错,要出场的就是我们的 HTTPS 前面说到http协议是基于 TCP/IP 协议的基础上创建的。 因此http的服务流程可以表示为 IP-TCP-HTTP 而https则在http之前插入了一层 TLS(Transport Layer Security)  协议,服务流程就变成了 IP-TCP-TLS-HTTP ,这相当于在我借书之前需要先对暗号,暗号对上了才能借书。 TLS的前身是 SSL协议 ,94年到96年NetScape公司设计并发布了 SSL协议 1.0 3.0 版本。 1999年开始,互联网标准化组织接过安全大棒,开始发布升级TLS。 目前应用最广泛的是 TLS1.2 而HTTPS的加入,在增加互联网安全性的同时,又在HTTP请求之前增加了安全通信流程,也就增加了通信耗时。

速度问题,则一直是个老大难问题。在 HTTP/1.x 里有多种模型: 短连接模型长连接模型 ,和 HTTP管线化模型

短连接是 HTTP 最早期的模型,也是 1.0 版本的默认模型,发起每一个 HTTP 请求之前都会有一次 TCP 握手。相当于我一共要借10本书,我不能一次去了图书馆全都借完,而是要借了一本回家,再去图书馆借第二本,时间全浪费在路上了。

为了解决短连接的问题, Keep-Alive 应用而生。只需要在 头部 设置 ConnectionKeep-Alive ,就可以复用同一个 tcp 连接按顺序进行 http 请求。这就相当于我可以去一次图书馆借十本书了。当然这个 tcp 连接也不会一直保留着:连接在空闲一段时间后会被关闭(服务器可以使用 Keep-Alive 协议头来指定一个最小的连接保持时间)。

HTTP管线化模型则因为服务器支持等问题,在现代浏览器中并不被默认启用。

1.x 时代,为了解决速度问题,我们会有许多优化手段,其中之一就是 域名分片 。为此我们常将资源放在不同域名下 (比如二级子域名下),这样就可以针对不同域名创建 6~8TCP 连接 (不同浏览器不一样),从而通过提升并发请求数量提升速度。

这时候我们的 HTTP2.0 开始闪亮登场。HTTP2.0是在Google通过2010到2015年的5年时间内实践的 SPDY协议 的基础上得来的。最主要的一个功能就是 多路复用 ,说白了就是在一个TCP链接上完成所有的HTTP请求。那它是怎么做到的呢?首先在原来的应用层和传输层之间,加入了一层 二进制分帧层 。HTTP1.x是基于文本传输,但是文本的解析复杂耗时,因此改为 二进制 。而在传输数据结构上,引入了 的概念,一个流由多个帧组成。一个TCP链接上可以有多个流同时传输,从而解决了HTTP1.x在一个TCP链接上同时只有能一个HTTP请求的问题。HTTP2.0将每个HTTP请求切割为更小的 ,有 header帧body帧 等,并且给同一个请求的帧分配相同的 streamId ,模拟实现了流的传输。因此,我只要去一趟图书馆就可以借完所有想借的书。除此之外, HTTP 还会对header进行 首部压缩 ,减小数据体积, 主动推送 相关资源,减少服务端请求。下面的链接是 HTTP 1.1与 HTTP 2.0的加载效果对比。可以直观的看到 HTTP 2.0的优势。  https://http2.akamai.com/demo

qiIvaqm.gif!mobile

鉴于对 IP-TCP-HTTP 这一模式的优化已经到头了,2013年Google开发了基于UDP的名为 QUIC 的传输层协议,QUIC全称Quick UDP Internet Connections,希望它能替代TCP使得网页传输更加高效。后经提议,2018年11月互联网工程任务组正式将基于QUIC协议的HTTP(HTTP over QUIC)重命名为 HTTP/3 。所以HTTP3的模式就是 IP-UDP-QUIC-HTTPTCP 是面向连接的协议,因此需要先建立可靠的连接,而 UDP 是面向报文的协议,因此UDP的任务就是拿到数据,扔出去。所以HTTP3.0的主要改进就体现在去除了tcp三次握手时间,使用TLS1.3版本将TLS1.2版本中的四次握手时间改为了两次握手。同时保留了http2的多路复用。目前国内腾讯已经通过X5内核的浏览器和腾讯安全云网关进行了http3.0的实践,速度比非HTTP3协议可提升 10%

总结

通过回顾 HTTP 的整个发展历程,可以看到 HTTP 从最简单的 单行协议 ,一路发展到今天的 HTTP3.0 ,不仅仅是协议本身的扩展,还包括了互联网层级的改变。 但这些发展很大程度上还是如 Google 等国外大厂做出了较大的贡献。 互联网是一个开放包容的世界,因此我们得以利用开放包容的技术达成了我们今天的成就,但我们也需要反思,如何才能为这个世界作出我们的贡献。

参考:

  1. An overview of HTTP(https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Overview)

  2. HTTP/3原理与实践(http://www.alloyteam.com/2020/05/14385/)

  3. 透视HTTP协议(https://g.yu que.com/jdxj/magdny/mk8irw?language=en-us)

  4. SSL/TLS协议运行机制的概述(https://www.ruanyifeng.com/blog/2014/02/ssl_tls.html)

  5. RFC: 793(https://tools.ietf.org/html/rfc793)

文末福利

转发本文并留下评论,我们将抽取第 10 名留言者(依据公众号后台排序),转转纪念 T 恤一件或转转随机手办一个,可任选其一,大家快转发起来吧~

zEjAriN.png!mobile

EzURjam.jpg!mobile

UnuEf2F.jpg!mobile


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK