http请回答

avatar
公众号:转转技术

前言

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

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

1991年,最举世瞩目的事件莫过于苏联的解体。这标志着全世界结束了冷战时期的两极争霸格局,而美国成为了世界上的唯一超级大国。这一事件直到今天仍然深深的影响着我们的生活。而在科技界另一件大事也同样对今后的世界产生了不亚于苏联解体的影响,那就是1991年8月6日,世界上的第一个网站 info.cern.ch/ 正式上线,世界上的第一个网页 info.cern.ch/hypertext/W… 向世人宣告了互联网的诞生,而今你依然可以点开,看到他,看到30年前的互联网宣言。 互联网建立在TCP/IP协议基础上,实际由四个部分组成,包括:超文本标记语言html超文本传输协议http网络浏览器网络服务器。如果用我们熟知的图书馆去做对比,那么读者相当于浏览器,图书馆相当于服务器,http相当于图书的借阅流程,html相当于借到的图书。 当时的借阅流程还相当的简陋,以至于后来为没有版本的初代http协议定义为0.9版本,连1.0都算不上。它只有一行指令,因此也叫他单行协议。 发出指令:

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

返回内容:

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

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

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

小说看腻了,就想看图片。上图是世界上第一张通过互联网浏览的图片。92年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:38 GMTServer: 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, 15 Nov 1994 08:12:32 GMTServer: CERN/3.0 libwww/2.17
Content-Type: text/gif
(这里是图片内容:气势磅礴的钱塘江大潮)

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

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

  1. 请求部分: 在原来**单行协议**的基础上,后面又跟了一个**http协议版本号**,也就是告诉图书馆,我要走哪套借书流程; 亮出了帅气的头部,也就是**http header**,在这里可以对协议进行非常方便的扩展,比如通过**header**里的**Content-Type**字段,除了**html**文本,我们还可以请求图片及其他类型的资源。 同时,在原来**GET**方法的基础上,又增加了**POST**和**HEAD**方法。
  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
// 是谁介绍我来的
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: "547fa7e369ef56031dd3bff2ace9fc0832eb251a"
// 我最多等你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.03.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开始闪亮登场。http2是在Google通过2010到2015年的5年时间内实践的SPDY协议的基础上得来的。最主要的一个功能就是多路复用,说白了就是在一个tcp链接上完成所有的http请求。那它是怎么做到的呢?首先在原来的应用层和传输层之间,加入了一层二进制分帧层。http1.x是基于文本传输,但是文本的解析复杂耗时,因此改为二进制。而在传输数据结构上,引入了的概念,一个流由多个帧组成。一个tcp链接上可以有多个流同时传输,从而解决了http1.x在一个tcp链接上同时只有能一个http请求的问题。 http2将每个http请求切割为更小的,有header帧body帧等,并且给同一个请求的帧分配相同的streamId,模拟实现了流的传输。因此,我只要去一趟图书馆就可以借完所有想借的书。除此之外,http还会对header进行首部压缩,减小数据体积,主动推送相关资源,减少服务端请求。下面的链接是http1.1与http2.0的加载效果对比。可以直观的看到http2.0的优势。 http2.akamai.com/demo

鉴于对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.yuque.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)