http的发展
今天,http协议随处可见。只要是和网络有关的东西,基本都会和http有直接关联关系或间接关联关系,今天就来聊一聊它的 发展历程。
史前世纪
20 世纪 60 年代,美国国防部高等研究计划署(ARPA)建立了 ARPA 网,它有四个分布在各地的节点,被认为是如今互联网的“始祖”。然后在 70 年代,基于对 ARPA 网的实践和思考,研究人员发明出了著名的 TCP/IP 协议。由于具有良好的分层结构和稳定的性能,TCP/IP 协议迅速战胜其他竞争对手流行起来,并在 80 年代中期进入了 UNIX 系统内核,促使更多的计算机接入了互联网。
创世纪
1989 年,任职于欧洲核子研究中心(CERN)的蒂姆·伯纳斯 - 李(Tim Berners-Lee)发表了一篇论文,提出了在互联网上构建超链接文档系统的构想。这篇论文中他确立了三项关键技术。
- URI:即统一资源标识符,作为互联网上资源的唯一身份;
- HTML:即超文本标记语言,描述超文本文档;
- HTTP:即超文本传输协议,用来传输超文本。
http版本时代
- HTTP/0.9
- 这是后来才给这个版本命名,当时并不是这个名称。http/0.9结构比较简单,只支持纯文本格式,这主要是为了方便客户端和服务器的处理。蒂姆·伯纳斯 - 李最初设想的系统里的文档都是只读的,所以只允许用“GET”动作从服务器上获取 HTML 文档,并且在响应请求之后立即关闭连接,功能非常有限。
- http/1.0
- 1993 年,NCSA(美国国家超级计算应用中心)开发出了 Mosaic,是第一个可以图文混排的浏览器,随后又在 1995 年开发出了服务器软件 Apache。
- 同一时期,计算机多媒体技术也有了新的发展:1992 年发明了 JPEG 图像格式,1995 年发明了 MP3 音乐格式。
- 这些新技术产生之后,立刻就引起了大量网民的参与和研究,随后有不少标准被提出。经过一系列的草案,HTTP/1.0 版本在 1996 年正式发布。它在多方面增强了 0.9 版,形式上已经和我们现在的 HTTP 差别不大了,例如:
- 增加了 HEAD、POST 等新方法;
- 增加了响应状态码,标记可能的错误原因;
- 引入了协议版本号概念;
- 引入了 HTTP Header(头部)的概念,让 HTTP 处理请求和响应更加灵活;
- 传输的数据不再仅限于文本。
- 但是这个时候还不是一个标准,只是一份参考文档,没有约束力。
- http/1.1
- 1995 年,网景的 Netscape Navigator 和微软的 Internet Explorer 开始了著名的“浏览器大战”,都希望在互联网上占据主导地位。最终是微软的IE胜利了。这一次“大战”极大的推动了Web的发展,因为http/1.0经受住了考验,于是在“浏览器大战”结束之后的 1999 年,HTTP/1.1 发布了 RFC 文档,编号为 2616,正式确立了延续十余年的传奇。这是一个正式的标准,相较于http/1.0具体的变更有:
- 增加了 PUT、DELETE 等新的方法;
- 增加了缓存管理和控制;
- 明确了连接管理,允许持久连接;
- 允许响应数据分块(chunked),利于传输大文件;
- 强制要求 Host 头,让互联网主机托管成为可能。
- 1995 年,网景的 Netscape Navigator 和微软的 Internet Explorer 开始了著名的“浏览器大战”,都希望在互联网上占据主导地位。最终是微软的IE胜利了。这一次“大战”极大的推动了Web的发展,因为http/1.0经受住了考验,于是在“浏览器大战”结束之后的 1999 年,HTTP/1.1 发布了 RFC 文档,编号为 2616,正式确立了延续十余年的传奇。这是一个正式的标准,相较于http/1.0具体的变更有:
- http/2
- 互联网经过了十多年的发展,产生了一批Facebook、Apple、京东、淘宝等互联网巨头,这期间出现了不少的“声音”,主要就是连接慢,无法跟上互联网的发展。于是有一个巨头忍不住了,他就是google。google首先开发了自己的浏览器chrome,然后推出了新的SPDY协议运行在自己的浏览器上,因为google的用户众多,占了互联网的大半江山。最终google凭借着自己的用户量以及SPDY协议带来的众多好处把SPDY推上了标准协议的宝座。互联网标准化组织开始以SPDY协议为基础执行新的http协议,最终在 2015 年发布了 HTTP/2,RFC 编号 7540。主要的修改点有:
- 二进制协议,不再是纯文本;
- 可发起多个请求,废弃了 1.1 里的管道;
- 使用专用算法压缩头部,减少数据传输量;
- 允许服务器主动向客户端推送数据;
- 增强了安全性,“事实上”要求加密通信。
- 互联网经过了十多年的发展,产生了一批Facebook、Apple、京东、淘宝等互联网巨头,这期间出现了不少的“声音”,主要就是连接慢,无法跟上互联网的发展。于是有一个巨头忍不住了,他就是google。google首先开发了自己的浏览器chrome,然后推出了新的SPDY协议运行在自己的浏览器上,因为google的用户众多,占了互联网的大半江山。最终google凭借着自己的用户量以及SPDY协议带来的众多好处把SPDY推上了标准协议的宝座。互联网标准化组织开始以SPDY协议为基础执行新的http协议,最终在 2015 年发布了 HTTP/2,RFC 编号 7540。主要的修改点有:
- http/3
- 虽然http/2已经比较完美了,但是google还不满足于此,于是开始发明了新的协议,叫做QUIC。然后又用一样的套路,首先在自己的浏览器里使用,然后凭借着新协议的好处和用户量,再次把QUIC协议推上了标准化的宝座。
http是什么?
-
一般我们的映像里,http就是“超本文传输协议”,但是这个回答太简单了,不能让别人满足,同时也不能让自己满足,所以我们继续往下深挖,把“超文本传输协议”分开探索。
-
首先是协议。如果只有一个人参与,那就不需要协议,因为协议就是协商、讨论,所以参与者肯定有多个人(多方)。也就是http是一个用在计算机世界里的协议,它使用计算机能够理解的语言确立了一种计算机之间交流通信的规范,以及相关的各种控制和错误处理方式。
-
其次是传输。所谓的传输就是指把一堆东西从A点搬到B点,也可以从B点搬到A点,所以是可以双向的,并且需要两个点,通常把先发起传输动作的称为请求方,接收数据的称为响应方,同时也没有限制A和B的角色,所以可以添加额外的功能,例如添加:安全认证、数据编码压缩、负载均衡等等。到这里就可以认为http是一个在计算机世界里可以传输数据的约定和规范
-
最后是超文本。所谓“超文本”,就是“超越了普通文本的文本”,它是文字、图片、音频和视频等的混合体,最关键的是含有“超链接”,能够从一个“超文本”跳跃到另一个“超文本”,形成复杂的非线性、网状的结构关系。到这里就可以认为http是一个在计算机世界里可以传输文字、图片、音频和视频的约定和规范。
http相关的概念
- http世界里的概念定义有很多,所以我们需要先梳理一些知识点,然后分个类:
- 网络世界、浏览器、服务器不用解释,直接说说CDN吧。CDN是内容分发网络(content delivery network),它应用了http里面的缓存和代理技术,代替源站向客户端发送数据,可以大幅缩短请求的响应时间,同时还能提供负载均衡、安全防护、边缘计算、跨运营商网络等功能,能够增强源服务器的服务能力。
- 爬虫,据说现在互联网上一半的流量都是爬虫程序产生的。爬虫会爬取一些网站上的信息,这些爬虫基本是各大搜索引擎放出来的,用来搜集信息然后进行加工整理,在建立索引,这样我们检索的时候就能很快的查出来。爬虫也有不好的一面,它会过度消耗网络资源,占用服务器和带宽,影响网站对真实数据的分析,甚至导致敏感信息泄漏。所以,又出现了“反爬虫”技术,通过各种手段来限制爬虫。其中一项就是“君子协定”robots.txt,约定哪些该爬,哪些不该爬。
- html是 HTTP 协议传输的主要内容之一,它描述了超文本页面,用各种“标签”定义文字、图片等资源和排版布局,最终由浏览器“渲染”出可视化页面。HTML 目前有两个主要的标准,HTML4 和 HTML5。广义上的 HTML 通常是指 HTML、JavaScript、CSS 等前端技术的组合,能够实现比传统静态页面更丰富的动态页面。
- Web Service 是一种由 W3C 定义的应用服务开发规范,使用 client-server 主从架构,通常使用 WSDL 定义服务接口,使用 HTTP 协议传输 XML 或 SOAP 消息,也就是说,它是一个基于 Web(HTTP)的服务架构技术,既可以运行在内网,也可以在适当保护后运行在外网。因为采用了 HTTP 协议传输数据,所以在 Web Service 架构里服务器和客户端可以采用不同的操作系统或编程语言开发
- WAF 是近几年比较“火”的一个词,意思是“网络应用防火墙”。与硬件“防火墙”类似,它是应用层面的“防火墙”,专门检测 HTTP 流量,是防护 Web 应用的安全技术。WAF 通常位于 Web 服务器之前,可以阻止如 SQL 注入、跨站脚本等攻击,目前应用较多的一个开源项目是 ModSecurity,它能够完全集成进 Apache 或 Nginx。
- TCP/IP 协议实际上是一系列网络通信协议的统称,其中最核心的两个协议是 TCP 和 IP,其他的还有 UDP、ICMP、ARP 等等,共同构成了一个复杂但有层次的协议栈。IP 协议是“Internet Protocol”的缩写,主要目的是解决寻址和路由问题,以及如何在两点间传送数据包。TCP 协议是“Transmission Control Protocol”的缩写,意思是“传输控制协议”,它位于 IP 协议之上,基于 IP 协议提供可靠的、字节流形式的通信,是 HTTP 协议得以实现的基础。
- DNS(Domain Name System)域名系统是用有意义的字符串代替Ip地址,使人类能够更好的记忆。域名用“.”分隔成多个单词,级别从左到右逐级升高,最右边的被称为“顶级域名”。对于顶级域名,可能你随口就能说出几个,例如表示商业公司的“com”、表示教育机构的“edu”,表示国家的“cn”“uk”等。只不过用域名访问的时候会有一个域名解析的过程。
- URI/URL,URL(Uniform Resource Locator)统一资源定位符是URI(Uniform Resource Identifier)统一资源标识符的子集,不过一半不做区分,就是我们在互联网上访问一个资源时输入的一个确切的地址。
- HTTPS(HTTP over SSL/TLS),在TCP/IP、URI/URL和DNS的共同作用下,我们可以访问互联网上任意的资源。但是这也会造成一个问题,就是传输可能是不安全的,携带病毒。这时就出现了HTTPS,HTTPS采用加密传输,能够有效的防止数据在传输过程中被拦截、篡改。
网络分层模型
- TCP/IP 网络分层模型
- 我们来仔细地看一下这个精巧的积木架构,注意它的层次顺序是“从下往上”数的,所以第一层就是最下面的一层。
- 第一层叫“链接层”(link layer),负责在以太网、WiFi 这样的底层网络上发送原始数据包,工作在网卡这个层次,使用 MAC 地址来标记网络上的设备,所以有时候也叫 MAC 层。
- 第二层叫“网际层”或者“网络互连层”(internet layer),IP 协议就处在这一层。因为 IP 协议定义了“IP 地址”的概念,所以就可以在“链接层”的基础上,用 IP 地址取代 MAC 地址,把许许多多的局域网、广域网连接成一个虚拟的巨大网络,在这个网络里找设备时只要把 IP 地址再“翻译”成 MAC 地址就可以了。
- 第三层叫“传输层”(transport layer),这个层次协议的职责是保证数据在 IP 地址标记的两点之间“可靠”地传输,是 TCP 协议工作的层次,另外还有它的一个“小伙伴”UDP。
- 第四层叫“应用层”(application layer),由于下面的三层把基础打得非常好,所以在这一层就“百花齐放”了,有各种面向具体应用的协议。例如 Telnet、SSH、FTP、SMTP 等等,当然还有我们的 HTTP。
- MAC 层的传输单位是帧(frame),IP 层的传输单位是包(packet),TCP 层的传输单位是段(segment),HTTP 的传输单位则是消息或报文(message)。但这些名词并没有什么本质的区分,可以统称为数据包。
- OSI 网络分层模型
- 第一层:物理层,网络的物理形式,例如电缆、光纤、网卡、集线器等等;
- 第二层:数据链路层,它基本相当于 TCP/IP 的链接层;
- 第三层:网络层,相当于 TCP/IP 里的网际层;
- 第四层:传输层,相当于 TCP/IP 里的传输层;
- 第五层:会话层,维护网络中的连接状态,即保持会话和同步;
- 第六层:表示层,把数据转换为合适、可理解的语法和语义;
- 第七层:应用层,面向具体的应用传输数据。
- 因为ISO模型出现的时机比较晚,当时已经有很多的网络模型了,所以ISO并不是一个标准,更多的是作为一个参考模型的角色。它的一个好处就是规范了网络模型。
域名
- 我们知道http是运行在TCP/IP协议栈上的,IP的职责是“网际互联”,它在MAC之上,使用IP地址把MAC编号转换成了四位数字,这就对物理网卡的MAC做了一层抽象。但是四位数字对人类来说也是比较难记忆的,所以我们在来一次抽象,把四位数字抽象成具有实际意义的字符串,然后访问网址的时候就用这个字符串来代替IP地址,让客户端帮我们去解析成IP地址。
- 域名解析需要从右往左开始解析,最右边的需要根域名服务器解析出来,这样我们就得到了顶级域名服务器地址,然后拿权威域名去顶级域名服务器找到对应的权威域名服务器地址,最后再去权威域名服务器地址找到我们需要的主机地址。
- 因为上面的解析方式比较慢,所以一般我们浏览器会有一个地址缓存,本地也会有一个hosts文件映射域名、IP地址,同时操作系统也会有一个缓存,当这三个都没有找到时才会走上面的查询步骤。
以上内容参考自https://time.geekbang.org/column/intro/100029001?tab=catalog