「翻译」互联网是如何运作的?

原文地址: 「How does the Internet work?」 By Rus Shuler

这是一篇20年前的经典文章,里面有些概念已经过时,但仍然是一篇很好的科普文章,将互联网的每个细节都讲述得非常简单易懂。


简介

互联网是如何运作的?好问题!互联网经历了爆炸式的增长,我们不可避免地接受着来自电视、广播、杂志全方位的关于www.com的轰炸。正因为互联网已经占据了我们生活中的重要地位,透彻理解它的运行机制才能帮助我们最高效地运用这个新工具。

这份白皮书将介绍互联网运行的底层结构和技术。这篇文章并不会深入探讨,但涵盖了每个领域的内容,以便让读者对涉及的概念有基本的理解。对于有些没有回答的问题,文章末尾会有一个资源列表供大家参考。任何评论、建议、问题等都可以直接通过作者的邮箱与作者联系。


从哪儿开始?互联网地址

由于互联网是一个全球的计算机网络,因此每台连接到互联网的计算机都必须拥有一个独一无二的地址。互联网地址都是nnn.nnn.nnn.nnn的形式,其中nnn必须是一个0-255的数字。这个地址被称为IP地址(IP是互联网协议Internet Protocol的缩写,后文会有更多关于这个概念的内容)。

下图是两台计算机连接互联网的示意图,你的计算机的IP地址是1.2.3.4,另一台计算机的IP地址是5.6.7.8。互联网是两者之间的一个抽象物体。(在本文中,随着对互联网解释的逐步深入,这幅图会逐步详细起来)

image-20180907225128804

如果你通过一个互联网服务供应商(Internet Service Provider, ISP)连接到互联网,你通常会在连接期间被分配到一个临时的IP地址。如果你通过一个局域网(Local Area Network, LAN)连接到互联网,你的计算机可能会有一个永久的IP地址,或者通过动态主机配置协议(Dynamic Host Configuration Protocol, DHCP)服务器获取一个临时IP地址。但不管怎样,只要你连接到互联网,你的计算机就会有一个独一无二的IP地址。

试一试: Ping程序

如果你正在使用Windows系统或者某一种Unix系统,并且正连着互联网,有一个方便的方法来检测你的网络是否在线,这个方法就是ping。它很可能是依照一种老式的潜水艇声呐系统来命名的。如果你在使用Windows系统,打开命令行窗口。如果你在使用某一种Unix系统,则打开终端窗口。输入ping www.yahoo.com。ping程序会发送一个’ping’ (实际上是一个因特网控制信息协议(Internet Control Message Protocol, ICMP)回应请求信息)给特定的计算机。被ping到的计算机会回应一个消息。ping程序会计算消息返回的时间(如果有返回消息)。同样地,如果你输入的是一个域名(比如www.yahoo.com),而非一个IP地址,ping程序会解析域名,并显示对应的计算机IP地址。后文会深入讨论域名和地址。


协议栈和协议包

现在你的计算机已经连上互联网,而且有一个独一无二的地址了。那么它如何与其他连接互联网的计算机”对话“呢?我们来看看这个例子:假设你的IP地址是1.2.3.4,你希望给IP地址是5.6.7.8的计算机发送一个内容是”你好计算机5.6.7.8”的消息。

显然,这条消息必须通过某种连接你的计算机和互联网的线路来送达。假设你正在家中接入互联网服务供应商(ISP)的线路,这条消息需要通过家里的电话线来传达。那么,这条文字消息就必须翻译成电子信号传递到互联网的另一端,然后再翻译回文字信息。这是如何做到的呢?这就需要使用协议栈。每台计算机都需要协议栈来实现网络沟通,而且通常协议栈是嵌入到计算机的操作系统(如Windows, Unix等)中的。互联网使用的协议栈指的是TCP/IP协议栈,因为这是最主要的两个通讯协议。TCP/IP栈的内容如下:

协议层 注释
应用层 针对应用的协议,如www,电子邮件,FTP等
传输控制层 TCP通过端口号将包发送给计算机上的应用
网络层 IP通过IP地址将包发送给特定的计算机
物理层 将二进制的包数据转换成网络信号,再将网络信号转换成二进制包
(如以太网卡,电话线调解器等)

如果我们跟着计算机发送信息”你好计算机5.6.7.8”给IP地址是5.6.7.8的计算机,就会看到如下情况:

image-20180908102400167

  1. 信息从你的计算机的协议栈顶层开始,一路向下;
  2. 如果发送的信息内容过长,信息通过的每一层栈会将信息分解成小块的数据。这是因为数据在互联网(以及大部分计算机网络)中是以易控制的数据块形式传送的。在互联网中,这些数据块被称为
  3. 这些包会通过应用层到达TCP层。每一个包都会分配到一个端口。我们在后文中解释端口,目前知道很多程序使用TCP/IP栈来传送信息就足够了。我们通过特定的端口号来确定信息要传递给目标计算机的哪一个程序;
  4. 在TCP层之后,包来到IP层。在这里,每个包会接收到它们的目的地地址,5.6.7.8;
  5. 现在我们的信息包已经有了端口号和IP地址,它们可以通过互联网发送出去了。硬件层负责将包含有文字信息的包转换成电子信号,并通过电话线传递出去。
  6. 在电话线的另一头,你的ISP已经将电话线连入互联网。ISP的路由会检查每个包的目的地地址并确定将它们送到何处。通常包会被送到下一个路由。我们在后面讨论路由和互联网的架构;
  7. 最终,包被送给IP地址为5.6.7.8的计算机。这时,包会从目的地计算机的TCP/IP栈的最底层开始,并一路向上;
  8. 信息在协议栈逐步向上的过程中,所有由发送信息的计算机添加的路由数据(如IP地址和端口号)会从数据包上剥离出来;
  9. 当数据到达栈的顶层时,数据被重新组装成原始信息”你好计算机5.6.7.8”;

网络基础设施

现在你知道包是如何从一台计算机通过互联网传递到另一台计算机的了。但计算机和计算机中间是什么呢?到底是什么构成了互联网呢?让我们看看下面这个图:

image-20180908102418275

这张图在图1的基础上添加了一些细节。计算机通过电话线连接到ISP的部分很容易理解,但是其余的部分可能需要解释一下。

ISP有许多调制器供他们的客户来拨入,并且有专门的计算机来控制调制器池发送到主干路由器或专门的路由线路的数据流。这个设置被称为端口服务器,它负责连入互联网。网络账单和使用信息都是从这里收集的。

当你的包穿过电话线路和你的ISP的本地设备后,他们就进入到ISP的主干线路或者ISP购买的带宽。从此刻开始,数据包通常要经历数个路由和数个主干线路、专用线路,和其他网络,直到最终到达终点——地址是5.6.7.8的计算机。但是如果我们能知道包应该送到哪个路由不是更好吗?的确有一个办法:

试一试:路由跟踪

如果你使用的是Windows或某种Unix的系统,并且正连着网络,有一个方便的检测程序叫做路由跟踪,它能够显示你的包传送给特定互联网地址的路径。和ping一样,你需要在命令行工具中使用路由跟踪。Windows系统输入tracert www.yahoo.com,Unix系统输入traceroute www.yahoo.com。和ping一样,你也可以输入一个IP地址,而不是域名。路由跟踪程序会列出到达终点需要经过的路由、计算机或其他互联网入口。

通过路由跟踪,你会发现你的包要经过很多地方才能到达终点。大多数地点都有很长的名字,例如sjc2-core1-h2-0-0.atlas.digex.netfddi0-0.br4.SJC.globalcenter.net。这些互联网路由决定了你的包被发往何处。图3中标出了一些网络路由,但是数量并不多。它只是一个简易的网络结构示意。真实的互联网要复杂得多。


互联网架构

互联网主干是由很多相互连接的大型网络构成的。这些大型网络被称为**网络服务供应商(Network Service Providers, NSPs)。网络服务供应商包括UUNet, CerfNet, IBM, BBN Planet, SprintNet, PSINet,还有其他的供应商。这些网络同行互相交换信息包。每个网络服务供应商都被要求连接三个网络接入点(Network Access Points, NAPs)。在网络接入点,包信息从一个NSP的主干传递到另一个NSP的主干。NSP们和城域交换机(Metropolitan Area Excahnges, MAEs)相互连接。城域交换机的作用和网络接入点一样,只不过它们是私人的,NAP是最原始的互联网连接点。网络接入点和城域交换机都是网络交换点(Internet Exchange Points, IXs)**。网络服务供应商也向小型网络(如互联网服务供应商,和小型带宽供应商)出售带宽。下图显示的是他们之间的层级关系。

image-20180908113313776

这并不是真实的互联网。图4只是为了展示网络服务供应商之间以及网络服务供应商与互联网服务供应商之间是如何相互连接的。图3中展示的物理网络组件并没有在图4中展现出来,这是因为每个独立的网络服务供应商的主干架构都能够绘制一张复杂的图示,大多数网络服务供应商都绘制了自己的主干架构并发布在他们的官网上。考虑到互联网的大小、复杂程度和不断变化的结构,想要绘制一张真实的互联网地图几乎是不可能完成的事。


互联网路由层级

那么信息包是如何在网络中找到正确路径的呢?连接网络的计算机是否知道需要联络的另一台计算机在哪里呢?信息包会直接“广播”信息给每一台连接网络的计算机吗?以上两个问题的答案都是否定的。没有计算机知道需要联络的另一台计算机在哪儿,信息包也不会把信息发送给每一台计算机。让信息包找到传送路线的信息包含在连接互联网的每一台路由的路由表中。

路由是包交换机。路由连接着不同的网络,并在网络间传递信息包。每个路由都知道他们的子网络和子网络使用那些IP地址。路由通常不知道它的上级的IP地址。从图5可以看到,那些连接主干网络的黑色盒子就是路由。顶部大型网络服务供应商的主干网络通过网络接入点连接。在他们下面有很多子网络,子网络下面有更多的子网络。底部是连接着数台计算机的城域网络。

image-20180908121121893

当数据包传递到路由时,路由会检查原始计算机上IP协议层的IP地址,接着检查自己的路由表。如果它的网络中包含这个IP地址,数据包就会传送到这个网络,如果不包含这个IP地址,路由就会将数据包传递给一个默认的路径,通常是顺着主干网络层级传给上一级路由,看看上一级路由是否能检查到数据包的传送地址。如果还是没有包含这个IP地址,数据包会再一次向上一级路由传递,直到传递到网络服务供应商主干(NSP Backbone)。连接各个路由的网络服务供应站拥有信息量最大的路由表,数据包在这里能够找到相应的主干网络,接着一级一级向下传递给越来越小的网络,直到到达目的地。


域名和地址解析

但是如果你不知道你想要连接的计算机的IP地址呢?如果你想要连接另一个叫做www.anothercomputer.com的服务器呢?你的浏览器如何知道这台计算机在互联网的什么地方呢?这些问题的答案就是**域名服务(Domain Name Service, DNS)**。DNS是一个记录互联网中各计算机的名称和他们对应的IP地址的分布式数据库。

许多连接到网络的计算机都是DNS数据库的一部分,也允许软件访问它们。这些计算机被称为DNS服务器。没有任何一个DNS服务器拥有整个数据库,它们都只包含数据库的一部分。如果计算机访问了一台DNS服务器,并请求了这台服务器没有的域名,服务器会把这条请求重定向给另一台DNS服务器。

image-20180908142239057

DNS的层级结构与IP路由层级类似。当计算机发出域名解析请求时,DNS会逐级向上重定向,直到有一条DNS服务器能够解析请求中的域名。图6展示了这个层级结构的一部分。在层级的顶部是根域。一些古老的、常见的域名都出现在靠近根域的部分。这样一来,所有需要解析域名的互联网应用都能正常运行。打个比方,当你在浏览器的地址栏输入一个地址后,浏览器会首先连接你的主域名服务器。在获取到你输入的域名的IP地址后,浏览器会连接目标计算机,并请求你想要的网页。

试一试: 在Windows中禁用DNS

如果你在使用Windows 95/NT并且连着网,你可以查看你的DNS服务器,甚至禁用它们。

如果你使用电话拨号上网:

打开你的拨号窗口,右键点击网络连接,并选择属性,在底部点击TCP/IP设置按钮。

如果你永久连接到网络:

右键点击网络邻居并选择属性,点击TCP/IP属性,选择顶部的DNS配置。

你现在就能看见你的DNS服务器的IP地址了。在这里你可以选择禁用DNS,或者将你的DNS服务器地址设置成0.0.0.0(先记下你的DNS服务器的IP地址,你还需要重启计算机)现在在浏览器中输入一个地址。浏览器此时就无法解析域名了,你还有可能会受到一个对话框告诉你找不到DNS服务器了。但不管怎样,如果你输入的是相应的IP地址,而不是域名的话,浏览器还是能够获取到你想要查找的网页。(ping在禁用DNS之前会先找到IP地址)其他Windows操作系统的操作方法都类似。


互联网协议回顾

如我们在协议栈那一节中提到的,大家可能会猜测互联网涉及到很多协议。的确是这样,互联网的运行需要很多通信协议,包括TCP和IP协议,路由协议,媒体访问控制协议,应用层协议等。接下来这一节会讨论互联网中更重要也更常用的协议。我们先讨论高级协议,再讨论低级协议。


应用协议: HTTP和万维网

互联网中最常用的服务就是万维网(World Wide Web, WWW)。使网页能够运作的应用协议叫做**超文本传输协议(Hypertext Transfer Protocol, HTTP)**。不要将它和超文本标记语言(Hypertext Markup Language, HTML)搞混淆了。HTML是用来写网页的语言。HTTP是浏览器和服务器在互联网上彼此通信的协议。它是应用层协议,因为它位于协议栈的顶层,而且是特定应用用来彼此通信的。在这里,应用指的是浏览器和web服务器。

HTTP是一种基于无连接文本的协议。用户端(浏览器)给web服务器发送web元素(如文本页面或图片)的请求。服务器提供服务请求后,客户端和服务器之间的连接就会断开。每次请求都必须建立新的连接。大多数协议是面向连接的。也就是还说两台计算机在保持连接的情况下互相通信。但是HTTP并不是这样。在客户端发出HTTP请求前,必须先与服务器建立连接。

当你在浏览器中输入url网址后,会发生如下事件:

  1. 如果url网址包含一个域名,浏览器会先连接域名所在服务器,并检索web服务器的相应IP地址
  2. 浏览器连接到web服务器,并(通过协议栈)发送HTTP请求,请求想要获取的网页
  3. web服务器收到请求后检查请求的网页是否存在,如果网页存在,服务器就会发送网页回去,如果服务器找不到请求的页面,就会发送一个HTTP 404错误信息(404表示”页面不存在(Page Not Found))
  4. 浏览器收到返回的页面,连接断开
  5. 浏览器开始解析页面,并查找完成页面需要的其他元素,通常包括图片、小程序等
  6. 对于其他需要的元素,浏览器会创建额外的连接,并给元素所在的服务器发送HTTP请求
  7. 当浏览器加载完所有的图片、小程序等后,页面就完整地呈现在浏览器窗口中

试一试:试试用远程客户端通过HTTP请求网页

远程客户端是互联网上的一个远程终端服务。近几年使用它的人减少了很多,但它是一个非常有用的学习互联网的工具。在Windows中找到默认的远程程序,它通常在Windows目录下,名称为telnet.exe。打开程序后,拉终端菜单到最下方,选择”偏好”。在偏好窗口中,选择Local Echo。(这样你就在输入HTTP请求时就能看见它了)接着来到连接菜单,并选择远程系统。输入www.google.com作为域名,80作为端口号。(通常web服务器默认监听80端口)点击连接,输入
GET/HTTP/1.0
点击回车两次。这是一个简单的根页面HTTP请求。你应该会看见网页闪了一下,然后一个对话框弹出来,告诉你连接断开。如果你想要保存检索到的页面,在终端程序中打开日志选项。接着就能浏览检索到的页面,并且查看它的HTML文件。

大多数互联网协议由被称为**请求评议(Request For Comments, RFCs)**的网络文档来指定。RFCs可以在网上很多地方找到。资源那一小结中有URL的RFC,HTTP第1.0版是由RFC 1945规定的。


应用协议: SMTP和电子邮件

另一个常用的网络服务是电子邮件。电子邮件使用一个叫做**简单邮件传输协议(Simple Mail Transfer Protocol, SMTP)**的应用层协议。STMP同时也是一个基于文本的协议,不同于HTTP,它是面向连接的。SMTP比HTTP更复杂一些,SMTP中的命令和注意事项比HTTP多得多。

当你打开邮件客户端读取你的电子邮件时,会发生以下事件:

  1. 邮件客户端连接到它的默认邮件服务器。邮件服务器的IP地址或域名通常在邮件客户端下载时就设置好了
  2. 总是由邮件服务器发送第一条信息,标识自己的身份
  3. 客户端会发送一个SMTP HELO命令,接着服务器会回复一个250 OK信息
  4. 根据实际情况,客户端会发送相应的SMTP命令给服务器来检查或发送邮件,服务器会给出相应的回复
  5. 客户端和服务器会一直保持请求/回复状态,直到客户端发送SMTP QUIT命令。接着服务器会发送再见信息,连接会关闭

下面是一个简单的SMTP客户端和SMTP服务器的简单”对话“。R表示服务器发送的信息,S表示客户端发送的信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
这个SMTP案例展示了Smith在主机USC-ISIF上,给Jones, Green,和Brown的主机BBN-UNIX发送邮件的过程。这里我们假设主机USC-ISIF直接连接主机BBN-UNIX。Jones和Brown收到了邮件。Green在主机BBN-UNIX上没有邮箱。

-------------------------------------------------------------

R: 220 BBN-UNIX.ARPA Simple Mail Transfer Service Ready
S: HELO USC-ISIF.ARPA
R: 250 BBN-UNIX.ARPA

S: MAIL FROM:<Smith@USC-ISIF.ARPA>
R: 250 OK

S: RCPT TO:<Jones@BBN-UNIX.ARPA>
R: 250 OK

S: RCPT TO:<Green@BBN-UNIX.ARPA>
R: 550 No such user here

S: RCPT TO:<Brown@BBN-UNIX.ARPA>
R: 250 OK

S: DATA
R: 354 Start mail input; end with <CRLF>.<CRLF>
S: Blah blah blah...
S: ...etc. etc. etc.
S: .
R: 250 OK

S: QUIT
R: 221 BBN-UNIX.ARPA Service closing transmission channel

SMTP协议由RFC 821规定。


传输控制协议

在协议栈中,应用层下面是TCP层。当应用与互联网中的另一台计算机建立连接时,他们(通过特定的应用层协议)发送的信息会传递到TCP层。TCP层负责将应用程序协议导向目标计算机的正确应用程序上。端口号用来达到这一目标。端口就像计算机上的不同频道。打个比方,你浏览网页的同时也能查看邮件,这是因为这两个应用程序(浏览器和邮件客户端)使用不同的端口号。当数据包传递到计算机上时,它在协议栈中一路向上传递,TCP层根据它的端口号决定哪一个程序接收到这个数据包。

TCP的工作机制如下:

  • 当TCP层接收到来自上层的应用层协议数据时,TCP层将数据拆分成可管理的”块“,并给每个”块“添加一个包含特定TCP层信息的TCP头。TCP头中的信息包括数据需要送达的应用程序的端口号;
  • 当TCP层收到来自下层的IP层的数据包时,TCP层将TCP头数据从数据包上剥离开,如有必要会重建部分数据,然后根据TCP头中的端口号将数据传递给正确的应用程序;

这就是TCP如何在协议栈中将数据导向正确的应用程序。

TCP不是文本协议。TCP是一个面向连接的、可靠的字节流服务。面向连接意味着当两个应用程序使用TCP时,必须先建立连接,再交换数据。TCP可靠是因为每接收到一个数据包,它都会给发送者发送一个确认送达的信息。TCP头信息中还包括检查收到的数据是否有错误的校验码。TCP头如下:

image-20180908154449390

需要注意的是,TCP头中不包含IP地址,这是因为TCP并不知道关于IP地址的任何信息。TCP只负责准确地将应用层的数据从应用程序导向应用程序。负责将数据从计算机导向计算机是IP层的活儿。

试一试:众所周知的互联网端口号

下面是一些常用的互联网服务的端口号:

服务 端口号
FTP 20/21
Telnet 23
SMTP 25
HTTP 80
Quake III Arena 27960

互联网协议

不同于TCP,IP是不可靠的、无连接的协议。IP并不在意数据是否送达目的地,它也不关心连接和端口号。IP的任务就是给其他计算机发送数据包。IP数据包是独立的实体,可能无序或根本没有送达。TCP的工作才是确保数据包送达且顺序正确。IP和TCP唯一的共同之处就是,收到数据后,IP也会给数据添加自己的头信息。IP头如下:

image-20180908155521466

上图中,我们能看到IP头信息时包含发送和接收数据的计算机的IP地址的。下图显示了当一个数据包依次从应用层、TCP层和IP层传递后的样子。应用层数据在TCP层被拆分,并添加TCP头,然后到达IP层,添加IP头,接着数据被传递到互联网的另一边。

image-20180908155711869

总结

现在你知道互联网是如何运作的了。但这样会持续多久呢?当前的互联网IP版本(v4)仅允许232个地址。最终不会有免费的IP地址可用使用。惊讶吗?别担心。IP v6正在被测试。但那之后呢?谁知道呢。互联网从最初作为国防部门的研究项目一路走来,没人知道它最终会变成什么样子。但有一件事是肯定的,那就是互联网能够将事件连接到一起,这是从前任何机制都未做到的。信息时代正朝我们全力奔来,我很高兴自己是其中一员,

资源

http://www.ietf.org IETF(互联网工程任务组)的官网

http://www.internic.org 负责管理域名的机构

http://www.faqs.org/rfcs/rfcsearch.html RFC搜索引擎

http://navigators.com/isp.html Russ Haynal的网络服务供应商页面。提供几乎所有网络服务器供应商的架构图

<http://www.investintech.com/content/historyinternet/ 互联网历史概要