# F.9 网际互连
<!-- source: p1058 -->

**网际互连**（internetworking）无疑是通信领域最重要的创新之一。它使独立且不兼容网络中的计算机，能够可靠、高效地通信。图 F.34 说明为何需要跨越不同网络：它展示从斯坦福大学向相距约 75 千米的加利福尼亚大学伯克利分校传送文件时，涉及的机器和网络。

<!-- source: p1056 -->

![斯坦福至伯克利的跨网络连接](/figures/app-f/fig-f-34.png)
{#fig-F.34 .wide .expand num="F.34" caption="1995 年 mojave.stanford.edu 与 mammoth.berkeley.edu 之间建立的连接。FDDI 是 100 Mbit/s LAN，T1 是 1.5 Mbit/s 电信线路，T3 是 45 Mbit/s 电信线路。BARRNet 为 Bay Area Research Network，即湾区研究网络。注意，inr-111-cs2.Berkeley.edu 是有两个 Internet 地址的路由器，每端口一个。图中上、下部分别位于加利福尼亚州斯坦福和伯克利；Ethernet 为以太网，Internet 为互联网。"}

<!-- source: p1058 -->

网际互连的成本低得惊人。例如，发送电子邮件，远比从美国一海岸打电话到另一海岸、在答录机留言便宜；而它使用的长途通信线路与电话相同，这使成本改善更令人印象深刻。

实现网际互连的关键技术，是无需底层网络可靠、仍能提供可靠通信的软件标准。成功标准的根本原则是按层组织，各层负责整体通信任务的一部分。每台计算机、每个网络及交换机实现自己所属层的标准，并依赖其他部件履行责任。这些分层软件标准称为**协议族**或**协议套件**。它们让应用可用于任何互连，而无须应用程序员额外处理。图 F.35 概括了通信的层次模型。

<!-- source: p1056 -->

![网际互连在应用与网络之间的作用](/figures/app-f/fig-f-35.png)
{#fig-F.35 .wide .expand num="F.35" caption="网际互连的作用。宽度表示各层项目数量的相对多少。上方 Applications 为应用，中间 Internetworking 为网际互连，下方 Networks 为网络。"}

<!-- source: p1058 -->

最流行的网际互连标准是 **TCP/IP**，即传输控制协议／网际协议。这个协议族构成名称朴素的 Internet 的基础，将全世界数亿台计算机连接起来。由于广泛普及，即使在兼容网络之间本地通信，也会采用 TCP/IP。例如，网络文件系统 NFS 即使很可能只跨以太网这类同构 LAN 通信，也使用 IP。这里以 TCP/IP 为例，其他协议族思路类似；其历史见 F.13 节。

协议族的目标，是把责任按层次划分，每层向上层提供所需服务，从而简化标准。顶部为应用，底部为实际发送比特的物理通信介质。正如抽象数据类型屏蔽实现细节、简化程序员工作一样，分层策略使标准更容易理解。

早期各种网络协议工作造成术语混乱，因此开放系统互连（OSI）提出一种模型，推广了把网络描述为一系列层次的方式，见图 F.36。虽然并非所有协议都严格遵循这一分层，各层名称仍广为使用，所以经常会听到简单的第三层交换机与智能第七层交换机之类讨论。

<!-- source: p1057 -->

| 层号 | 层名称 | 主要功能 | 协议示例 | 网络部件 |
|---:|---|---|---|---|
| 7 | 应用层 | 用于专为网络运行而编写的应用 | FTP、DNS、NFS、HTTP | 网关、智能交换机 |
| 6 | 表示层 | 在应用格式与网络格式之间双向转换 | | 网关 |
| 5 | 会话层 | 建立、维持并结束跨网络会话 | 命名管道、RPC | 网关 |
| 4 | 传输层 | 在会话层之下提供附加连接 | TCP | 网关 |
| 3 | 网络层 | 将逻辑网络地址和名称转换为物理地址，例如计算机名到 MAC 地址 | IP | 路由器、ATM 交换机 |
| 2 | 数据链路层 | 把分组转换成原始比特，在接收端把比特转换回分组 | Ethernet | 网桥、网络接口卡 |
| 1 | 物理层 | 在物理线缆上传输原始位流 | IEEE 802 | 集线器 |
{#fig-F.36 .wide .expand num="F.36" caption="OSI 模型各层。按原书表述翻译，依据 www.geocities.com/SiliconValley/Monitor/3131/ne/osimodel.html。"}

<!-- source: p1059 -->

协议族的关键在于：通信在逻辑上发生于发送端与接收端的同一协议层，但由更低层服务实现。这种通信方式称为**对等通信**（peer-to-peer）。可以用一个比喻说明：战场上将军 A 要给将军 B 发消息，写好后装进写有 B 名字的信封，交给一位上校，命令其送达。上校再套一层信封，写上 B 部属中对应上校的名字，交给少校；少校照做后交给上尉，上尉交给中尉，中尉交给军士。军士取过信封，再套上写有 B 所属部队某军士名字的信封，交给一名列兵。列兵借来摩托车，将大信封交给对方军士。送达后，信件沿指挥链向上传递，每人拆开写有自己名字的外层信封，把内部信封交给上级。在 B 看来，消息就是另一位将军发来的。两位将军都不知道谁参与了传送，也不知道信件怎样从一个师送到另一个师。

协议族与这一比喻比想象中更相似，见图 F.37。低层协议在原消息前添加头部，还可能添加尾部。更低一层再加自己的头部；如果消息超过该层限制，还会拆成更小消息。沿用前述比喻，就是将军的长信装不进一个信封时，要拆开装进多个。拆分及添加头尾的过程不断继续，直到物理传输介质，再把消息送到目的地。接收端各层检查本层消息，剥去自己的头尾，将其交给<!-- source: p1060 -->更高一层并重新拼合。针对一条消息的这种嵌套称为**协议栈**，反映添加和移除头尾时后进先出的性质。

<!-- source: p1059 -->

![两层协议栈中的逻辑通信与实际数据流](/figures/app-f/fig-f-37.png)
{#fig-F.37 .wide .expand num="F.37" caption="一个通用的两层协议栈。通信在逻辑上对等进行：各发送层添加供对等层使用的头部和尾部，各接收层将它们移除。每层向上层提供服务，屏蔽不必要细节。Message 为消息，H、T 为头部、尾部，Logical 为逻辑通信，Actual 为实际传送路径。"}

<!-- source: p1060 -->

正如比喻所暗示的，分层可能给消息传递增加相当大延迟。显然，减少层数是降低延迟的一条途径；但必须记住，协议族规定的是标准，并不强制实现方法。正如指令集体系结构有许多实现方式，协议族也一样。

以 TCP/IP 协议栈为例，假定最底层是以太网，其上为 Internet Protocol，即 IP 层。IP 分组的正式名称是**数据报**（datagram）。IP 将数据报路由到目的机器，中途可能经过许多机器或交换机。它尽力交付，却不保证数据报能送达、内容无误或顺序正确。IP 之上的 TCP 层则保证可靠、按序交付，并防止数据报损坏。

按图 F.37，假定某应用经以太网给另一机器发送消息，先从 TCP 开始。一次最多可发送 64 KB；数据可能大得多，因此 TCP 必须将其拆成较小段，并在到达后按正确顺序重组。TCP 为每个数据报添加图 F.38 的 20 字节头部，再交给 IP。物理层上方的 IP 也添加 20 字节头部。IP 向以太网提交的数据，采用图 F.30 的分组格式发送。正如图 F.37，TCP 分组位于 IP 数据报的数据部分之内。

<!-- source: p1061 -->

![IP 与 TCP 头部的封装关系](/figures/app-f/fig-f-38.png)
{#fig-F.38 .wide .expand num="F.38" caption="IP 与 TCP 的头部。图宽 32 位，两者标准头部均为 20 字节，也可为不常传输的信息选配更长头部。两者都有头部长度 L 以及源、目的字段。IP 用单独长度字段表示整个数据报长度，TCP 则用按字节计的序号，将原文所述的数据报长度与序号联系起来。TCP 校验和确保数据报未损坏，序号确保到达后正确排序；IP 校验和只保护头部，因为其余部分已有 TCP 保护。"}

图 F.38 中，IP header、TCP header 分别为 IP、TCP 头部，IP data、TCP data 为相应数据；Type 为类型，Length 为长度，Identifier 为标识符，Fragment 为分片，Time 为生存时间，Protocol 为协议，Header checksum 为头部校验和，Source、Destination 为源与目的地，Sequence number 为序号，Piggyback acknowledgment 为捎带确认，Flags 为标志，Window 为窗口，Checksum 为校验和，Urgent pointer 为紧急指针。图内 TCP 数据大小按原书标为 0–65,516 字节。

**图 F.38 图注（续）** 一种优化是，TCP 可先发送一串数据报，再等待发送更多数据的许可。无须等许可就能发送的数据报数量称为窗口；窗口字段说明，在本数据报已确认字节之后，还可以发送多少字节。TCP 根据 IP 交付的成功情况调整窗口：越可靠、越快，窗口越大。数据到达并获确认时，窗口向前滑动，因此称为**滑动窗口协议**。

TCP 的捎带确认字段是另一种优化。有些应用沿同一连接双向发送数据，专发一个只含确认的数据报很浪费。该字段让携带数据的数据报，同时确认先前传输，即将确认“捎带”在数据上。

TCP 紧急指针给出数据报中某个重要字节的地址，例如中断字符。它使应用可以越过数据，避免用户必须等此前全部数据处理完，软件才看到要求停止的字符。IP 标识符与分片字段允许中间机器将原数据报拆成多个较小数据报；每片都携带原数据报唯一标识符，分片字段说明各片的位置。生存时间字段使数据报经过规定最多中间交换机后，无论身处何处都被丢弃。知道数据报若能到达、最多经过多少跳，有助于简化协议软件。协议字段指明哪个上层协议发送了此 IP 数据报，本例为 TCP。版本 V 与类型字段允许网络采用不同版本的 IP 软件。显式版本号使软件能逐机平稳升级，无须关闭整个网络。原书最后指出，互联网协议第六版 IPv6 已得到广泛使用。
