当面试时被问对http了解多少的时候(一)—— http 协议破冰篇

415 阅读13分钟

前言

曾经在面试的时候被问了一个问题,关于 http 你了解多少,听到这个问题的时候有点懵,想到了 http 的缓存,想到了 http 的响应状态码,想到了 http 和 https 的区别等等。但是不可否认,这些知识都是点,没有形成系统的知识框架,所以最近系统学了一下,在这里记录下来。下次被问到关于 http 你了解多少的时候思路就比较清晰了。

这是一个系列的记录与学习,因为内容比较长,所以每篇记录会有对应一个思维导图,看起来更加一目了然。

http 的创世纪诞生

1989 年,任职于欧洲核子研究中心(CERN)的蒂姆·伯纳斯 - 李(Tim Berners-Lee)发表了一篇论文,提出了在互联网上构建超链接文档系统的构想。这篇论文中他确立了三项关键技术:

  1. URI:即统一资源标识符,作为互联网上资源的唯一身份;
  2. HTML:即超文本标记语言,用来描述超文本文档;
  3. HTTP:即超文本传输协议,用来传输超文本;

这三项技术在如今的我们看起来已经是稀松平常,但在当时却是了不得的大发明。基于它们,就可以把超文本系统完美的运行在互联网上,让各地的人们能够自由的共享信息,蒂姆把这个系统称为“万维网”(World Wide Web),也就是我们现在熟知的 web。

所以在这一年,我们的英雄 “HTTP” 诞生了,从此开始了它伟大的征途。

http 的发展历史

1. HTTP/0.9

20 世纪 90 年代初期的互联网世界非常简陋,计算机的处理能力低,存储容量小,网速慢。网上的资源大部分都是纯文本,很多通信协议也都使用纯文本,所以 http 的设计也不可避免的受到了时代的限制。

这一阶段的 http 是个简单的文本协议,只有GET一个命令,只能获取文本资源,服务器发送完内容之后就关闭连接。

2. HTTP/1.0

随着互联网的发展,支持图文混排浏览器 Mosaic 的问世,服务器软件 Apache 的上线,以及计算机多媒体技术JPEG、MP3等的发展,从用户的需求的角度促进 http 的发展已经势在必行。

HTTP/1.0 版本在 1996年 正式发布,它在多方面增强了0.9版,形式上已经和我们现在的 http 差别不大了。

  1. 增加了 HEAD、POST 等新方法;
  2. 增加了相应状态码,标记可能的错误原因;
  3. 引入了 http Header 的概念,让 http 处理请求和响应更加灵活;
  4. 传输的数据不再仅限于文本;

HTTP/1.0 确立了大部分现在使用的技术,但它 不是正式标准,不具有实际的约束力。所以 HTTP/1.0 的发布对于当时正在蓬勃发展的互联网来说并没有太大的实际意义,各方势力仍然按照自己的意图继续在市场上奋力拼杀。

3. HTTP/1.1

“浏览器大战” 极大的推动了 web 的发展,在“浏览器大战” 结束后的 1999 年,HTTP/1.1 发布了 RFC 文档,标示着它是一个正式的标准,而不是一份可有可无的参考文档。这意味着今后互联网上所有的浏览器、服务器、网关等只要用到了 http 协议,就必须严格遵守这个标准。

HTTP/1.1 主要的变更点有:

  1. 增加了 PUT、DELETE 等新的方法;
  2. 增加了缓存管理和控制;
  3. 明确了连接管理,允许持久连接;
  4. 允许相应数据分块(chunked),有利于传输大文件;

HTTP/1.1 的推出可谓是“众望所归”,互联网在它的“保驾护航”下迈开了大步,由此走上了“康庄大道”,开启了后续的“Web 1.0”“Web 2.0”时代。现在许多的知名网站都是在这个时间点左右创立的,例如 Google、新浪、搜狐、网易、腾讯等。

4. HTTP/2

现有的 http 连接慢,无法跟上迅猛发展的互联网,无奈之下人们采用各种各样的方式去做性能的优化,比如常见的雪碧图、JS资源合并等。

终于有一天 Google 忍不住了,决定 “揭竿而起”。Google 首先开发了自己的浏览器 Chrome,然后推出了新的 SPDY 协议,并在 Chrome 里应用于自家服务器,从实际的用户方来“倒逼” http协议的变革。

Google 目前的全球占有率超过了60%,顺势把 SPDY 推上了标准的宝座,互联网标准化组织以 SPDY 为基础开始定制新版本的 http 协议,最终在 2015 年发布了 HTTP/2。

HTTP/2 的制定充分考虑了现今互联网的现状:宽带、移动、不安全等,在高度兼容HTTP/1.1的同事在 性能改善方面 做了很大努力,主要的特点有:

  1. 所有数据以二进制传输;
  2. 可以发起多个请求,同一个连接里面发送多个请求不再需要按照顺序来;
  3. 使用专用算法压缩头部,减少数据传输量;
  4. 允许服务器主动向客户端推送数据;
  5. 增强了安全性,要求加密通信;

5. HTTP/3

在 HTTP/2 还处于草案之时,Google 又发明了一个新的协议,叫做 QUIC,继续依托它的庞大的用户量和数据量,持续地推动 QUIC 协议称为互联网上的“既成事实”。

在 2018 年,互联网标准化组织提议将 “HTTP over QUIC”更名为“HTTP/3”并获得批准,HTTP/3 正式进入了标准化制订阶段,也许两三年后就会正式发布,到时候我们很可能会跳过 HTTP/2 直接进入 HTTP/3。

HTTP 是什么

详细了解了 http 的发展历史之后,再来看 http 是什么可能会更好的理解。简单的来说如下:

HTTP 就是超文本传输协议,也就是 HyperText Transfer Protocol。

但是这个回答太过简单了,我们再来深入看一下。中国有一个成语叫 “人如其名”,意思是一个人的性格和特点是与他的名字相符的。先来看一下 http 的名字:“超文本传输协议”,它可以拆成三个部分,分别是:“超文本”、“传输” 和 “协议”。我们理解了这三个词,也就明白了什么是 http。

1. 所谓 “协议”

http 是一个协议,协议是对参与者的一种行为约定和规范。

HTTP 是一个用在计算机世界里的协议。它使用计算机能够理解的语言确立了一种计算机之间交流通信的规范,以及相关的各种控制和错误处理方式。

2. 所谓 “传输”

所谓的“传输”其实很好理解,就是把一堆东西从 A 点搬到 B 点,或者从 B 点搬到 A 点, 即 “A<===>B”,这里面包含了两个重要的信息:

  1. http 协议是一个 “双向协议”
  2. 数据虽然是在A 和 B 之间传输,但并没有限制只有 A 和 B 这两个角色,允许中间有 “中转” 或者 “接力”。

这样,传输方式就从“A<===>B”,变成了“A<=>X<=>Y<=>Z<=>B”,A 到 B 的传输过程中可以存在任意多个“中间人”,而这些中间人也都遵从 HTTP 协议,只要不打扰基本的数据传输,就可以添加任意的额外功能,例如安全认证、数据压缩、编码转换等等,优化整个传输过程。总结一下的话:

HTTP 是一个在计算机世界里专门用来在两点之间传输数据的约定和规范。

3. 所谓 “超文本”

所谓“文本”,就表示 http 传输的不是 TCP/UDP 这些较为底层协议里被切分的杂乱无章的二进制包(datagram),而是完整的、有异议的数据,可以被浏览器、服务器这样的上层应用程序处理。

在互联网早期,“文本”只是简单的字符文字,但是发展到现在,“文本”的含义已经被大大拓展了,图片、音频、视频等,在 http 的眼里都可以算作是“文本”。

所谓“超文本”,就是“超越了普普通通的文本”,它是文字、图片、音频、视频等的混合体,还可以含有“超链接”,能够从一个“超文本”跳转到另一个“超文本”。


最后总结一下http是什么:

HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。

与 http 相关的一些概念

如今的互联网是一个强大而又复杂的网络,我们有必要了解与 http 相关的一些概念。

1. CDN

客户端和服务器是 http 协议的两个端点,客户端通常不会直接连接到服务器,中间会经过“重重关卡”,其中一个重要的角色就叫做 CDN。

CDN 的全称是 “Content Delivery Network”,翻译过来即为 内容分发网络,它应用了 http 协议里的缓存和代理技术,代替源站相应客户端的请求。那么,CDN 有什么好处呢?

简单来说,它可以缓存源站的数据,让浏览器不用“千里迢迢”的到达源站服务器,直接在半路就可以获得相应。如果 CDN 的调度算法很优秀,更可以找到离用户最近的节点,大幅缩短响应时间。

2. 爬虫

浏览器是一种用户代理,代替我们访问互联网。但 http 协议并没有规定用户代理后面必须是 “真正的人类” ,它完全可以使 “机器人” ,这些 “机器人” 的正式名称就叫做 “爬虫”,实际上一种可以自动访问 web 资源的应用程序。

“爬虫” 这个名字非常形象,他们就像是一只只不知疲倦的蚂蚁,在无边无际的网络世界里爬来爬去,不停地在网站间奔走,搜集抓取各种信息。据估计,互联网上至少有 50% 的流量都是由爬虫产生的。

爬虫 是怎么来的呢?

绝大多数是由各大搜索引擎放出来的,抓取网页存入庞大的数据库,再建立关键字索引,这样我们才能够在各大搜索引擎中快速的搜索到互联网各个行业的内容。

爬虫也有不好的一面,它会过度消耗网络资源,占用服务器和带宽,影响网站对真实数据的分析,甚至导致敏感信息泄露。所以又会出现“反爬虫”技术,通过各种手段来限制爬虫。其中一项就是“君子协定”,约定哪些该爬,哪些不该爬。

3. DNS

DNS 的全称是 Domain Name System,翻译为 域名系统

在 TCP/IP 协议中使用 IP 地址来标识计算机,数字形式的地址对于计算机来讲很方便,但是对于人类来讲却难以记忆和使用。于是 域名系统 出现了,核心是用有意义的名字来作为 IP 地址的等价替代。

在 DNS 中,域名 又被称为 主机名,为了更好地标记不同国家和组织的主机,并且让名字更好的记忆,所以被设计成了一个 有层次的结构

域名用 “ . ” 分隔成多个单词,级别从左到右逐级升高,最右边的被称为“顶级域名”。对于顶级域名,可能你随口就能说出几个,例如表示商业公司的 “com” 、表示教育机构的 “edu” ,表示国家的 “cn” “uk”等,买火车票时的域名还记得吗?是 “www.12306.cn” 。

但想要使用 TCP/IP 协议来通信仍然要使用 IP 地址,所以需要把域名做一个转换,映射 到它的真实 IP,这就是所谓的 域名解析

用打电话的例子来做个比喻,你想要打电话给小明,但不知道电话号码,就得在手机里的号码簿里一项一项地找,直到找到小明那一条记录,然后才能查到号码。这里的“小明”就相当于域名,而“电话号码”就相当于 IP 地址,这个查找的过程就是域名解析

HTTP 协议中并没有明确要求必须使用 DNS,但实际上为了方便访问互联网上的 Web 服务器,通常都会使用 DNS 来定位或标记主机名,间接地把 DNS 与 HTTP 绑在了一起。

4. URL

有了 TCP/IP 和 DNS,还是不是我们就可以任意访问网络上的资源了呢?

还不行,DNS 和 IP地址只是为了标记互联网上的主机,但是主机上有那么多的文本、图片和页面等资源,到底要找哪一个呢?

所以出现了 URL(Uniform Resource Locator),翻译为 统一资源定位符,也就是我们俗称的 网址

我就拿 Nginx 网站来举例,看一下 URI 是什么样子的。


    http://nginx.org/en/download.html

可以看到,URL 主要有三个基本的部分组成:

  1. 协议名:即访问该资源应该使用的协议,这里是 http。
  2. 主机名:即互联网主机的标记,可以使域名或 IP 地址,在这里是 “nginx.org”。代理(Proxy)是 HTTP 协议中请求方和应答方中间的一个环节,作为“中转站”,既可以转发客户端的请求,也可以转发服务器的应答。
  3. 路径:即资源在主机上的位置,使用 “/” 分割多级目录,在这里是 “/en/download.html”。

还是用打电话来做比喻,你通过电话簿找到了小明,让他把昨天做好的宣传文案快递过来。那么这个过程中你就完成了一次 URI 资源访问,“小明”就是“主机名”,“昨天做好的宣传文案”就是“路径”,而“快递”,就是你要访问这个资源的“协议名”。

5. 代理( Proxy )

代理(Proxy)是 HTTP 协议中请求方和应答方中间的一个环节,作为“中转站”,既可以转发客户端的请求,也可以转发服务器的应答。

代理有很多的种类,常见的有:

  1. 匿名代理:完全“隐匿”了被代理的机器,外界看到的只是代理服务器;
  2. 透明代理:顾名思义,它在传输过程中是“透明开放”的,外界既知道代理,也知道客户端;
  3. 正向代理:靠近客户端,代表客户端向服务器发送请求;
  4. 反向代理:靠近服务器端,代表服务器响应客户端的请求;

上一讲提到的 CDN,实际上就是一种代理,它代替源站服务器响应客户端的请求,通常扮演着透明代理和反向代理的角色。

由于代理在传输过程中插入了一个“中间层”,所以可以在这个环节做很多有意思的事情,比如:

  1. 负载均衡:把访问请求均匀分散到多台机器,实现访问集群化;
  2. 内容缓存:暂存上下行的数据,减轻后端的压力;
  3. 安全防护:隐匿 IP, 使用 WAF 等工具抵御网络攻击,保护被代理的机器;
  4. 数据处理:提供压缩、加密等额外的功能。