看到题目,你们是否是认为根据上一篇(两万字长文50+张趣图带你领悟网络编程的内功心法)同样,其实否则,咱们上一边介绍的是网络编程的基本功,有了这些基本功以后,咱们就能够在此之上构建更加接近实际应用的web程序了。为了快速展现他们的层次关系,我用几本书叠了起来进行说明,顺便给你们推荐这几本基本算是这些领域比较权威的书籍。以下图,由下往上看:html
在 两万字长文50+张趣图带你领悟网络编程的内功心法 一文中,咱们详细介绍了TCP/IP协议,从物理层一直讲到了应用层。在应用层能够利用TCP/IP底层的能力,实现丰富的功能,而本文,咱们就重点讲解构建在应用层上的协议:HTTP协议。前端
首先,咱们来思考一个问题,HTTP是怎么来的,为何要创造HTTP,HTTP接下来会怎么发展呢?这就得聊聊HTTP的发展演变史了。java
阅读本文的同时,咱们能够看到整个HTTP的发展演变史,能够发现,假设规范是一个小伙子,通常来讲,一个优秀的小伙子历来不是出生以后就是优秀的,而是随着业务场景,技术挑战的产生,不断的被拉去劳改,学习,在忧患中蜕变进化。因此如今所谓的标准、成熟的技术,未必符合全部的场景,是技术的挑战与创新促成了新事务的发展。git
(前方高能预警:此处有篇高考高分做文💯...)若是Google只知足于HTTP/1.1,就不会推出SPDY促进HTTP/2的诞生了;若是Google只知足于SPDY,就不会推出QUIC促进HTTP/3的诞生了;若是快手只知足于HTTP/1.1,就不会本身实现一套kQUIC了;若是我只知足于经过HttpClient发起HTTP调用,就不会写这篇文章了。github
还记得那个学术风浓厚的OSI网络模型吗,最终是被TCP/IP给盖过了风头。深刻应用场景,深刻业务,挖掘痛点,探索折腾起来吧。哦对了,最重要的一点:计算机基础知识得打牢固。web
话很少少,我直接画了一个图,总结一下HTTP的演变史,一个从诞生之日开始就不断被劳改的小伙子,一路被互联网巨头和互联网标准化组织IETF逐渐带上正轨的心酸历史,它还有很长一段路须要走:算法
在HTTP协议诞生之前,都有哪些事情的发生,为其作好了铺垫呢?下面来看看。数据库
接下来,我会请出咱们的机器人为咱们总结每一个小节的技术,格式以下:编程
每一个版本的协议都会有不少特性,这个章节会把相关特性或者技术点描述出来,可是在发展演变史这章节不会细讲,咱们后面会有专门章节为你揭秘HTTP技术点的详细实现原理。后端
因此,本章节主要是为您梳理HTTP的发展演变史,知道技术的前因后果,以及接下来的发展趋势。
ARPANET(Advanced Research Projects Agency Network)是第一个具备分布式控制的广域分组交换网络,该网络由美国国防部高级研究计划局创建。
为了实现对远程计算机的访问,美国互联网先驱 Bob Taylor 在1966年启动了ARPANET项目,1969年链接了第一台计算机,在1970年实现了网络控制程序。
关于为什么要搞这样的技术,据ARPA的总监Charles Herzfeld说:由于当时美国直邮数量有限的大型的研究计算机,而许多应该使用这些计算机的研究人员因为地理空间问题致使不能很好使用起来,这使他们感到很挫败,因此就提出了这个研究计划。固然也有传言是处于军事目的,实现对核力量的控制,改善军事战术和管理决策。但无论怎样,网络世界今后往前迈进了一大步。
在70年代的时候,基于ARPA网络的发展,研究人员指定了传输控制方案,最终演变成了一个协议,经过该协议能够将多个单独的网络合成一个网络,这个协议也就是TCP/IP。
在1983年UNIX操做系统BSD诞生了,其内核就包含了网络编程套接字的设计和实现,TCP/IP就这么被BSD带起来了,最终逐渐成为了事实的标准。
能够说UNIX套接字联网API就是网络编程的一个源头了,因此大学老师教网络编程的时候大几率会推荐这本书:《UNIX网络编程 卷1:套接字联网API》,当时咱们老师也推荐了这本书,虽然当时大几率不会细看,可是早晚会用到的。
两万字长文50+张趣图带你领悟网络编程的内功心法 一文咱们也提到了,为了制定一个统一的计算机网络体系,国际标准化组织ISO提出了一个试图使各类计算机能够在世界范围内互联成网的标准框架:OSI/RM(Open System Interconnection Reference Model 开放系统互连基本参考模型)。
不过嘛,这个标准是1984年发布的,此时TCP/IP已占据大半江山,逐渐成为了事实的标准,并且OSI更加学术,上一篇文章咱们也提到了OSI的一些缺点,致使其不能取代TCP/IP,TCP/IP则是在实践中获得了验证。
好了,万事具有,咱们离HTTP的诞生愈来愈接近了。
在1989年,英国工程师兼计算机科学家 Timothy Berners-Lee 在1989年发明了World Wide Web万维网,万维网是信息时代发展的核心。他开发了三种基础技术:
是什么促成了 Timothy Berners-Lee 发明万维网呢?在CERN工做的时候,他对查找存储在不一样计算机上的信息所带来的低效率和困难感到沮丧。因而,他想CERN管理层提交了一份备忘录:《信息管理:一项提案》。逐渐促成了能够在文档中经过单击鼠标跳转到其余引用的文档的系统的实现,这种呈现形式的文档被称为超文本。
HTTP诞生了。
1991年,是一个单纯的年代,网上只有文字,看不了图,看不了片。在如此单纯的环境下,Timothy Berners-Lee设计了HTTP协议的0.9版本,为啥不给多个0.1凑个整呢,由于跟咱们如今用的HTTP1.1+协议比起来实在是简单多了:
可是这也是知足那个纯真年代的需求了。保持简单,避免过分设计也好,为后续扩展留了个口子。
HTTP/0.9协议下经过浏览器访问:https://www.itzhai.com/hello-world.html
在创建了TCP链接以后,最终浏览器会发送报文以下:
GET /hello-world.html
GET后面为何是资源路径,而不是URL呢?
由于浏览器首先是拿到了URL对应的IP地址,而后创建TCP链接,一旦链接到服务器,就不须要协议,服务器,和端口号了。第二节咱们会抓包演示。
响应也很是简单,仅仅由HTML文件自己组成:
<html> <body> welcome to itzhai (www.itzhai.com), wechat account: itread. </body> </html>
能够发现:
人们的欲望是那么的没有止境呀,后来又想在网上看小图片,又想听音乐,不仅仅只是看文字了,还想本身写段子到网上。这么多需求来了,只能升级HTTP协议了。在1996年5月,HTTP工做组发布了RFC 1945[1],在该文档中记录了许多HTTP/1.0实现的通用方法,因而HTTP/1.0就诞生了。
HTTP/1.0跟我如今用的HTTP/1.1比接近了,加了以下概念:
增长了首部:
增长了16个响应状态码;
引入了重定向;
内容编码(压缩):
content-coding = "x-gzip" | "x-compress" | token
更多的请求方法:GET,HEAD,POST;
传输数据不限于文本;
更详细的内容,参考RFC 1945[1:1]。
可是,HTTP/1.0并非一个正是规范或Interger标准,只是一个已有实践的参考文档,没有约束力,对当时的互联网来讲没有太大的推动做用。
另外,HTTP/1.0也是有不少瑕疵的,好比不能让多个请求共用一个TCP链接,缺乏强制的Host首部,而且缓存比较控制比较粗糙。
如何复用TCP链接?
有些浏览器在请求的时候,会使用一个非标准的Connection字段:
Connection: keep-alive这个表示客户端端要求服务器不要关闭TCP链接,以便其余请求能够复用,服务器一样的回应这个字段。
HTTP/1.0协议下经过浏览器访问:https://www.itzhai.com/hello-world2.html
请求报文以下所示:
GET /hello-world2.html HTTP/1.0 User-Agent: NCSA_Mosaic/2.0 (Windows 3.1) Accept: */*
响应报文以下所示:
200 OK Date: Tue, 15 Nov 1996 08:00:00 GMT Server: Apache 0.84 Content-Type: text/html <html> <body> welcome to itzhai (www.itzhai.com), wechat account: itread.<br/> <img src="https://www.itzhai.com/resources/images/itzhai_qrcode.jpeg" width="100px"> </body> </html>
因为浏览器拿到响应的HTML以后,解析到里面还有一个img图片请求,因而又发起了第二个链接获取图片:
GET /resources/images/itzhai_qrcode.jpeg HTTP/1.0 User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)
响应报文以下所示:
200 OK Date: Tue, 15 Nov 1996 08:00:01 GMT Server: Apache 0.84 Content-Type: image/jpeg (image content)
将HTTP转变为正式的IETF Internet标准的工做与围绕HTTP/1.0文档编制工做并行进行。
有道是,有竞争才会有进步,微软在1995年推出的Windows系统中发布了IE浏览器,与当时的浏览器霸主Netscape浏览器展开对抗,IE逐步占有了更多的市场,直到1998年Netscape被AOL收购后,IE的市场还在不断攀升,在两大浏览器互相厮杀期间,HTTP/1.1诞生了。
在1997年1月,发布了HTTP/1.1的第一个正式标准 RFC2068[2]。而后,在两年半以后的1999年6月,许多改进和更新被归入该标准,并以 RFC 2616[3]的形式发布。
HTTP/1.1有以下特性:
新增了POTIONS、PUT、DELETE、TRACE、CONNECT等新方法;
强化了缓存管理和控制;
支持维持持久链接,支持通知服务器弃用链接;也就是说TCP链接默认不关闭,能够被多个请求复用,不用声明Connection: keep-alive
;
请求HTML文件的时候要求携带编码、字符集、cookie元数据等信息;
支持原始HTML请求的分块响应,利于传输大文件;
就这样,一个最稳定版本的HTTP协议诞生了,直到如今,仍然有不少网站在使用HTTP/1.1协议。
在HTTP/1.1期间,涌现了不少互联网企业,如,Google,腾讯,百度,阿里,淘宝,美团头条等。
请求报文:
GET /hello-world2.html HTTP/1.1 Host: www.itzhai.com Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7 If-None-Match: "9a3bee90-q1" If-Modified-Since: Tue, 18 Aug 2020 15:06:33 GMT
响应报文:
HTTP/1.1 200 OK Date: Tue, 18 Aug 2020 15:30:57 GMT Last-Modified: Tue, 18 Aug 2020 15:06:33 GMT Content-Type: text/html Content-Length: 192 ETag: "5f3bee79-c0" Accept-Ranges: bytes <html> <body> welcome to itzhai (www.itzhai.com), wechat account: itread.<br/> <img src="https://www.itzhai.com/resources/images/itzhai_qrcode.jpeg" width="200px"> </body> </html>
HTTP/1.1具体特性说明咱们第二节会讲到。
本文首次发表于: HTTP发表演变史 以及公众号 Java架构杂谈,未经许可,不得转载。
固然,HTTP/1.1的问题也是不少的,主要是链接缓慢,服务器只能按顺序响应,若是某个请求花了很长时间,就会出现请求队头阻塞,从而影响其余请求。
这个时期出现了不少各式的前端优化小技巧,当年搞过一段时间前端,也对这些技术略知一二,如:
最终,为了推动从协议上进行优化,Google跳出来了,推出了SPDY协议。
为啥Google敢推出这样的协议呢,主要仍是由于在2008年诞生的Chrome浏览器迅速占据了市场,拥有了大部分用户,挟天子以令诸侯,尝试推广新技术是水到渠成的事情。
SPDY是Google开发,用于传输Web内容的协议,SPDY协议减小了网页加载延迟,而且提升了We标的安全性。
SPDY主要经过帧和首部压缩、多路复用和优先级属性下降等待时间。
SPDY诞生以后,很快被整合进Chrome和Firefox,最终被全部主流浏览器所采用,另外服务器和网络代理也对SPDY提供了必要的支持。
SPDY的核心人员后来都参与到了HTTP/2的开发,在2015年2月,Google宣布最终批准HTTP/2标准以后,也就再也不继续支持SPDY协议了,而且最终在Google Chrome 51中删除了SPDY的支持。
HTTP/2又解决了HTTP/1.1面临的大部分问题,主要有以下功能:
HTTP/2还在草案的时候,Google又发现新的问题了,那就是因为HTTP/2依赖于TCP,TCP有什么问题,那么HTTP/2就会存在什么问题。最主要的问题仍是队头阻塞问题:队头阻塞问题在应用层解决了,可是在TCP协议层并无解决:
为了解决以上问题,因而Google发明了gQUIC(Quick UDP Internet Connection)协议。
QUIC是最初由Google开发的一种传输层网络协议,在QUIC协议中,传输层用UDP替换掉了TCP,并在用户空间实现了一套拥塞控制算法,从而避免了TCP的队头阻塞问题。
在UDP之上,QUIC实现了链接管理、拥塞窗口、流量控制等。
后来IETF HTTP和QUIC工做组主席Mark Nottingham提出了正式请求,将HTTP-over-QUIC重命名为HTTP/3。
HTTP / 3使用与HTTP/1.1和HTTP/2相同的语义(相同的操做,例如GET和POST)和相同的响应代码(例如200或404),可是使用QUIC传输协议协议,以及采用相似于HTTP/2的内部成帧层提供HTTP语义的传输。
截止到2020年8月,HTTP/3协议已经成为Internet草案,而且具备多种实现方案,前1000万个网站中有6.7%支持HTTP / 3。在浏览器方面,Firefox和Chrome稳定版本都支持HTTP/3,可是默认状况下是禁用的,Safari 14将默认启用HTTP/3。
想进一步了解,能够阅读最新的发布于2020年8月14日的HTTP/3草案:Hypertext Transfer Protocol Version 3 (HTTP/3)[4]
目前咱们使用最广发的仍是HTTP/1.1,接下来我就基于HTTP/1.1来介绍下HTTP协议。
接下来,因为篇幅所限,为了给你们呈现更好的阅读体验,我把后续的内容分为如下章节,深刻细节更精彩,欢迎你们继续阅读:
这篇文章的内容就介绍到这里,可以阅读到这里的朋友真的是颇有耐心,为你点个赞。
本文为arthinking基于相关技术资料和官方文档撰写而成,确保内容的准确性,若是你发现了有何错漏之处,烦请高抬贵手帮忙指正,万分感激。
若是您以为读完本文有所收获的话,能够关注个人帐号,或者点赞吧,码字不易,您的支持就是我写做的最大动力,再次感谢!
为了把相关系列文章收集起来,方便后续查阅,这里我建立了一个Github仓库,把发布的文章按照分类收集起来了,感兴趣的朋友能够Star跟进:
关注个人博客IT宅(itzhai.com)
或者公众号Java架构杂谈
,及时获取最新的文章。我将持续更新后端相关技术,涉及JVM、Java基础、架构设计、网络编程、数据结构、数据库、算法、并发编程、分布式系统等相关内容。
本文同步发表于个人博客IT宅(itzhai.com)和公众号(Java架构杂谈)
做者:arthinking | 公众号:Java架构杂谈
博客连接:https://www.itzhai.com/articles/comprehend-the-underlying-principles-of-web-programming.html
版权声明: 版权归做者全部,未经许可不得转载,侵权必究!联系做者请加公众号。
Hypertext Transfer Protocol -- HTTP/1.0 RFC 1945. Retrieved from https://datatracker.ietf.org/doc/rfc1945/ ↩︎ ↩︎
HypertextTransferProtocol--HTTP/1.1 2068. Retrieved from https://tools.ietf.org/html/rfc2068 ↩︎
Hypertext Transfer Protocol -- HTTP/1.1 2616. Retrieved from https://tools.ietf.org/html/rfc2616 ↩︎
Hypertext Transfer Protocol Version 3 (HTTP/3). Retrieved from https://quicwg.org/base-drafts/draft-ietf-quic-http.html ↩︎