HTTP请回答

「福利」 ✿✿ ヽ(°▽°)ノ ✿:文章最后有抽奖,转转纪念 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字符串,因此你也只能看看小说,看看小说,看看小说了。

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

小说看腻了,就想看图片。上图是世界上第一张通过可以互联网浏览的图片。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.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.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进行首部压缩,减小数据体积,主动推送相关资源,减少服务端请求。下面的链接是HTTP1.1与HTTP2.0的加载效果对比。可以直观的看到HTTP2.0的优势。 https://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)


文末福利

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

前端隐秘角落 - HTTP请回答相关推荐

  1. 前端隐秘角落 - web安全的演变历程

    前言:隐秘的角落番外篇 这是一个平行时空,在这里,朱朝阳还是有写日记的习惯,不是在日记本,却是在qq中记录.这一天,在他身上发生了一个奇怪的事情:当他像往常一样登录自己的qq空间,却发现最新一条的说说 ...

  2. html页面加载完成后会触发的事件_前端隐秘角落 - 页面渲染

    前言 如图所示,webkit内核浏览器的渲染过程(解析HTML,构建DOM树,解析CSS,构建CSSOM树 ,构建render树,布局layout,绘制painting),这些过程理解起来可能有些抽象 ...

  3. “黑天鹅”与“灰犀牛”不能混为一谈,揭开数据保护的“隐秘角落”

    关注我们牛年牛气冲天 远如美国的"9·11"事件,近如去年爆发的新冠疫情,这些都是典型的"黑天鹅"事件,因为它们是小概率.难预测的突发风险:而像频发的勒索病毒等 ...

  4. 样式雷家的大宅子在今天四环路主路下:《北京的隐秘角落》|3星

    北京的隐秘角落 内容有点意思,作者对一些常见不常见的古迹的由来和历史做了考证,讲了相关的历史故事. 作者非专业历史学或考古学从业者,是以业余爱好者的身份写本书的,因此书中资料的可信度存疑. 总体评价3 ...

  5. 温酒读Qt:QObject中篇1—— Q_OBJECT的隐秘角落

    一.Q_OBJECT 宏 的隐秘 话接上一篇链接: 温酒读Qt:QObject 序篇,今天我们来揭露下QObject的靓丽一点(别问我是3点.4点还是多少点中的一点). 对于已经浅尝Qt信号和槽函数的 ...

  6. 在隐秘角落的小爽文有多火?40天内就收回所有成本?豆豆细说爽文大生意

    我们对市场会有很多想象,认为高大上才是未来,但2018-2019年市场讲述的故事都是下沉.在友盟+的数据中,逆势增长的版块无论从任何一个角度去看,都逃不开小说App这个细分区域. 比如,其中一个逆增长 ...

  7. 【观察】揭开资产深海的隐秘角落,魔方安全的重构创新

    申耀的科技观察 读懂科技,赢取未来! 但凡讲海明威,一定会提到"冰山理论".他曾写过:"冰山之雄伟壮观,是因为它有八分之一在水上面."而在他的文学作品中,文字和 ...

  8. 正则化范式L0,L1,L2理解

    L1,L2,L0区别,为什么可以防止过拟合 Arya鑫关注 0.9012017.09.01 08:52:10字数 1,983阅读 9,355 引入 监督学习的过程可以概括为:最小化误差的同时规则化参数 ...

  9. 设计登录校园网网关java,基于web认证校园网共享实例

    Web - JS掌握JavaScript中的数组.循环.函数等技术的使用(网页 Web - JS掌握JavaScript中的数组.循环.函数等技术的使用(网页轮播图) 完成网页轮播图效果,配套的还有随 ...

最新文章

  1. WCF 框架运行时类图
  2. inrange函数 python_为什么OpenCV的inRange函数不将我的HSV图像转换成二进制?
  3. c++:MFC EDIT控件内容的四种处理方式使用(CEdit控件类型与CString 值联动)
  4. 如何跑通第一个 DataStream 作业?
  5. 在Ext JS 6中添加本地化包
  6. oracle group by 多类别_python数据关系型图表散点图系列多数据系列
  7. python中的字符串操作及注意事项
  8. Jmeter响应中中文乱码怎么解决?
  9. AndroidStudio安装教程(Windows环境下)
  10. 天猫京东618下单金额近万亿;苹果或选择印度组装新款iPhone SE;Adobe将于12月31日终止支持Flash| 极客头条...
  11. 阿诺德图像加密c语言,基于Arnold变换的数字图像加密算法
  12. Linux文件和目录的属性及权限
  13. Python初学手记----在window系统中安装环境
  14. 国人不能再过度迷信开源软件
  15. Mocker API 2.7.0 为 REST API 创建模拟 API
  16. 泛微自带第三方短信接口
  17. 计算机里的音乐怎么设置,realtek高清晰音频管理器怎么设置
  18. 【Python】遗传算法求解二元函数最值
  19. Markdown、.bib、LaTeX + Typora、Pandoc 管理论文参考文献
  20. OpenCV python 彩色图片的三通道

热门文章

  1. excel 导入数据,xxe 注入 poi 3.15
  2. Alluxio Paper
  3. 【数学分析】Bolzano-Weierstrass定理及其证明(有界数列一定存在收敛子列)
  4. 如何实现国外域名调转到国内已备案ip
  5. 羊皮卷坚持不懈直到成功_坚持不懈的秘诀:当您想做的所有事情都退出时,如何成功地成为一名开发人员
  6. 范冰冰登顶2013福布斯名人榜 孙俪升74名
  7. ts 之 Pick 和 Omit
  8. head first java勘误_Head First Java勘误
  9. 视网膜竞争(双目竞争)现象
  10. ncae的c语言编程高阶怎么考,ncae考试科等目.doc