# 第一章 从浏览器地址栏开始

# 使用 HTTP 协议访问 Web

在浏览器地址栏内输入 URL 之后,信息会被送到某处,然后从某处获得回复,内容就会显示在 Web 页面上。

Web 页面当然不可能凭空显示出来,根据地址栏的 URL,Web 浏览器能从 Web 服务器获取文件资源等信息,从而显示出 Web 页面。

像这种发送请求的 Web 浏览器,我们称为客户端。存储文件资源并响应请求的,称为 Web 服务器。

# 万维网的发明

1989 年, 当时在 CERN 工作的 Tim Berners-Lee 博士写了一份关于建立一个通过网络传输超文本系统的报告。这个系统起初被命名为 Mesh,在随后的 1990 年项目实施期间被更名为万维网(World Wide Web)。它在现有的 TCP 和 IP 协议基础之上建立,由四个部分组成:

  • 个用来表示超文本文档的文本格式,超文本标记语言(HTML)。
  • 一个用来交换超文本文档的简单协议,超文本传输协议(HTTP)。
  • 一个显示(以及编辑)超文本文档的客户端,即网络浏览器。第一个网络浏览器被称为 WorldWideWeb。
  • 一个服务器用于提供可访问的文档,即 httpd 的前身。

这四个部分完成于 1990 年底,且第一批服务器已经在 1991 年初在 CERN 以外的地方运行了。 1991年8月16日,Tim Berners-Lee 在公开的超文本新闻组上发表的文章被视为是万维网公共项目的开始。

单行协议

HTTP 在应用的早期阶段非常简单,后来被称为 HTTP/0.9,有时也叫做单行(one-line)协议。

# HTTP 的诞生

1989 年 3 月,互联网还只属于少数人,在这互联网的黎明期间,HTTP 诞生了。欧洲核子组织的蒂姆博士提出了一种能让远隔两地的研究者们共享知识的设想。这个设想的基本理念是,借助文档之间相互关联形成的超文本 HyperText,连成可相互参阅的 World Wide Web

1990 年 11 月,欧洲核子组织成功研发了世界上第一台 Web 服务器和 Web 浏览器。

1992 年 9 月,日本第一个网站上线。

1993 年 1 月,现代浏览器的祖先 NCSA 研发的 Mosaic 问世。

1994 年 12 月,网景通信公司发布了 Netscape Navigator 1.0

1995 年,微软公司发布 Internet Explorer1.0 和 2.0

同时,基于 NCSA 研发的 httpd 服务器,Apache 服务器诞生了,是世界使用排名第一的 Web 服务器软件该软件开源

# HTTP 版本

# HTTP/0.9 – 单行协议

最初版本的 HTTP 协议并没有版本号,后来它的版本号被定位在 0.9 以区分后来的版本。 HTTP/0.9 极其简单:请求由单行指令构成,以唯一可用方法 GET 开头,其后跟目标资源的路径

GET / mypage.html;

响应也极其简单的:只包含响应文档本身。

<html>
  这是一个非常简单的HTML页面
</html>

# HTTP/1.0 – 构建可扩展性

由于 HTTP/0.9 协议的应用十分有限,浏览器和服务器迅速扩展内容使其用途更广:

  • 协议版本信息现在会随着每个请求发送(HTTP/1.0 被追加到了 GET 行)
  • 状态码会在响应开始时发送,使浏览器能了解请求执行成功或失败,并相应调整行为
  • 引入了 HTTP 头的概念,无论是对于请求还是响应,允许传输元数据,使协议变得非常灵活,更具扩展性。
  • 在新 HTTP 头(Content-Type)的帮助下,具备了传输除纯文本 HTML 文件以外其他类型文档的能力

一个典型的请求看起来就像这样:

请求头

GET /mypage.html HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)

响应头

200 OK
Date: Tue, 15 Nov 1994 08:12:31 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/html
<HTML>
一个包含图片的页面
  <IMG SRC="/myimage.gif">
</HTML>

接下来是第二个连接,请求获取图片:

GET /myimage.gif HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)
200 OK
Date: Tue, 15 Nov 1994 08:12:32 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/gif
(这里是图片内容)

在 1991-1995 年,这些新扩展并没有被引入到标准中以促进协助工作,而仅仅作为一种尝试:服务器和浏览器添加这些新扩展功能,但出现了大量的互操作问题。直到 1996 年 11 月,为了解决这些问题,一份新文档(RFC 1945)被发表出来

# HTTP/1.1 – 标准化的协议

HTTP/1.1 于 1997 年 1 月公布,是目前最主流的 HTTP 协议版本

HTTP/1.1 消除了大量歧义内容并引入了多项改进:

  • 连接可以复用,节省了多次打开 TCP 连接加载网页文档资源的时间
  • 增加管线化技术,允许在第一个应答被完全发送之前就发送第二个请求,以降低通信延迟
  • 支持响应分块
  • 引入额外的缓存控制机制
  • 引入内容协商机制,包括语言,编码,类型等
  • 感谢 Host 字段,能够使不同域名配置在同一个 IP 地址的服务器上

现在我们的请求就变得要负责一些了

GET /en-US/docs/Glossary/Simple_header HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/en-US/docs/Glossary/Simple_header
200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Wed, 20 Jul 2016 10:55:30 GMT
Etag: "547fa7e369ef56031dd3bff2ace9fc0832eb251a"
Keep-Alive: timeout=5, max=1000
Last-Modified: Tue, 19 Jul 2016 00:59:33 GMT
Server: Apache
Transfer-Encoding: chunked
Vary: Cookie, Accept-Encoding

# 与 HTTP 关系密切的协议

  • IP 负责传输的 IP(网络)协议

  • ARP 使用 ARP(地址解析)协议凭借 MAC(媒体收发)地址进行通信

  • TCP 确保可靠性的 TCP 协议

  • DNS 负责域名解析的 DNS 服务

# HTTP 协议结构图

1