先看一下 HTTP(Hypertext Transfer Protocol)的名字:“超文本传输协议”,它能够拆成三个部分,分别是:“超文本”“传输”和“协议”。咱们从后往前来逐个解析,理解了这三个词,咱们也就明白了什么是 HTTP。html
首先,HTTP 是一个协议。不过,协议又是什么呢?nginx
协议必需要有两个或多个参与者,也就是“协”。面试
协议是对参与者的一种行为约定和规范,也就是“议”。算法
协议意味着有多个参与者为了达成某个共同的目的而站在了一块儿,除了要无疑义地沟通交流以外,还必须明确地规定各方的“责、权、利”,约定该作什么不应作什么,先作什么后作什么,作错了怎么办,有没有补救措施等等。后端
HTTP 是一个用在计算机世界里的协议。它使用计算机可以理解的语言确立了一种计算机之间交流通讯的规范,以及相关的各类控制和错误处理方式。浏览器
接下来咱们看 HTTP 字面里的第二部分:“传输”。缓存
HTTP 是一个“传输协议”,所谓的“传输”(Transfer)其实很好理解,就是把一堆东西从 A 点搬到 B 点,或者从 B 点搬到 A 点,即“A<===>B”。安全
第一点,HTTP 协议是一个“双向协议”。有两个最基本的参与者 A 和 B,从 A 开始到 B 结束,数据在 A 和 B 之间双向而不是单向流动。一般咱们把先发起传输动做的 A 叫作请求方,把后接到传输的 B 叫作应答方或者响应方。服务器
第二点,数据虽然是在 A 和 B 之间传输,但并无限制只有 A 和 B 这两个角色,容许中间有“中转”或者“接力”。只要不打扰基本的数据传输,就能够添加任意的额外功能,例如安全认证、数据压缩、编码转换等等,优化整个传输过程。网络
HTTP 是一个在计算机世界里专门用来在两点之间传输数据的约定和规范。
讲完了“协议”和“传输”,如今,咱们终于到 HTTP 字面里的第三部分:“超文本”。
在互联网早期,“文本”只是简单的字符文字,但发展到如今,“文本”的涵义已经被大大地扩展了,图片、音频、视频、甚至是压缩包,在 HTTP 眼里均可以算作是“文本”。
所谓“超文本”,就是“超越了普通文本的文本”,它是文字、图片、音频和视频等的混合体,最关键的是含有“超连接”,可以从一个“超文本”跳跃到另外一个“超文本”,造成复杂的非线性、网状的结构关系。
对于“超文本”,咱们最熟悉的就应该是 HTML 了,它自己只是纯文字文件,但内部用不少标签订义了对图片、音频、视频等的连接,再通过浏览器的解释,呈如今咱们面前的就是一个含有多种视听信息的页面。
OK,通过了对 HTTP 里这三个名词的详细解释,下次当你再面对面试官时,就能够给出比“超文本传输协议”这七个字更准确更有技术含量的答案:“HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范”。
HTTP 是一个用在计算机世界里的协议,它确立了一种计算机之间交流通讯的规范,以及相关的各类控制和错误处理方式。
HTTP 专门用来在两点之间传输数据,不能用于广播、寻址或路由。
HTTP 传输的是文字、图片、音频、视频等超文本数据。
HTTP 是构建互联网的重要基础技术,它没有实体,依赖许多其余的技术来实现,但同时许多技术也都依赖于它。
1989 年,任职于欧洲核子研究中心(CERN)的蒂姆·伯纳斯 - 李(Tim Berners-Lee)发表了一篇论文,提出了在互联网上构建超连接文档系统的构想。这篇论文中他确立了三项关键技术。
URI:即统一资源标识符,做为互联网上资源的惟一身份;
HTML:即超文本标记语言,描述超文本文档;
HTTP:即超文本传输协议,用来传输超文本。
20 世纪 90 年代初期的互联网世界很是简陋,计算机处理能力低,存储容量小,网速很慢,仍是一片“信息荒漠”。
这一时期的 HTTP 被定义为 0.9 版,结构比较简单,为了便于服务器和客户端处理,它也采用了纯文本格式,只容许用 “GET” 动做从服务器上获取 HTML 文档,而且在响应请求以后当即关闭链接,功能很是有限。
随着计算机技术的发展,新的软件和技术的出现,好比JPEG 图像格式,服务器软件 Apache等,须要对 HTTP 进行更新。HTTP/1.0 版本在 1996 年正式发布。它在多方面加强了 0.9 版,形式上已经和咱们如今的 HTTP 差异不大了,例如:
增长了 HEAD、POST 等新方法;
增长了响应状态码,标记可能的错误缘由;
引入了协议版本号概念;
引入了 HTTP Header(头部)的概念,让 HTTP 处理请求和响应更加灵活;
传输的数据再也不仅限于文本。
但 HTTP/1.0 并非一个“标准”,只是记录已有实践和模式的一份参考文档,不具备实际的约束力,至关于一个“备忘录”。
1995 年,网景的 Netscape Navigator 和微软的 Internet Explorer 开始了著名的“浏览器大战”,都但愿在互联网上占据主导地位。
这场战争最终微软的 IE 取得了决定性的胜利,而网景则“败走麦城”(但后来却凭借 Mozilla Firefox 又扳回一局)。
“浏览器大战”再一次极大地推进了 Web 的发展,HTTP/1.0 也在这个过程当中经受了实践检验。因而在“浏览器大战”结束以后的 1999 年,HTTP/1.1 发布了 RFC 文档,编号为 2616,正式确立了延续十余年的传奇。
从版本号咱们就能够看到,HTTP/1.1 是对 HTTP/1.0 的小幅度修正。但一个重要的区别是:它是一个“正式的标准”,而不是一份无关紧要的“参考文档”。这意味着从此互联网上全部的浏览器、服务器、网关、代理等等,只要用到 HTTP 协议,就必须严格遵照这个标准,至关因而互联网世界的一个“立法”。
HTTP/1.1 主要的变动点有:
增长了 PUT、DELETE 等新的方法;
增长了缓存管理和控制;
明确了链接管理,容许持久链接;
容许响应数据分块(chunked),利于传输大文件;
强制要求 Host 头,让互联网主机托管成为可能。
HTTP/1.1 的推出可谓是“众望所归”,互联网在它的“保驾护航”下迈开了大步,由此走上了“康庄大道”,开启了后续的“Web 1.0”“Web 2.0”时代。
不过因为 HTTP/1.1 太过庞大和复杂,因此在 2014 年又作了一次修订,原来的一个大文档被拆分红了六份较小的文档,编号为 7230-7235,优化了一些细节,但此外没有任何实质性的改动。
HTTP/1.1 发布以后,整个互联网世界呈现出了爆发式的增加,度过了十多年的“快乐时光”。这期间也出现了一些对 HTTP 不满的意见,主要就是链接慢,没法跟上迅猛发展的互联网,但 HTTP/1.1 标准一直“岿然不动”,无奈之下人们只好发明各式各样的“小花招”来缓解这些问题,好比之前常见的切图、JS 合并等网页优化手段。
Google 首先开发了本身的浏览器 Chrome,而后推出了新的 SPDY 协议,并在 Chrome 里应用于自家的服务器,如同十多年前的网景与微软同样,从实际的用户方来“倒逼”HTTP 协议的变革,这也开启了第二次的“浏览器大战”。Chrome 目前的全球的占有率超过了 60%。“挟用户以号令天下”,Google 借此顺势把 SPDY 推上了标准的宝座,互联网标准化组织以 SPDY 为基础开始制定新版本的 HTTP 协议,最终在 2015 年发布了 HTTP/2,RFC 编号 7540。
HTTP/2 的制定充分考虑了现今互联网的现状:宽带、移动、不安全,在高度兼容 HTTP/1.1 的同时在性能改善方面作了很大努力,主要的特色有:
二进制协议,再也不是纯文本;
可发起多个请求,废弃了 1.1 里的管道;
使用专用算法压缩头部,减小数据传输量;
容许服务器主动向客户端推送数据;
加强了安全性,“事实上”要求加密通讯。
虽然 HTTP/2 到今天已经四岁,也衍生出了 gRPC 等新协议,但因为 HTTP/1.1 实在是太过经典和强势,目前它的普及率还比较低,大多数网站使用的仍然仍是 20 年前的 HTTP/1.1。
在 HTTP/2 还处于草案之时,Google 又发明了一个新的协议,叫作 QUIC,并且仍是相同的“套路”,继续在 Chrome 和自家服务器里试验着“玩”,依托它的庞大用户量和数据量,持续地推进 QUIC 协议成为互联网上的“既成事实”。
2018 年,互联网标准化组织 IETF 提议将“HTTP over QUIC”改名为“HTTP/3”并得到批准,HTTP/3 正式进入了标准化制订阶段,也许两三年后就会正式发布,到时候咱们极可能会跳过 HTTP/2 直接进入 HTTP/3。
在这里简单小结一下今天的内容:
HTTP 协议始于三十年前蒂姆·伯纳斯 - 李的一篇论文;
HTTP/0.9 是个简单的文本协议,只能获取文本资源;
HTTP/1.0 确立了大部分如今使用的技术,但它不是正式标准;
HTTP/1.1 是目前互联网上使用最普遍的协议,功能也很是完善;
HTTP/2 基于 Google 的 SPDY 协议,注重性能改善,但还未普及;
HTTP/3 基于 Google 的 QUIC 协议,是未来的发展方向。
上网就要用到浏览器,常见的浏览器有 Google 的 Chrome、Mozilla 的 Firefox、Apple 的 Safari、Microsoft 的 IE 和 Edge,还有小众的 Opera 以及国内的各类“换壳”的“极速”“安全”浏览器。
那么你想过没有,所谓的“浏览器”究竟是个什么东西呢?
浏览器的正式名字叫“Web Browser”,顾名思义,就是检索、查看互联网上网页资源的应用程序,名字里的 Web,实际上指的就是“World Wide Web”,也就是万维网。
浏览器本质上是一个 HTTP 协议中的请求方,使用 HTTP 协议获取网络上的各类资源。固然,为了让咱们更好地检索查看网页,它还集成了不少额外的功能。
例如,HTML 排版引擎用来展现页面,JavaScript 引擎用来实现动态化效果,甚至还有开发者工具用来调试网页,以及五花八门的各类插件和扩展。
在 HTTP 协议里,浏览器的角色被称为“User Agent”即“用户代理”,意思是做为访问者的“代理”来发起 HTTP 请求。不过在不引发混淆的状况下,咱们一般都简单地称之为“客户端”。
刚才说的浏览器是 HTTP 里的请求方,那么在协议另外一端的应答方(响应方)又是什么呢?答案就是服务器,Web Server。
Web 服务器是一个很大也很重要的概念,它是 HTTP 协议里响应请求的主体,一般也把控着绝大多数的网络资源,在网络世界里处于强势地位。
当咱们谈到“Web 服务器”时有两个层面的含义:硬件和软件。
硬件含义就是物理形式或“云”形式的机器,在大多数状况下它可能不是一台服务器,而是利用反向代理、负载均衡等技术组成的庞大集群。但从外界看来,它仍然表现为一台机器,但这个形象是“虚拟的”。
软件含义的 Web 服务器可能咱们更为关心,它就是提供 Web 服务的应用程序,一般会运行在硬件含义的服务器上。它利用强大的硬件能力响应海量的客户端 HTTP 请求,处理磁盘上的网页、图片等静态文件,或者把请求转发给后面的 Tomcat、Node.js 等业务应用,返回动态的信息。
比起层出不穷的各类 Web 浏览器,Web 服务器就要少不少了,一只手的手指头就能够数得过来。
Apache 是老牌的服务器,到今天已经快 25 年了,功能至关完善,相关的资料不少,学习门槛低,是许多创业者建站的入门产品。
Nginx 是 Web 服务器里的后起之秀,特色是高性能、高稳定,且易于扩展。自 2004 年推出后就不断蚕食 Apache 的市场份额,在高流量的网站里更是不二之选。
此外,还有 Windows 上的 IIS、Java 的 Jetty/Tomcat 等,由于性能不是很高,因此在互联网上应用得较少。
TCP/IP 协议其实是一系列网络通讯协议的统称,其中最核心的两个协议是TCP和IP,其余的还有 UDP、ICMP、ARP 等等,共同构成了一个复杂但有层次的协议栈。
这个协议栈有四层,最上层是“应用层”,最下层是“连接层”,TCP 和 IP 则在中间:TCP 属于“传输层”,IP 属于“网际层”。协议的层级关系模型很是重要,我会在下一讲中再专门讲解,这里先暂时放一放。
IP 协议是“Internet Protocol”的缩写,主要目的是解决寻址和路由问题,以及如何在两点间传送数据包。IP 协议使用“IP 地址”的概念来定位互联网上的每一台计算机。能够对比一下现实中的电话系统,你拿着的手机至关于互联网上的计算机,而要打电话就必须接入电话网,由通讯公司给你分配一个号码,这个号码就至关于 IP 地址。
如今咱们使用的 IP 协议大多数是 v4 版,地址是四个用“.”分隔的数字,例如“192.168.0.1”,总共有 2^32,大约 42 亿个能够分配的地址。看上去好像不少,但互联网的快速发展让地址的分配管理很快就“捉襟见肘”。因此,就又出现了 v6 版,使用 8 组“:”分隔的数字做为地址,容量扩大了不少,有 2^128 个,在将来的几十年里应该是足够用了。
TCP 协议是“Transmission Control Protocol”的缩写,意思是“传输控制协议”,它位于 IP 协议之上,基于 IP 协议提供可靠的、字节流形式的通讯,是 HTTP 协议得以实现的基础。
“可靠”是指保证数据不丢失,“字节流”是指保证数据完整,因此在 TCP 协议的两端能够如同操做文件同样访问传输的数据,就像是读写在一个密闭的管道里“流动”的字节。
HTTP 是一个"传输协议",但它不关心寻址、路由、数据完整性等传输细节,而要求这些工做都由下层来处理。由于互联网上最流行的是 TCP/IP 协议,而它恰好知足 HTTP 的要求,因此互联网上的 HTTP 协议就运行在了 TCP/IP 上,HTTP 也就能够更准确地称为“HTTP over TCP/IP”。
在 TCP/IP 协议中使用 IP 地址来标识计算机,数字形式的地址对于计算机来讲是方便了,但对于人类来讲却既难以记忆又难以输入。
因而“域名系统”(Domain Name System, DNS)出现了,用有意义的名字来做为 IP 地址的等价替代。设想一下,你是愿意记“95.211.80.227”这样枯燥的数字,仍是“nginx.org”这样的词组呢?
在 DNS 中,“域名”(Domain Name)又称为“主机名”(Host),为了更好地标记不一样国家或组织的主机,让名字更好记,因此被设计成了一个有层次的结构。
域名用“.”分隔成多个单词,级别从左到右逐级升高,最右边的被称为“顶级域名”。对于顶级域名,可能你随口就能说出几个,例如表示商业公司的“com”、表示教育机构的“edu”,表示国家的“cn”“uk”等,买火车票时的域名还记得吗?是“www.12306.cn”。
但想要使用 TCP/IP 协议来通讯仍然要使用 IP 地址,因此须要把域名作一个转换,“映射”到它的真实 IP,这就是所谓的“域名解析”。
域名解析的实际操做要比刚才的例子复杂不少,由于互联网上的电脑实在是太多了。目前全世界有 13 组根 DNS 服务器,下面再有许多的顶级 DNS、权威 DNS 和更小的本地 DNS,逐层递归地实现域名查询。
HTTP 协议中并无明确要求必须使用 DNS,但实际上为了方便访问互联网上的 Web 服务器,一般都会使用 DNS 来定位或标记主机名,间接地把 DNS 与 HTTP 绑在了一块儿。
URI(Uniform Resource Identifier),中文名称是 统一资源标识符,使用它就可以惟一地标记互联网上资源。
URI 另外一个更经常使用的表现形式是 URL(Uniform Resource Locator), 统一资源定位符,也就是咱们俗称的“网址”,它其实是 URI 的一个子集,不过由于这二者几乎是相同的,差别不大,因此一般不会作严格的区分。
我就拿 Nginx 网站来举例,看一下 URI 是什么样子的。
http://nginx.org/en/download.html
你能够看到,URI 主要有三个基本的部分构成:
协议名:即访问该资源应当使用的协议,在这里是“http”;
主机名:即互联网上主机的标记,能够是域名或 IP 地址,在这里是“nginx.org”;
路径:即资源在主机上的位置,使用“/”分隔多级目录,在这里是“/en/download.html”。
浏览器和服务器是 HTTP 协议的两个端点,那么,在这二者之间还有别的什么东西吗?
固然有了。浏览器一般不会直接连到服务器,中间会通过“重重关卡”,其中的一个重要角色就叫作 CDN。
CDN,全称是“Content Delivery Network”,翻译过来就是“内容分发网络”。它应用了 HTTP 协议里的缓存和代理技术,代替源站响应客户端的请求。
CDN 有什么好处呢?
简单来讲,它能够缓存源站的数据,让浏览器的请求不用“千里迢迢”地到达源站服务器,直接在“半路”就能够获取响应。若是 CDN 的调度算法很优秀,更能够找到离用户最近的节点,大幅度缩短响应时间。
CDN 也是如今互联网中的一项重要基础设施,除了基本的网络加速外,还提供负载均衡、安全防御、边缘计算、跨运营商网络等功能,可以成倍地“放大”源站服务器的服务能力,不少云服务商都把 CDN 做为产品的一部分。
HTTPS 的全称是 “HTTP over SSL/TLS”,也就是运行在 SSL/TLS 协议上的 HTTP。
注意它的名字,这里是 SSL/TLS,而不是 TCP/IP,它是一个负责加密通讯的安全协议,创建在 TCP/IP 之上,因此也是个可靠的传输协议,能够被用做 HTTP 的下层。
由于 HTTPS 至关于“HTTP+SSL/TLS+TCP/IP”,其中的“HTTP”和“TCP/IP”咱们都已经明白了,只要再了解一下 SSL/TLS,HTTPS 也就可以轻松掌握。
SSL 的全称是“Secure Socket Layer”,由网景公司发明,当发展到 3.0 时被标准化,更名为 TLS,即“Transport Layer Security”,但因为历史的缘由仍是有不少人称之为 SSL/TLS,或者直接简称为 SSL。
SSL 使用了许多密码学最早进的研究成果,综合了对称加密、非对称加密、摘要算法、数字签名、数字证书等技术,可以在不安全的环境中为通讯的双方建立出一个秘密的、安全的传输通道,为 HTTP 套上一副坚固的盔甲。
你能够留心看一下浏览器地址栏,若是有一个小锁头标志,那就代表网站启用了安全的 HTTPS 协议,而 URI 里的协议名,也从“http”变成了“https”。
代理(Proxy)是 HTTP 协议中请求方和应答方中间的一个环节,做为“中转站”,既能够转发客户端的请求,也能够转发服务器的应答。
代理有不少的种类,常见的有:
匿名代理:彻底“隐匿”了被代理的机器,外界看到的只是代理服务器;
透明代理:顾名思义,它在传输过程当中是“透明开放”的,外界既知道代理,也知道客户端;
正向代理:靠近客户端,表明客户端向服务器发送请求;
反向代理:靠近服务器端,表明服务器响应客户端的请求;
CDN 实际上就是一种代理,它代替源站服务器响应客户端的请求,一般扮演着透明代理和反向代理的角色。
因为代理在传输过程当中插入了一个“中间层”,因此能够在这个环节作不少有意思的事情,好比:
负载均衡:把访问请求均匀分散到多台机器,实现访问集群化;
内容缓存:暂存上下行的数据,减轻后端的压力;
安全防御:隐匿 IP, 使用 WAF 等工具抵御网络攻击,保护被代理的机器;
数据处理:提供压缩、加密等额外的功能。
关于 HTTP 的代理还有一个特殊的“代理协议”(proxy protocol),它由知名的代理软件 HAProxy 制订,但并非 RFC 标准,我也会在以后的课程里专门讲解。
此次我介绍了与 HTTP 相关的各类协议,在这里简单小结一下今天的内容。
TCP/IP 是网络世界最经常使用的协议,HTTP 一般运行在 TCP/IP 提供的可靠传输基础上;
DNS 域名是 IP 地址的等价替代,须要用域名解析实现到 IP 地址的映射;
URI 是用来标记互联网上资源的一个名字,由“协议名 + 主机名 + 路径”构成,俗称 URL;
HTTPS 至关于“HTTP+SSL/TLS+TCP/IP”,为 HTTP 套了一个安全的外壳;
代理是 HTTP 传输过程当中的“中转站”,能够实现缓存加速、负载均衡等功能。
浏览器是 HTTP 协议里的请求方,即 User Agent;
服务器是 HTTP 协议里的应答方,经常使用的有 Apache 和 Nginx;
HTTP 是一种可以获取如 HTML 这样的网络资源的 protocol(通信协议)。它是在 Web 上进行数据交换的基础,是一种 client-server 协议,也就是说,请求一般是由像浏览器这样的接受方发起的。一个完整的 Web 文档一般是由不一样的子文档拼接而成的,像是文本、布局描述、图片、视频、脚本等等。
客户端和服务端经过交换各自的消息(与数据流正好相反)进行交互。由像浏览器这样的客户端发出的消息叫作 requests,被服务端响应的消息叫作 responses。