在开始探索之旅之前,我们准备了一些和本章内容有关的小题目,请大家先试试看。

这些题目是否答得出来并不影响接下来的探索之旅,因此请大家放轻松。 问题

下列说法是正确的(√)还是错误的(×)?

  1. http://www.nikkeibp.co.jp/ 中的 www 代表 World Wide Web 协议(对通信操作规则所作的定义)。

  2. 个人也可以申请注册互联网中的域名。

  3. 浏览器等网络应用程序实际上并不具备网络控制功能。 答案

  4. ×。http://www.nikkeibp.co.jp/ 中的 www 只是 Web 服务器上的一种命名。而且,World Wide Web 也不是一个协议的名字,而是 Web 的提出者最早开发的浏览器兼 HTML 编辑器的名字。

  5. √。如果是“.com”“.net”“.org”“.jp”(除“co.jp”“ne.jp”等“xx.jp”格式的域名外)1 等没有对注册对象范围进行限制的域名,任何个人都可以申请注册。此外,也有一种“.name”域名是专门为个人申请者准备的。

1中国的情况类似,个人可以申请“.cn”域名,但“.com.cn”“.net.cn”等域名则是不开放给个人注册的。此外,日本的域名体系中,“.jp”下级的域名用的是两个字母的命名,例如“.co.jp”“.ne.jp”,而中国使用的是三个字母的命名,例如“.com.cn”“.net.cn”。——译者注

  1. √。应用程序并不是自己去控制网络,而是委托操作系统来控制网络。 探索之旅的看点

探索之旅即将出发,出发之前我们先来介绍一下本次的看点。

{%}

(1)生成 HTTP 请求消息

本次探索之旅从用户在浏览器中输入网址(URL)开始。接下来,浏览器的工作会从对用户输入的网址进行解析开始。浏览器如何解析网址就是我们的第一个看点。然后,浏览器会根据网址的含义来生成请求消息。浏览器通过请求消息将用户需要哪些数据告知服务器,而请求消息实际的样子就是我们的第二个看点。只要理解了具体的消息长什么样,我们也就能够理解访问 Web 服务器时使用的 HTTP 协议的原理了。

(2)向 DNS 服务器查询 Web 服务器的 IP 地址

请求消息生成之后,浏览器会委托操作系统向 Web 服务器发送请求,但浏览器必须告诉操作系统接收方的 IP 地址才行,因此浏览器必须先查出 Web 服务器的 IP 地址。网址中只有 Web 服务器的域名,因此浏览器需要向 DNS 服务器查询域名对应的 IP 地址,浏览器如何进行这一操作也是本章看点之一。

(3)全世界 DNS 服务器的大接力

这时,我们的旅程进入到了 DNS 服务器帮助浏览器查询 IP 地址这一环节了。全世界共有上万台 DNS 服务器,它们相互接力才能完成 IP 地址的查询,而它们进行接力的方法也是本章看点之一。

(4)委托协议栈发送消息

查询到 IP 地址之后,浏览器就可以将消息委托给操作系统发送给 Web 服务器了,但这个委托到底是如何完成的呢?这也是本章看点之一。“委托给操作系统”这句话看似简单,但关于委托给操作系统,其实有非常详细的规则,必须要遵守这些规则才能完成操作。由于只有编写程序的人才需要精通这些规则,所以面向一般读者的图书中几乎很少见到对这些规则的解释。不过,对这些规则有个大概的理解还是会有很多好处的,因为理解了向操作系统进行委托时的规则,我们就能够明白做出某个委托时操作系统会给我们怎样的反馈,这可以说是相当于具体地理解了网络的潜在能力。这一点对于没有编程经验的人来说也很重要。 1.1 生成 HTTP 请求消息 1.1.1 探索之旅从输入网址开始

我们的探索之旅从在浏览器中输入网址开始 2,在介绍浏览器的工作方式之前,让我们先来介绍一下网址。网址,准确来说应该叫 URL3,如果我说它就是以 http:// 开头的那一串东西,恐怕大家一下子就明白了,但实际上除了“http:”,网址还可以以其他一些文字开头,例如“ftp:”“file:”“mailto:”4 等。

2某些情况下,浏览器的工作是从点击网页中的一个链接开始,大家可以认为这种情况与将链接中所包含的网址输入到浏览器的地址栏中是一样的。——译者注

3URL:Uniform Resource Locator,统一资源定位符。

4如果没有正确配置电子邮件软件,则即使在地址栏中输入“mailto:”也是无法正常工作的。

之所以有各种各样的 URL,是因为尽管我们通常是使用浏览器来访问 Web 服务器的,但实际上浏览器并不只有这一个功能,它也可以用来在 FTP5 服务器上下载和上传文件,同时也具备电子邮件客户端的功能。可以说,浏览器是一个具备多种客户端功能的综合性客户端软件,因此它需要一些东西来判断应该使用其中哪种功能来访问相应的数据,而各种不同的 URL 就是用来干这个的,比如访问 Web 服务器时用“http:”,而访问 FTP 服务器时用“ftp:”。

5FTP:File Transfer Protocol,文件传送协议。这是一种在上传、下载文件时使用的协议。使用 FTP 协议来传送文件的程序也被叫作 FTP。

图 1.1 列举了现在互联网中常见的几种 URL,根据访问目标的不同,URL 的写法也会不同。例如在访问 Web 服务器和 FTP 服务器时,URL 中会包含服务器的域名 6 和要访问的文件的路径名等,而发邮件的 URL 则包含收件人的邮件地址。此外,根据需要,URL 中还会包含用户名、密码、服务器端口号 7 等信息。

6域名:就是像 www.glasscom.com 这样以句点(.)分隔的名称。关于域名,1.2.2 节和 1.3.2 节有详细说明。

7端口号:1.4.3 节和第 6 章的 6.1.3 节有详细说明,这里请大家理解为一个用来识别要连接的服务器程序的编号。不同的服务器程序会使用不同的编号,例如 Web 是 80,邮件是 25 等。

{%}

图 1.1 URL 的各种格式

尽管 URL 有各种不同的写法,但它们有一个共同点,那就是 URL 开头的文字,即“http:”“ftp:”“file:”“mailto:”这部分文字都表示浏览器应当使用的访问方法。比如当访问 Web 服务器时应该使用 HTTP8 协议,而访问 FTP 服务器时则应该使用 FTP 协议。因此,我们可以把这部分理解为访问时使用的协议 9 类型 10。尽管后面部分的写法各不相同,但开头部分的内容决定了后面部分的写法,因此并不会造成混乱。

8HTTP:Hypertext Transfer Protocol,超文本传送协议。

9协议:通信操作的规则定义称为协议(protocol)。

10像“ file:”这样的 URL 在访问时是不使用网络的,因此说 URL 的开头部分表示的是协议类型并不完全准确,也许理解为“访问方法”会更好一些。 1.1.2 浏览器先要解析 URL

浏览器要做的第一步工作就是对 URL 进行解析,从而生成发送给 Web 服务器的请求消息。刚才我们已经讲过,URL 的格式会随着协议的不同而不同,因此下面我们以访问 Web 服务器的情况为例来进行讲解。

根据 HTTP 的规格,URL 包含图 1.2(a)中的这几种元素。当对 URL 进行解析时,首先需要按照图 1.2(a)的格式将其中的各个元素拆分出来,例如图 1.2(b)中的 URL 会拆分成图 1.2(c)的样子。然后,通过拆分出来的这些元素,我们就能够明白 URL 代表的含义。例如,我们来看拆分结果图 1.2(c),其中包含 Web 服务器名称 www.lab.glasscom.com,以及文件的路径名 /dir1/file1.html,因此我们就能够明白,图 1.2(b)中的 URL 表示要访问 www.lab.glasscom.com 这个 Web 服务器上路径名为 /dir/file1.html 的文件,也就是位于 /dir/ 目录 11 下的 file1.html 这个文件(图 1.3)。

11目录(directory)这个词的意思相当于 Windows 中的文件夹(folder)。

{%}

图 1.2 Web 浏览器解析 URL 的过程

{%}

图 1.3 路径名为 /dir/file1.html 的文件 1.1.3 省略文件名的情况

图 1.2(b)是一个以“http:”开头的典型 URL,但有时候我们也会见到一些不太一样的 URL,例如下面这个 URL 是以“/”来结尾的。

(a)http://www.lab.glasscom.com/dir/

我们可以这样理解,以“/”结尾代表 /dir/ 后面本来应该有的文件名被省略了。根据 URL 的规则,文件名可以像前面这样省略。

不过,没有文件名,服务器怎么知道要访问哪个文件呢?其实,我们会在服务器上事先设置好文件名省略时要访问的默认文件名。这个设置根据服务器不同而不同,大多数情况下是 index.html 或者 default.htm 之类的文件名。因此,像前面这样省略文件名时,服务器就会访问 /dir/index.html 或者 /dir/default.htm。

还有一些 URL 是像下面这样只有 Web 服务器的域名的,这也是一种省略了文件名的形式。

(b)http://www.lab.glasscom.com/

这个 URL 也是以“/”结尾的,也就是说它表示访问一个名叫“/”的目录 12。而且,由于省略了文件名,所以结果就是访问 /index.html 或者 /default.htm 这样的文件了。

12“/”目录表示目录层级中最顶层的“根目录”。也许单独一个“/”表示根目录的写法看上去很奇怪,其实只要明白目录的规则就很容易理解了。我们写目录名时会像“dir/”一样在末尾加上一个“/”,这一点大家应该没什么疑问,那么如果目录本身没有名字的话会怎么样呢?在上面的例子中,就相当于“dir/”去掉了其中的 dir,这样一来就只剩下一个“/”了,这就是表示根目录的“/”。对于目录层级最顶层的那个目录,我们出于方便的考虑把它叫作根目录,其实它本身并没有名字,因此我们仅用“/”来表示它。

那么,下面这个 URL 又是什么意思呢?

(c)http://www.lab.glasscom.com

这次连结尾的“/”都省略了。像这样连目录名都省略时,真不知道到底在请求哪个文件了,实在有些过分。不过,这种写法也是允许的。当没有路径名时,就代表访问根目录下事先设置的默认文件 13,也就是 /index.html 或者 /default.htm 这些文件,这样就不会发生混乱了。

13最早的时候这个文件被叫作“主页”(home page),意思就是当省略文件名时访问的那个默认的页面。随着 Web 的普及,这个词的意义似乎并没有被正确理解,现在不光是默认页面,似乎随便什么网页都可以被叫作主页了。

不过,下面这个例子就更诡异了。

(d)http://www.lab.glasscom.com/whatisthis

前面这个例子中,由于末尾没有“/”,所以 whatisthis 应该理解为文件名才对。但实际上,很多人并没有正确理解省略文件名的规则,经常会把目录末尾的“/”也给省略了。因此,或许我们不应该总是将 whatisthis 作为文件名来处理。一般来说,这种情况会按照下面的惯例进行处理:如果 Web 服务器上存在名为 whatisthis 的文件,则将 whatisthis 作为文件名来处理;如果存在名为 whatisthis 的目录,则将 whatisthis 作为目录名来处理 14。

14我们无法创建两个名字相同的文件和目录,因此不可能既有一个名为 whatisthis 的文件,同时又有一个名为 whatisthis 的目录。只要查询一下磁盘中的文件和目录,就可以知道 whatisthis 究竟是一个文件还是一个目录了,并不会产生歧义。

浏览器的第一步工作就是对 URL 进行解析。

1.1.4 HTTP 的基本思路

解析完 URL 之后,我们就知道应该要访问的目标在哪里了。接下来,浏览器会使用 HTTP 协议来访问 Web 服务器,不过在介绍这一环节之前,我们先来讲一讲 HTTP 协议到底是怎么回事。

{%}

图 1.4 HTTP 的基本思路

HTTP 协议定义了客户端和服务器之间交互的消息内容和步骤,其基本思路非常简单。首先,客户端会向服务器发送请求消息(图 1.4)。请求消息中包含的内容是“对什么”和“进行怎样的操作”两个部分。其中相当于“对什么”的部分称为 URI15。一般来说,URI 的内容是一个存放网页数据的文件名或者是一个 CGI 程序 16 的文件名,例如“/dir1/file1.html”“/dir1/program1.cgi”等 17。不过,URI 不仅限于此,也可以直接使用“http:”开头的 URL18 来作为 URI。换句话说就是,这里可以写各种访问目标,而这些访问目标统称为 URI。

15URI:Uniform Resource Identifier,统一资源标识符。

16CGI 程序:对 Web 服务器程序调用其他程序的规则所做的定义就是 CGI,而按照 CGI 规范来工作的程序就称为 CGI 程序。

17实际上,这个文件在 Web 服务器上未必是真实存在的,因为 Web 服务器可以通过重写规则对虚拟的 URI 进行映射。——译者注

185.4.3 节有详细说明。

相当于接下来“进行怎样的操作”的部分称为方法 19。方法表示需要让 Web 服务器完成怎样的工作,其中典型的例子包括读取 URI 表示的数据、将客户端输入的数据发送给 URI 表示的程序等。表 1.1 列举了主要的方法,通过这张表大家应该能够理解通过方法可以执行怎样的操作。

19也叫 HTTP 谓词,或者 HTTP 动词。——译者注