现代网络应用需要一种复杂的方法来将数据从一台机器传输到另一台机器。如果您正在管理一台拥有许多用户的 Linux 机器,这些用户可能希望同时连接到网络上的远程主机,那么您需要一种方法来允许他们共享您的网络连接,而不会互相干扰。许多现代网络协议采用的方法称为分组交换。分组是一个小的数据块,它在网络上从一台机器传输到另一台机器。当数据报在网络中的每个链路上传输时,就会发生交换。分组交换网络通过在用户之间交替发送数据包来共享多个用户的单个网络链路。
Unix 系统以及随后的许多非 Unix 系统采用的解决方案被称为 TCP/IP。当谈论 TCP/IP 网络时,您会听到术语数据报,它在技术上具有特殊的含义,但通常与分组互换使用。在本节中,我们将了解 TCP/IP 协议的底层概念。
TCP/IP 的起源可以追溯到 1969 年美国国防高级研究计划局 (DARPA) 资助的一个研究项目。ARPANET 是一个实验性网络,在 1975 年被证明成功后,被转变为一个可操作的网络。
1983 年,新的协议套件 TCP/IP 被采纳为标准,网络上的所有主机都必须使用它。当 ARPANET 最终发展成为互联网(ARPANET 本身在 1990 年消失)时,TCP/IP 的使用已经扩展到互联网以外的网络。许多公司现在已经建立了企业 TCP/IP 网络,互联网已经发展到一个几乎可以被认为是主流消费技术的地步。现在很难读到一份没有提及互联网的报纸或杂志;几乎每个人现在都可以使用它。
为了在接下来的章节中讨论 TCP/IP 时有一些具体的东西可以参考,我们将以位于弗雷德兰某处的格劳乔·马克斯大学 (GMU) 为例。大多数部门都运行自己的局域网,而有些部门共享一个局域网,另一些部门则运行多个局域网。它们都相互连接,并通过一条高速链路连接到互联网。
假设您的 Linux 机器连接到数学系的 Unix 主机的局域网,并且它的名称是 erdos。要访问物理系的某个主机,比如 quark,您需要输入以下命令
$ rlogin quark.physics Welcome to the Physics Department at GMU (ttyq2) login: |
在提示符下,您输入您的登录名,例如 andres,和您的密码。然后,您将在 quark 上获得一个 shell[1],您可以在其中输入命令,就像您坐在系统的控制台前一样。退出 shell 后,您将返回到您自己机器的提示符。您刚刚使用了 TCP/IP 提供的一种即时交互式应用程序:远程登录。
在登录到 quark 时,您可能还想运行图形用户界面应用程序,例如文字处理程序、图形绘图程序,甚至是万维网浏览器。X 窗口系统是一个完全网络感知的图形用户环境,它适用于许多不同的计算系统。要告诉此应用程序您希望将其窗口显示在您主机的屏幕上,您必须设置 DISPLAY 环境变量
$ DISPLAY=erdos.maths:0.0 $ export DISPLAY |
如果您现在启动您的应用程序,它将联系您的 X 服务器而不是 quark 的服务器,并在您的屏幕上显示其所有窗口。当然,这需要您在 erdos 上运行 X11。这里的重点是 TCP/IP 允许 quark 和 erdos 来回发送 X11 数据包,从而给您一种您在单个系统上的错觉。网络在这里几乎是透明的。
TCP/IP 网络中另一个非常重要的应用程序是 NFS,它是网络文件系统的缩写。它是使网络透明的另一种形式,因为它基本上允许您将来自其他主机的目录层次结构视为本地文件系统,并且看起来像您主机上的任何其他目录。例如,所有用户的主目录都可以保存在中央服务器机器上,局域网上的所有其他主机都从中挂载它们。效果是用户可以登录到任何机器,并发现自己位于相同的主目录中。同样,可以通过在服务器上维护一份数据并允许其他主机访问它,在许多主机之间共享大量数据(例如数据库、文档或应用程序)。我们将在第 14 章中回到 NFS。
当然,这些只是您可以使用 TCP/IP 网络执行的操作的示例。可能性几乎是无限的,当您继续阅读本书时,我们将向您介绍更多内容。
现在我们将更仔细地了解 TCP/IP 的工作方式。这些信息将帮助您了解如何以及为何必须配置您的机器。我们将从检查硬件开始,然后慢慢向上研究。
最常见的局域网硬件类型被称为以太网。在其最简单的形式中,它由一根电缆组成,主机通过连接器、分接头或收发器连接到该电缆。简单以太网的安装成本相对较低,再加上每秒 10、100 甚至 1,000 兆位的网络传输速率,这在很大程度上解释了它的普及。
以太网有三种类型:粗缆、细缆和双绞线。细缆和粗缆以太网都使用同轴电缆,区别在于直径以及您将主机连接到此电缆的方式。细缆以太网使用 T 形“BNC”连接器,您将其插入电缆并拧到计算机背面的插头上。粗缆以太网需要您在电缆上钻一个小孔,并使用“吸血鬼分接头”连接收发器。然后可以将一个或多个主机连接到收发器。细缆和粗缆以太网电缆的最大长度分别为 200 米和 500 米,也分别称为 10base-2 和 10base-5。“base”指的是“基带调制”,简单来说就是数据直接馈送到电缆上,无需任何调制解调器。开头的数字指的是速度,单位为兆比特每秒,结尾的数字是电缆的最大长度,单位为百米。双绞线使用由两对铜线制成的电缆,通常需要称为有源集线器的附加硬件。双绞线也称为 10base-T,“T”表示双绞线。每秒 100 兆位的版本称为 100base-T。
要将主机添加到细缆以太网安装中,您必须中断网络服务至少几分钟,因为您必须剪断电缆才能插入连接器。虽然将主机添加到粗缆以太网系统有点复杂,但它通常不会使网络瘫痪。双绞线以太网更简单。它使用一种称为“集线器”的设备,该设备充当互连点。您可以从集线器插入和移除主机,而不会中断任何其他用户。
许多人喜欢用于小型网络的细缆以太网,因为它非常便宜;PC 卡的价格低至 30 美元(许多公司实际上正在扔掉它们),电缆的价格在每米几美分的范围内。然而,对于大规模安装,粗缆以太网或双绞线更合适。例如,GMU 数学系的以太网最初选择粗缆以太网,因为电缆必须经过很长的路线,这样每次向网络添加主机时流量都不会中断。双绞线安装现在在各种安装中非常常见。集线器硬件的价格正在下降,小型单元现在的价格甚至对小型家庭网络也具有吸引力。对于大型安装而言,双绞线布线可能明显更便宜,并且电缆本身比用于其他以太网系统的同轴电缆更灵活。GMU 数学系的网络管理员正计划在即将到来的财政年度用双绞线网络替换现有网络,因为这将使他们与当前技术保持同步,并且在安装新主机计算机和移动现有计算机时节省大量时间。
以太网技术的缺点之一是其有限的电缆长度,这限制了它在局域网以外的任何用途。然而,可以使用中继器、网桥或路由器将多个以太网段相互连接。中继器只是在两个或多个网段之间复制信号,以便所有网段一起充当一个以太网。由于时序要求,网络上任意两个主机之间不能有超过四个中继器。网桥和路由器更复杂。它们分析传入的数据,并且仅当接收主机不在本地以太网上时才转发数据。
以太网的工作方式类似于总线系统,其中主机可以将最多 1,500 字节的数据包(或帧)发送到同一以太网上的另一台主机。主机通过硬编码到其以太网网络接口卡 (NIC) 固件中的六字节地址来寻址。这些地址通常写为以冒号分隔的两位十六进制数字序列,如 aa:bb:cc:dd:ee:ff。
一个站点发送的帧会被所有连接的站点看到,但只有目标主机实际拾取并处理它。如果两个站点尝试同时发送,则会发生冲突。以太网上的冲突由接口卡的电子设备非常快速地检测到,并通过两个站点中止发送来解决,每个站点等待一个随机间隔并重新尝试传输。您会听到很多关于以太网上的冲突是一个问题的故事,并且由于冲突,以太网的利用率仅约为可用带宽的 30%。以太网上的冲突是一种正常现象,在一个非常繁忙的以太网网络上,看到高达约 30% 的冲突率不应感到惊讶。以太网网络的利用率更现实地限制在约 60% 以内,超过这个值您才需要开始担心。[2]
在较大的安装中,例如格劳乔·马克斯大学,以太网通常不是唯一使用的设备类型。还有许多其他可用的和正在使用的数据通信协议。Linux 支持所有列出的协议,但由于空间限制,我们将简要介绍它们。许多协议都有 HOWTO 文档详细描述它们,因此如果您有兴趣探索我们在本书中未描述的协议,您应该参考这些文档。
在格劳乔·马克斯大学,每个系的局域网都连接到校园高速“骨干”网络,这是一条光纤电缆,运行一种称为光纤分布式数据接口 (FDDI) 的网络技术。FDDI 使用一种完全不同的数据传输方法,它基本上涉及发送一些令牌,只有当站点捕获到令牌时才允许发送帧。令牌传递协议的主要优点是减少了冲突。因此,该协议可以更轻松地达到传输介质的全部速度,在 FDDI 的情况下高达 100 Mbps。FDDI 基于光纤,具有显着优势,因为其最大电缆长度远大于基于电线的技术。它的限制高达约 200 公里,这使其非常适合连接城市中的许多建筑物,或者像 GMU 的情况一样,连接校园内的许多建筑物。
同样,如果周围有任何 IBM 计算设备,则很可能安装了 IBM 令牌环网络。令牌环在某些局域网环境中用作以太网的替代方案,并且在实现全线速方面提供与 FDDI 相同的优势,但速度较低(4 Mbps 或 16 Mbps),并且成本较低,因为它基于电线而不是光纤。在 Linux 中,令牌环网络的配置方式与以太网几乎完全相同,因此我们不专门介绍它。
虽然今天比过去的可能性要小得多,但其他局域网技术,例如 ArcNet 和 DECNet,也可能已安装。Linux 也支持这些技术,但我们在此处不介绍它们。
许多电信公司运营的国家网络支持分组交换协议。其中最流行的可能是名为 X.25 的标准。许多公共数据网络,如美国的 Tymnet、澳大利亚的 Austpac 和德国的 Datex-P 都提供此服务。X.25 定义了一组网络协议,描述了数据终端设备(如主机)如何与数据通信设备(X.25 交换机)通信。X.25 需要同步数据链路,因此需要特殊的同步串行端口硬件。如果使用称为 PAD(分组组装拆卸器)的特殊设备,则可以将 X.25 与普通串行端口一起使用。PAD 是一种独立设备,提供异步串行端口和同步串行端口。它管理 X.25 协议,以便简单的终端设备可以建立和接受 X.25 连接。X.25 通常用于承载其他网络协议,例如 TCP/IP。由于 IP 数据报不能简单地映射到 X.25(反之亦然),因此它们被封装在 X.25 数据包中并通过网络发送。Linux 提供了一个 X.25 协议的实验性实现。
电信公司通常提供的更新的协议称为帧中继。帧中继协议与 X.25 协议共享许多技术特性,但在行为上更像 IP 协议。与 X.25 一样,帧中继需要特殊的同步串行硬件。由于它们的相似性,许多卡都支持这两种协议。另一种替代方案不需要特殊的内部硬件,而是再次依赖称为帧中继接入设备 (FRAD) 的外部设备来管理以太网数据包封装到帧中继数据包中,以便在网络上传输。帧中继非常适合在站点之间承载 TCP/IP。Linux 提供了支持某些类型内部帧中继设备的驱动程序。
如果您需要可以承载多种不同类型数据(例如数字化语音和视频)以及常用数据的高速网络,那么 ATM(异步传输模式)可能是您感兴趣的。ATM 是一种新的网络技术,专门设计用于提供可管理、高速、低延迟的数据传输方式,并提供对服务质量 (Q.S.) 的控制。许多电信公司正在部署 ATM 网络基础设施,因为它允许将多种不同的网络服务融合到一个平台中,希望在管理和支持成本方面实现节省。ATM 通常用于承载 TCP/IP。Networking-HOWTO 提供了有关 Linux 支持 ATM 的信息。
业余无线电爱好者经常使用他们的无线电设备来连接他们的计算机网络;这通常称为分组无线电。业余无线电操作员使用的一种协议称为 AX.25,它在一定程度上源自 X.25。业余无线电操作员使用 AX.25 协议来承载 TCP/IP 和其他协议。AX.25 像 X.25 一样,需要能够同步操作的串行硬件,或者一个称为“终端节点控制器”的外部设备,将通过异步串行链路传输的数据包转换为同步传输的数据包。有各种不同类型的接口卡可用于支持分组无线电操作;这些卡通常被称为“基于 Z8530 SCC”,并以设计中使用的最流行的通信控制器类型命名。AX.25 常用的另外两个协议是 NetRom 和 Rose 协议,它们是网络层协议。由于这些协议在 AX.25 上运行,因此它们具有相同的硬件要求。Linux 支持 AX.25、NetRom 和 Rose 协议的完整功能实现。AX25-HOWTO 是有关 Linux 实现这些协议的良好信息来源。
其他类型的互联网接入涉及通过慢速但廉价的串行线路(电话、ISDN 等)拨号连接到中央系统。这些需要另一种数据包传输协议,例如 SLIP 或 PPP,这将在后面描述。
当然,您不希望您的网络仅限于一个以太网或一个点对点数据链路。理想情况下,您希望能够与主机计算机通信,而无需考虑它连接到哪种类型的物理网络。例如,在较大的安装中,例如格劳乔·马克斯大学,您通常有许多必须以某种方式连接的单独网络。在 GMU,数学系运行两个以太网:一个用于教授和研究生的快速机器,另一个用于学生的慢速机器。两者都连接到 FDDI 校园骨干网络。
这种连接由一个称为网关的专用主机处理,该网关通过在两个以太网和 FDDI 光纤电缆之间复制数据包来处理传入和传出的数据包。例如,如果您在数学系,并且想从您的 Linux 机器访问物理系局域网上的 quark,则网络软件不会直接将数据包发送到 quark,因为它不在同一个以太网上。因此,它必须依赖网关充当转发器。然后,网关(名为 sophus)使用骨干网络将这些数据包转发到其在物理系的对等网关 niels,niels 将其传递到目标机器。erdos 和 quark 之间的数据流如图 1-1 所示。
这种将数据定向到远程主机的方案称为路由,在这种情况下,数据包通常被称为数据报。为了方便起见,数据报交换由一个独立于所用硬件的协议管理:IP,或互联网协议。在第 2 章中,我们将更详细地介绍 IP 和路由问题。
IP 的主要好处是它将物理上不同的网络变成一个表面上同构的网络。这称为互联网互联,由此产生的“元网络”称为互联网。请注意此处一个互联网和互联网之间的细微差别。后者是特定全球互联网的正式名称。
当然,IP 也需要一个独立于硬件的寻址方案。这是通过为每个主机分配一个唯一的 32 位数字来实现的,该数字称为IP 地址。IP 地址通常写为四个十进制数字,每个 8 位部分一个,用点分隔。例如,quark 的 IP 地址可能是 0x954C0C04,这将写为 149.76.12.4。这种格式也称为点分十进制表示法,有时也称为点分四组表示法。它越来越多地被称为 IPv4(互联网协议版本 4),因为名为 IPv6 的新标准提供了更灵活的寻址以及其他现代功能。在本书发行至少一年后,IPv6 才会投入使用。
您会注意到我们现在有三种不同类型的地址:首先是主机名,如 quark,然后是 IP 地址,最后是硬件地址,如 6 字节以太网地址。所有这些地址都必须以某种方式匹配,以便当您键入 rlogin quark 时,可以将 quark 的 IP 地址提供给网络软件;并且当 IP 将任何数据传递到物理系的以太网时,它必须以某种方式找出哪个以太网地址对应于该 IP 地址。
我们将在第 2 章中处理这些情况。现在,记住这些查找地址的步骤称为主机名解析(用于将主机名映射到 IP 地址)和地址解析(用于将后者映射到硬件地址)就足够了。
在串行线路上,存在一个称为 SLIP 或串行线路 IP的“事实”标准。SLIP 的一种修改形式称为 CSLIP 或压缩 SLIP,它执行 IP 标头压缩,以更好地利用大多数串行链路提供的相对较低的带宽。另一种串行协议是 PPP,或点对点协议。PPP 比 SLIP 更现代,并且包含许多使其更具吸引力的功能。它相对于 SLIP 的主要优势在于它不仅限于传输 IP 数据报,而且旨在允许几乎任何协议通过它传输。
从一台主机向另一台主机发送数据报并不是全部内容。如果您登录到 quark,您希望在您的 rlogin 进程(在 erdos 上)和 shell 进程(在 quark 上)之间建立可靠的连接。因此,发送和接收的信息必须由发送方拆分成数据包,并由接收方重新组装成字符流。尽管这看起来很简单,但它涉及许多复杂的任务。
关于 IP,一个非常重要的事情是,根据其意图,它是不可靠的。假设您以太网上的十个人开始从 GMU 的 FTP 服务器下载最新版本的 Netscape 网络浏览器源代码。生成的流量可能太大,网关无法处理,因为它太慢并且内存不足。现在,如果您碰巧向 quark 发送数据包,sophus 可能暂时没有缓冲区空间,因此无法转发它。IP 通过简单地丢弃它来解决这个问题。数据包不可挽回地丢失了。因此,通信主机有责任检查数据的完整性和完整性,并在发生错误时重新传输数据。
此过程由另一个协议传输控制协议 (TCP) 执行,该协议在 IP 之上构建可靠的服务。TCP 的基本属性是它使用 IP 为您提供主机上的两个进程和远程机器之间的简单连接的错觉,因此您不必关心您的数据实际如何以及沿哪条路线传输。TCP 连接的工作方式本质上类似于双向管道,两个进程都可以写入和从中读取数据。将其想象成电话交谈。
TCP 通过所涉及的两个主机的 IP 地址和每个主机上的端口号来识别此类连接的端点。端口可以被视为网络连接的连接点。如果我们要稍微延伸一下电话示例,并将城市想象成主机,那么可以将 IP 地址比作区号(其中数字映射到城市),将端口号比作本地代码(其中数字映射到个人的电话号码)。单个主机可以支持许多不同的服务,每种服务都以其自己的端口号区分。
在 rlogin 示例中,客户端应用程序 (rlogin) 在 erdos 上打开一个端口,并连接到 quark 上的端口 513,rlogind 服务器已知在该端口上侦听。此操作建立了一个 TCP 连接。使用此连接,rlogind 执行授权过程,然后生成 shell。shell 的标准输入和输出被重定向到 TCP 连接,因此您在机器上键入 rlogin 的任何内容都将通过 TCP 流传递,并作为标准输入提供给 shell。
当然,TCP 不是 TCP/IP 网络中唯一的用户协议。虽然适用于像 rlogin 这样的应用程序,但所涉及的开销对于像 NFS 这样的应用程序来说是过高的,NFS 转而使用 TCP 的同级协议,称为 UDP 或用户数据报协议。与 TCP 一样,UDP 允许应用程序联系远程机器上某个端口上的服务,但它不会为此建立连接。相反,您可以使用它向目标服务发送单个数据包——因此得名。
假设您要从数据库服务器请求少量数据。建立 TCP 连接至少需要三个数据报,来回发送和确认少量数据各需要三个数据报,关闭连接还需要三个数据报。UDP 为我们提供了一种仅使用两个数据报即可实现几乎相同结果的方法。UDP 被称为无连接的,它不需要我们建立和关闭会话。我们只需将我们的数据放入数据报中并将其发送到服务器;服务器制定其回复,将数据放入寻址回我们的数据报中,然后将其传输回来。虽然对于简单事务而言,这比 TCP 更快、更有效,但 UDP 的设计目的不是处理数据报丢失。这取决于应用程序,例如名称服务器,来处理这个问题。
端口可以被视为网络连接的连接点。如果应用程序想要提供某项服务,它会将自身附加到端口并等待客户端(这也称为在端口上监听)。想要使用此服务的客户端会在其本地主机上分配一个端口,并连接到远程主机上的服务器端口。同一个端口可以在许多不同的机器上打开,但在每台机器上,一次只能有一个进程可以打开一个端口。
端口的一个重要属性是,一旦客户端和服务器之间建立了连接,服务器的另一个副本就可以附加到服务器端口并侦听更多客户端。此属性允许例如对同一主机进行多个并发远程登录,所有登录都使用相同的端口 513。TCP 能够区分这些连接,因为它们都来自不同的端口或主机。例如,如果您从 erdos 两次登录到 quark,则第一个 rlogin 客户端将使用本地端口 1023,第二个客户端将使用端口 1022。但是,两者都将连接到 quark 上的同一端口 513。这两个连接将通过在 erdos 上使用的端口号来区分。
此示例展示了端口作为 rendezvous point(汇合点)的用法,其中客户端连接特定的端口以获取特定的服务。为了让客户端知道正确的端口号,双方系统的管理员必须就这些号码的分配达成协议。对于广泛使用的服务,例如 rlogin,这些号码必须集中管理。这由 IETF(互联网工程任务组)完成,该组织定期发布名为 Assigned Numbers(分配号码)(RFC-1700)的 RFC。其中描述了分配给知名服务的端口号。Linux 使用一个名为/etc/services的文件,该文件将服务名称映射到数字。
值得注意的是,尽管 TCP 和 UDP 连接都依赖于端口,但这些号码并不冲突。这意味着,例如,TCP 端口 513 与 UDP 端口 513 不同。实际上,这些端口充当两种不同服务的访问点,即 rlogin (TCP) 和 rwho (UDP)。
在 Unix 操作系统中,执行上述所有任务和协议的软件通常是内核的一部分,Linux 也是如此。在 Unix 世界中最常见的编程接口是 Berkeley Socket Library(伯克利套接字库)。它的名字来源于一个流行的类比,即将端口视为套接字,将连接到端口视为插入插座。它提供了bind调用来指定远程主机、传输协议和程序可以连接或监听的服务(使用connect, listen,以及accept)。套接字库在某种程度上更通用,因为它不仅提供了一类基于 TCP/IP 的套接字(AF_INET套接字),还提供了一类处理本地机器连接的套接字(AF_UNIX类)。某些实现还可以处理其他类,例如 XNS(Xerox Networking System,施乐网络系统)协议或 X.25。
在 Linux 中,套接字库是标准libcC 库的一部分。它支持AF_INET和AF_INET6用于 TCP/IP 的套接字,以及AF_UNIXAF_UNIXAF_IPX用于 Novell 网络协议的套接字,AF_X25用于 X.25 网络协议的套接字,AF_ATMPVC和AF_ATMSVC用于 ATM 网络协议的套接字,以及AF_AX25, AF_NETROM,以及AF_ROSE用于业余无线电协议支持的套接字。其他协议族正在开发中,并将及时添加。
[1] | shell 是 Unix 操作系统的命令行界面。它类似于 Microsoft Windows 环境中的 DOS 提示符,但功能强大得多。 |
[2] | Ethernet FAQ(以太网常见问题解答)位于 http://www.faqs.org/faqs/LANs/ethernet-faq/ 讨论了这个问题,Charles Spurgeon 的 Ethernet 网站 http://wwwhost.ots.utexas.edu/ethernet/ 提供了丰富的详细历史和技术信息。 |