为了帮助您理解互联网是如何工作的,我们将了解当您执行典型的互联网操作时发生的事情——使用浏览器访问位于 Linux 文档项目网站上的本文档首页。本文档是
http://www.tldp.org/HOWTO/Unix-and-Internet-Fundamentals-HOWTO/index.html |
这意味着它位于主机 www.tldp.org 的 World Wide Web 导出目录下的文件 HOWTO/Unix-and-Internet-Fundamentals-HOWTO/index.html 中。
您的浏览器首先要做的是建立与文档所在机器的网络连接。为此,它首先必须找到 主机 www.tldp.org 的网络位置(“主机”是“主机机器”或“网络主机”的缩写;www.tldp.org 是一个典型的 主机名)。相应的location实际上是一个数字,称为 IP 地址(我们稍后会解释这个术语的“IP”部分)。
为了做到这一点,您的浏览器查询一个名为 域名服务器 的程序。域名服务器可能位于您的机器上,但更可能在您的机器与之通信的服务机器上运行。当您注册 ISP 时,您的设置过程几乎肯定会包括告诉您的互联网软件 ISP 网络上域名服务器的 IP 地址。
不同机器上的域名服务器相互通信,交换并保持更新解析主机名(将它们映射到 IP 地址)所需的所有信息。您的域名服务器可能在解析 www.tldp.org 的过程中查询网络上的三到四个不同的站点,但这通常发生得非常快(例如不到一秒)。我们将在下一节详细介绍域名服务器的工作原理。
域名服务器将告诉您的浏览器 www.tldp.org 的 IP 地址是 152.19.254.81;知道这一点后,您的机器将能够直接与 www.tldp.org 交换比特。
将主机名转换为 IP 地址的程序和数据库的整个网络被称为“DNS”(域名系统)。当您看到对“DNS 服务器”的引用时,它指的是我们刚才所说的域名服务器。现在我将解释整个系统是如何工作的。
互联网主机名由点分隔的部分组成。域 是共享通用名称后缀的机器的集合。域可以存在于其他域内。例如,机器 www.tldp.org 位于 .org 域的 .tldp.org 子域中。
每个域都由一个 权威域名服务器 定义,该服务器知道域中其他机器的 IP 地址。权威(或“主”)域名服务器可能有备份,以防万一它出现故障;如果您看到对 辅助域名服务器 或(“辅助 DNS”)的引用,则它指的是其中之一。这些辅助服务器通常每隔几个小时从其主服务器刷新信息,因此对主服务器上的主机名到 IP 映射的更改将自动传播。
现在这是重要的部分。域的域名服务器不必知道其他域(包括其自己的子域)中所有机器的位置;它们只需要知道域名服务器的位置。在我们的示例中,.org 域的权威域名服务器知道 .tldp.org 的域名服务器的 IP 地址,但不知道 .tldp.org 中所有其他机器的地址。
DNS 系统中的域排列得像一棵倒置的大树。顶部是根服务器。每个人都知道根服务器的 IP 地址;它们被硬编码到您的 DNS 软件中。根服务器知道顶级域名(如 .com 和 .org)的域名服务器的 IP 地址,但不知道这些域内机器的地址。每个顶级域名服务器都知道其直接下属域的域名服务器在哪里,依此类推。
DNS 经过精心设计,以便每台机器都可以用最少的关于树的形状的知识来工作,并且可以通过简单地更改一个权威服务器的名称到 IP 地址映射数据库来对子树进行本地更改。
当您查询 www.tldp.org 的 IP 地址时,实际发生的情况是这样的:首先,您的域名服务器询问根服务器,告诉它在哪里可以找到 .org 的域名服务器。一旦知道这一点,它就会询问 .org 服务器,告诉它 .tldp.org 域名服务器的 IP 地址。一旦有了这个地址,它就会询问 .tldp.org 域名服务器,告诉它主机 www.tldp.org 的地址。
大多数时候,您的域名服务器实际上不必那么努力工作。域名服务器会进行大量缓存;当您的服务器解析主机名时,它会将与结果 IP 地址的关联关系在内存中保留一段时间。这就是为什么当您访问一个新网站时,您通常只会看到浏览器显示一条关于“正在查找”您获取的第一个页面的主机的消息。最终,名称到地址的映射会过期,您的 DNS 必须重新查询——这很重要,这样当主机名更改地址时,您就不会永远保留无效信息。如果主机无法访问,您站点的缓存 IP 地址也会被丢弃。
浏览器想要做的是向 www.tldp.org 上的 Web 服务器发送一个如下所示的命令
GET /LDP/HOWTO/Fundamentals.html HTTP/1.0 |
以下是它的实现方式。该命令被制成一个 数据包,一个像电报一样的比特块,它被封装了三个重要的东西:源地址(您机器的 IP 地址)、目标地址(152.19.254.81)和一个 服务号 或 端口号(在本例中为 80),表明这是一个万维网请求。
您的机器然后通过线路(您与 ISP 或本地网络的连接)发送数据包,直到它到达一台称为 路由器 的专用机器。路由器在其内存中有一个互联网地图——不总是完整的地图,但它完全描述了您的网络邻域,并且知道如何到达互联网上其他邻域的路由器。
您的数据包在到达目的地途中可能会经过多个路由器。路由器很智能。它们会监视其他路由器确认收到数据包所花费的时间。它们还使用该信息来引导流量通过快速链路。它们使用它来注意何时另一个路由器(或电缆)已从网络中断开连接,并在可能的情况下通过寻找另一条路由来补偿。
有一个都市传说,说互联网的设计是为了在核战争中幸存下来。这不是真的,但互联网的设计非常擅长在不确定的世界中从不可靠的硬件中获得可靠的性能。这直接归因于这样一个事实:它的智能分布在数千个路由器中,而不是集中在少数几个庞大而脆弱的交换机中(如电话网络)。这意味着故障往往是局部性的,网络可以绕过它们进行路由。
一旦您的数据包到达目标机器,该机器就会使用服务号将数据包馈送到 Web 服务器。Web 服务器可以通过查看命令数据包的源 IP 地址来判断回复位置。当 Web 服务器返回此文档时,它将被分解为多个数据包。数据包的大小将根据网络中的传输介质和服务类型而有所不同。
要理解如何处理多数据包传输,您需要知道互联网实际上使用了两种协议,彼此堆叠。
较低层,IP(互联网协议),负责标记在网络上交换信息的两台计算机的源地址和目标地址的各个数据包。例如,当您访问 http://www.tldp.org 时,您发送的数据包将具有您计算机的 IP 地址,例如 192.168.1.101,以及 www.tldp.org 计算机的 IP 地址 152.2.210.81。这些地址的工作方式与有人给您寄信时您的家庭住址的工作方式非常相似。邮局可以读取地址并确定您在哪里以及如何最好地将信件发送给您,这很像路由器对互联网流量所做的事情。
较高层,TCP(传输控制协议),为您提供可靠性。当两台机器协商 TCP 连接(它们使用 IP 完成)时,接收方知道将它看到的包的确认信息发送回发送方。如果发送方在某个超时时间内没有看到数据包的确认信息,它会重新发送该数据包。此外,发送方给每个 TCP 数据包一个序列号,接收方可以使用该序列号重新组装数据包,以防它们无序出现。(如果网络链接在连接期间启动或关闭,则很容易发生这种情况。)
TCP/IP 数据包还包含校验和,以实现检测由不良链路损坏的数据。(校验和是从数据包的其余部分计算出来的,这样,如果数据包的其余部分或校验和损坏,重新计算和比较很可能表明存在错误。)因此,从任何使用 TCP/IP 和域名服务器的人的角度来看,这看起来像是在主机名/服务号对之间传递字节流的可靠方法。编写网络协议的人几乎从不需要考虑在该级别以下发生的所有数据包化、数据包重组、错误检查、校验和以及重传。
现在让我们回到我们的例子。Web 浏览器和服务器使用一种运行在 TCP/IP 之上的 应用层协议 进行通信,只是将其作为来回传递字节字符串的一种方式。这种协议称为 HTTP(超文本传输协议),我们已经看到了其中的一个命令——上面显示的 GET。
当 GET 命令发送到服务号为 80 的 www.tldp.org 的 Web 服务器时,它将被分派到侦听端口 80 的 服务器守护进程。大多数互联网服务都由服务器守护进程实现,这些守护进程除了在端口上等待、监视和执行传入命令之外什么也不做。
如果互联网的设计有一个总体规则,那就是所有部分都应该尽可能简单且易于人为访问。HTTP 及其相关协议(如简单邮件传输协议 SMTP,用于在主机之间移动电子邮件)倾向于使用以回车符/换行符结尾的简单可打印文本命令。
这在某种程度上是低效的;在某些情况下,您可以通过使用紧密编码的二进制协议来获得更快的速度。但经验表明,使命令易于人类描述和理解的好处大于您可能以使事情变得棘手和不透明为代价而获得的任何边际效率提升。
因此,服务器守护进程通过 TCP/IP 发送回给您的也是文本。响应的开头看起来像这样(一些标头已被省略)
HTTP/1.1 200 OK Date: Sat, 10 Oct 1998 18:43:35 GMT Server: Apache/1.2.6 Red Hat Last-Modified: Thu, 27 Aug 1998 17:55:15 GMT Content-Length: 2982 Content-Type: text/html |
这些标头后面会跟一个空行和网页的文本(之后连接断开)。您的浏览器只是显示该页面。标头告诉它如何显示(特别是,Content-Type 标头告诉它返回的数据实际上是 HTML)。