Web 使用一种名为 HTTP(HyperText Transfer Protocol,超文本传输协议)的协议作为规范,完成从客户端到服务器端等一系列运作流程。而协议是指规则则的约定。可以说,Web 是建立在 HTTP 协议上通信的。

 

HTTP 通常被译为超文本传输协议,但这种译法并不严谨。严谨的译名应该 为超文本转移协议

 

起初

1989 年 3 月,互联网还只属于少数人。在这一互联网的黎明期, HTTP 诞生了。

 

设想

CERN(欧洲核子研究组织)的蒂姆 • 伯纳斯 - 李(Tim BernersLee) 博士提出了一种能让远隔两地的研究者们共享知识的设想。

 

最初设想的基本理念是:借助多文档之间相互关联形成的超文本 (HyperText),连成可相互参阅的 WWW(World Wide Web,万维网)。

 

WWW 构建技术

现在已提出了 3 WWW 构建技术,分别是:

1.把 SGML(Standard Generalized Markup Language,标准通用标记语言)作为页面的文本标记语言的 HTML(HyperText Markup Language,超文本标记语言);

2.作为文档传递协议的 HTTP ;

3.指定文档所在地址的 URL(Uniform Resource Locator,统一资源定位符)。 

 

WWW 这一名称,是 Web 浏览器当年用来浏览超文本的客户端应用程序时的名称。现在则用来表示这一系列的集合,也可简称为 Web

 

成长史

 

1990 年 11 月,CERN 成功研发了世界上第一台 Web 服务器和 Web 浏览器。两年后,1992 年 9 月,日本第一个网站的主页上线了。

 

详细原资料:日本第一个主页

http://www.ibarakiken.gr.jp/www/

 

1990 年,大家针对 HTML1.0 草案进行了讨论,因HTML1.0 中存在多处模糊不清的部分,草案被直接废弃了。

 

详细原资料:HTML1.0

http://www.w3.org/MarkUp/draft-ietf-iiir-html-01.txt

 

1993 年 1 月,现代浏览器的祖先 NCSA(National Center for Supercomputer Applications,美国国家超级计算机应用中心)研发的 Mosaic 问世了。它以 in-line(内联)等形式显示 HTML的图像,在图像方面出色的表现使它迅速在世界范围内流行开来同年秋天,Mosaic 的 Windows 版和 Macintosh 版面世。使用 CGI 技术的 NCSA Web 服务器、NCSA HTTPd 1.0 也差不多是在这个时期出现的。

 

详细原资料:NCSA Mosaic bounce page

http://archive.ncsa.illinois.edu/mosaic.html

 

1994 年 的 12 月,网景通信公司发布了 Netscape Navigator 1.0,1995年微软公司发布 Internet Explorer 1.0 和 2.0。

 

紧随其后的是现在已然成为 Web 服务器标准之一的 Apache,当时它以 Apache 0.2 的姿态出现在世人眼前。而 HTML也发布了 2.0 版本。 那一年,Web 技术的发展突飞猛进。

 

时光流转,从 1995 年左右起,微软公司与网景通信公司之间爆发的浏览器大战愈演愈烈。两家公司都各自对HTML做了扩展,于是导致在写 HTML页面时,必须考虑兼容他们两家公司的浏览器。时至今日,这个问题仍令那些写前端页面的工程师感到棘手。

 

在这场浏览器供应商之间的竞争中,他们不仅对当时发展中的各种 Web 标准化视而不见,还屡次出现新增功能没有对应说明文档的情况。

 

2000 年前后,这场浏览器战争随着网景通信公司的衰落而暂告一段落。但就在 2004 年,Mozilla 基金会发布了 Firefox 浏览器,第二次 浏览器大战随即爆发Internet Explorer 浏览器的版本从6升到7前后花费了5年时间。之后 接连不断地发布了 8、9、10 版本。另外,Chrome、Opera、Safari 等 浏览器也纷纷抢占市场份额。

HTTP/0.9

HTTP 于 1990 年问世。那时的 HTTP 并没有作为正式的标准被建立。

 

1991年,万维网协会(World Wide Web Consortium,W3C)和互联网工程任务组(IETF)制定了 HTTP 0.9 标准。因为那个年代互联网还在普及,加上网速带宽低,所以 HTTP 0.9 只支持 GET 请求。因此被称为 HTTP/0.9。 现在的 HTTP 其实含有 HTTP1.0 之前版本的意思。

HTTP/1.0

HTTP 正式作为标准被公布是在 1996 年的 5 月,版本被命名为 HTTP/1.0,并记载于 RFC1945。虽说是初期标准,但该协议标准至今仍被广泛使用在服务器端。

 

HTTP 协议新增很多内容。首先是请求方式的多样化,从单一的 GET 请求,增加了 POST 命令和 HEAD 命令。除此之外,还支持发送任何格式的内容。这两项新增内容,不仅使得互联网不仅可以传输文字、传输图像、视频、二进制文件,还丰富了浏览器与服务器的互动方式。这为互联网的大发展奠定了基础。

 

再次,HTTP请求和回应的格式也变了。除了数据部分,每次通信都必须包括头信息(HTTP header),用来描述一些元数据。其他的新增功能还包括状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等。

 

但 HTTP/1.0 还是存在缺点:

第一点是:连接无法复用。HTTP 1.0 规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。如果还要请求其他资源,就必须再新建一个连接。

 

第二点是:Head-Of-Line Blocking(HOLB,队头阻塞)。HOLB 是指一系列包(package)因为第一个包被阻塞;当页面中需要请求很多资源的时候,HOLB 会导致在达到最大请求数量时,剩余的资源需要等待其它资源请求完成后才能发起请求。这会导致带宽无法被充分利用,以及后续健康请求被阻塞。

 

详细原资料:RFC1945 - Hypertext Transfer Protocol -- HTTP/1.0

http://www.ietf.org/rfc/rfc1945.txt

HTTP/1.1

W3C 组织为了解决 HTTP 1.0 遗留的问题,1997 年 1 月公布的 HTTP/1.1 是目前主流的 HTTP 协议版本。当初的 标准是 RFC2068,之后发布的修订版 RFC2616 就是当前的最新版本。

 

具体优化点:

 

缓存处理:在 HTTP 1.0 中主要使用 header 里的 If-Modified-Since,Expires 来做为缓存判断的标准,HTTP 1.1则引入了更多的缓存控制策略例如 Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。

 

带宽优化及网络连接的使用:针对网络开销大的问题,HTTP 1.1 在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。

 

错误通知的管理:在HTTP1.1中新增了24个错误状态响应码。

 

长链接:HTTP/1.1 加入 Connection:keep-alive 可以复用一部分连接,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。

 

 

HTTP 1.1 局限

 

不能多路复用:虽然加入 keep-alive 可以复用一部分连接,但域名分片等情况下仍然需要建立多个 connection,耗费资源,给服务器带来性能压力。

 

浏览器限制了同一个域名下的请求数量:pipeling 只部分解决了 HOLB。HTTP 1.1 尝试使用 pipeling 来解决队头阻塞问题,即浏览器可以一次性发出多个请求(同个域名、同一条 TCP 链接)。但 pipeling 要求返回是按序的,那么前一个请求如果很耗时(比如处理大图片),那么后面的请求即使服务器已经处理完,仍会等待前面的请求处理完才开始按序返回。

协议开销大。

 

有时传输的成本:HTTP/1 在使用时,header 里携带的内容过大,在一定程度上增加了传输的成本,并且每次请求 header 基本不怎么变化,尤其在移动端增加用户流量。

 

当前主流的协议版本还是HTTP/1.1版本。

 

详细原资料:RFC2616 - Hypertext Transfer Protocol -- HTTP/1.1

http://www.ietf.org/rfc/rfc2616.txt

 

HTTP 2.0

互联网的发展还是受到网络速度的限制。有个调侃的话,永远不要忽略一辆载满磁带的在高速公路上飞驰的卡车的带宽。大概意思说数据量大到一定程度时,物理运输无论是速度、安全性、便捷性都比网络传输好。

 

谷歌是业务首先提出云计算的概念;加上谷歌的公司文化特点是自己内部信息公开、透明,每个人都能了解到其他任何人当前的工作计划、代码等。谷歌为了解决内部系统传输数据慢的问题,自行研发的 SPDY 协议,目的是以最小化网络延迟,提升网络速度,解决 HTTP/1.1 效率不高的问题。

 

谷歌于2009 年公开了 SPDY 协议,W3C 组织协议不错。于是乎,W3C 将 SPDY 协议引入到 HTTP 协议中,在 2012 年发布 HTTP 2.0。

 

具体优化点:

 

二进制格式传输数据:PDY 协议是在 TCP 协议之上。相比 HTTP/1 的文本格式,HTTP/2 采用二进制格式传输数据,解析起来更高效,(头信息和数据体都是二进制,并且统称为"帧"(frame):头信息帧和数据帧。二进制协议的一个好处是,可以定义额外的帧。HTTP/2 定义了近十种帧,为将来的高级应用打好了基础。如果使用文本实现这种功能,解析数据将会变得非常麻烦,二进制解析则方便得多)。同时,还支持对 Header 压缩,减少头部的包体积大小。

 

双工模式:为了解决1.1版本利用率不高的问题,增加双工模式,即不仅客户端能够同时发送多个请求,服务端也能同时处理多个请求,解决了队头堵塞的问题。(HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,这个技术可以只通过一个 TCP连接就可以传输所有的请求数据。多路复用可以绕过浏览器限制同一个域名下的请求数量的问题。而且并发请求的数量比HTTP1.1大了好几个数量级,进而提高了网页的性能)

提高利用率:HTTP请求和响应中,状态行和请求/响应头都是些信息字段,并没有真正的数据,因此在2.0版本中将所有的信息字段建立一张表,为表中的每个字段建立索引,客户端和服务端共同使用这个表,他们之间就以索引号来表示信息字段,这样就避免了1.0旧版本的重复繁琐的字段,并以压缩的方式传输,提高利用率。

服务器推送不经请求服务端主动向客户端发送数据。

HTTP 3.0(QUIC)

QUIC (Quick UDP Internet Connections), 快速 UDP 互联网连接。

 

TCP 协议虽然能保证不丢包,但还是存在一些局限性。谷歌为了提高Web联网的速度决定推倒重来,吸收 TCP 快速打开的技术,缓存当前会话的上下文等优点,基于 UDP 协议研发一种名为QUIC (全称是“快速UDP互联网连接”)的实验性网络协议,并且使用运用在 Chrome 浏览器上。

 

具体优化点:


线头阻塞(HOL)问题彻底解决基于TCP的HTTP/2,尽管从逻辑上来说,不同的流之间相互独立,不会相互影响,但在实际传输方面,数据还是要一帧一帧的发送和接收,一旦某一个流的数据有丢包,则同样会阻塞在它之后传输的流数据传输而基于UDP的QUIC协议则可以更为彻底地解决这样的问题,让不同的流之间真正的实现相互独立传输,互不干扰。


切换网络时连接保持当前移动端的应用环境,用户的网络可能会经常切换,比如从办公室或家里出门,WiFi断开,网络切换为3G或4G。基于TCP的协议,由于切换网络之后,IP会改变,因而之前的连接不可能继续保持。而基于UDP的QUIC协议,则可以内建与TCP中不同的连接标识方法,从而在网络完成切换之后,恢复之前与服务器的连接。

 

我们可以在 Chrome 浏览器地址栏上输入 chrome://flags/ 来体验 QUIC。

原文地址https://mp.weixin.qq.com/s/sAwVivPofTTd0a0ahycRWw

 

原创面试复习图(点击菜单获取)