1. 从我们迄今为止的讨论来看,很明显互联网是一个极其复杂的系统。 我们已经看到 Internet 有很多部分:众多的应用程序和协议、各种类型的终端系统、分组交换机和各种类型的链路级介质。 鉴于这种巨大的复杂性,是否有任何希望组织网络架构,或者至少是我们对网络架构的讨论? 幸运的是,这两个问题的答案都是肯定的。

1.5.1 分层架构 Layered Architecture

在尝试组织我们对互联网架构的想法之前,让我们先找一个人类的类比。 实际上,我们在日常生活中一直在处理复杂的系统。 想象一下,如果有人让你描述,例如,航空公司系统。 您将如何找到描述这个复杂系统的结构,该系统拥有售票员、行李检查员、登机口人员、飞行员、飞机、空中交通管制和一个全球性的飞机航线系统? 描述该系统的一种方式可能是描述您在乘坐航空公司航班时采取(或其他人为您采取的)一系列行动。 您购买机票,检查行李,前往登机口,最后登上飞机。 飞机起飞并被送往目的地。 飞机降落后,您在登机口下飞机并领取行李。 如果旅行很糟糕,你会向机票代理抱怨航班(你的努力一无所获)。 这种情况如图 1.21 所示。
image.png
Figure 1.21 ♦ Taking an airplane trip: actions
我们已经可以在这里看到一些与计算机网络的类比:航空公司将您从源头运送到目的地; 数据包从源主机传送到 Internet 中的目标主机。 但这并不是我们所追求的类比。 我们正在寻找图 1.21 中的一些结构(structure)。 看图 1.21,我们注意到每一端都有一个票务功能(ticketing function); 还有已购票旅客的行李功能,以及已购票和已托运行李的旅客的登机口功能。 对于已经通过登机口的旅客(即已经出票、托运行李、通过登机口的旅客),有起飞和降落功能,在飞行中,有飞机航线功能。 这表明我们可以横向查看图 1.21 中的功能,如图 1.22 所示。
image.png
Figure 1.22 ♦ Horizontal layering of airline functionality
图 1.22 将航空公司功能划分为多个层,提供了一个框架,我们可以在其中讨论航空公司旅行。请注意,每一层与其下面的层相结合,实现了一些功能和服务。在售票层及以下,完成一个人的航空公司柜台到航空公司柜台的转移(transfer)。在行李层及以下,完成人员和行李从行李托运到行李提取的转移。请注意,行李层仅向已购票的人提供此服务。在登机口层,完成人员和行李从出发门到到达门的转移。在起飞/着陆层,完成了人员及其行李的跑道到跑道的转移。每一层通过 (1) 在该层内执行某些操作(例如,在登机口层,从飞机上装卸人员)并通过 (2) 使用直接位于其下方的层的服务来提供其服务(例如,在登机口层,使用起飞/着陆层的跑道到跑道的旅客中转服务)。
分层架构允许我们讨论大型复杂系统中定义明确的特定部分。这种简化本身具有相当大的价值,因为它提供了模块化,使更改由该层提供的服务的实现变得更加容易。只要该层为其上层提供相同的服务,并使用来自其下层的相同服务,则当层的实现改变时,系统的其余部分保持不变。 (请注意,更改服务的实现与更改服务本身非常不同!)例如,如果更改登机口功能(例如,让人们按高度上下飞机),则航空公司系统的其余部分将保持不变不变,因为门层仍然提供相同的功能(装卸人员);它只是在更改后以不同的方式实现该功能。对于不断更新的大型复杂系统,在不影响系统其他组件的情况下更改服务实现的能力是分层的另一个重要优势。

协议分层 Protocol Layering

但是关于航空公司的内容已经讲够了。现在让我们将注意力转向网络协议。为了为网络协议的设计提供结构,网络设计者按层(layers)组织协议——以及实现协议的网络硬件和软件。每个协议都属于其中一个层,就像图 1.22 中航空公司架构中的每个功能都属于一个层一样。我们再次对层提供给上层的服务(services)感兴趣——所谓的层的服务模型(service model)。就像我们的航空公司示例一样,每一层通过 (1) 在该层内执行某些操作以及 (2) 使用直接位于其下方的层的服务来提供其服务。例如,第 n 层提供的服务可能包括从网络的一个边缘到另一边缘的可靠报文传递。这可以通过使用第 n-1 层不可靠的边缘到边缘报文传递服务,并添加第 n 层功能来检测和重新传输丢失的报文来实现。
协议层可以用软件、硬件或两者的组合来实现。 应用层协议(Application-layer protocols)——例如 HTTP 和 SMTP——几乎总是在终端系统的软件中实现; 传输层协议(transport-layer protocols)也是如此。因为物理层(physical layer)和数据链路层(data link layers)负责处理特定链路上的通信,所以它们通常在与给定链路关联的网络接口卡(例如以太网或 WiFi 接口卡(Ethernet or WiFi interface cards))中实现。 网络层(The network layer)通常是硬件和软件的混合实现。 另请注意,正如分层航空公司架构中的功能分布在构成系统的各个机场和飞行控制中心之间一样,分布在终端系统、分组交换器和其他组成网络的部件之间的 n 层协议也是如此。 也就是说,在这些网络组件中的每一个中,通常都有一个第 n 层协议。
协议分层具有概念和结构优势 [RFC 3439]。 正如我们所见,分层提供了一种结构化的方式来讨论系统组件。模块化使得更新系统组件变得更加容易。 然而,我们提到一些研究人员和网络工程师强烈反对分层 [Wakeman 1992]。 分层的一个潜在缺点是一层可能会复制较低层的功能。 例如,许多协议栈提供基于每个链路和端到端的错误恢复。 第二个潜在的缺点是,一层的功能可能需要仅存在于另一层的信息(例如,时间戳值); 这违反了分层的目标。
将各个层的协议放在一起称为协议栈(protocol stack)Internet 协议栈由五层组成:物理层、链路层、网络层、传输层和应用层(the physical, link, network, transport, and application layers),如图 1.23 所示。 如果您查看目录,您会发现我们使用 Internet 协议栈的各个层对本书进行了粗略的组织。 我们采用自顶向下的方式(top-down approach),先覆盖应用层,再向下进行。
image.png
Figure 1.23 ♦ The Internet protocol stack

应用层 Application Layer

应用层是网络应用程序及其应用层协议所在的地方。 Internet 的应用层包括许多协议,例如 HTTP 协议(提供 Web 文档请求和传输)、SMTP(提供电子邮件消息的传输)和 FTP(提供两个终端系统之间的文件传输)。 我们将看到某些网络功能,例如将诸如 www.ietf.org 之类的 Internet 终端系统的人性化名称转换为 32 位网络地址,也是在特定应用层协议的帮助下完成的, 即域名系统(domain name system,DNS)。 我们将在第 2 章中看到,创建和部署我们自己的新应用层协议非常容易。
应用层协议分布在多个终端系统上,一个端系统中的应用程序使用该协议与另一端系统中的应用程序交换数据包(packets)。 我们将在应用层将此数据包称为报文(message)。

传输层 Transport Layer

Internet 的传输层在应用程序端点之间传输应用程序层消息。 在 Internet 中,有两种传输协议,TCP 和 UDP,都可以传输应用层消息。 TCP 为其应用程序提供面向连接的服务。 该服务包括保证将应用层消息传送到目的地和流量控制(即发送方/接收方速度匹配)。TCP 还将长报文分成较短的段并提供拥塞控制机制,以便源限制其网络拥塞时的传输速率。 UDP 协议为其应用程序提供无连接服务。 这是一种简单的服务,不提供可靠性、流量控制和拥塞控制。在本书中,我们将传输层数据包称为段(segment)

网络层 Network Layer

Internet 的网络层负责将称为数据报(datagrams)的网络层数据包从一台主机移动到另一台主机。 源主机中的 Internet 传输层协议(TCP 或 UDP)将传输层段(segment)和目标地址传递到网络层,就像您向邮政服务提供带有目标地址的信件一样。 然后,网络层提供将段传送到目标主机中的传输层的服务。
Internet 的网络层包括著名的 IP 协议,它定义了数据报中的字段(fields)以及终端系统和路由器如何处理这些字段。 只有一种 IP 协议,所有具有网络层的 Internet 组件都必须运行 IP 协议。 Internet 的网络层还包含路由协议(routing protocols),用于确定数据报在源和目的地之间采用的路由。 Internet 有许多路由协议。 正如我们在 1.3 节中看到的,Internet 是一个由网络组成的网络,在一个网络中,网络管理员可以运行任何所需的路由协议。 虽然网络层包含IP协议和众多的路由协议,但它通常被简称为IP层,反映了IP是将互联网粘合在一起的粘合剂。

链路层 Link Layer

Internet 的网络层通过源和目标之间的一系列路由器路由数据报。 为了将数据包从一个节点(主机或路由器)移动到路由中的下一个节点,网络层依赖于链路层的服务。 特别是,在每个节点,网络层将数据报向下传递到链路层,链路层将数据报沿路由传送到下一个节点。 在下一个节点,链路层将数据报向上传递到网络层。
链路层提供的服务取决于链路上采用的特定链路层协议。 例如,一些链路层协议提供从发送节点通过一条链路到接收节点的可靠传送。 请注意,这种可靠传送服务与 TCP 的可靠传送服务不同,后者提供从一个终端系统到另一个终端系统的可靠传送。 链路层协议的示例包括以太网、WiFi 和有线接入网络的 DOCSIS 协议。 由于数据报通常需要遍历多条链路才能从源传输到目的地,因此数据报可能会在沿其路由的不同链路上由不同的链路层协议处理。 例如,数据报可能在一条链路上由以太网处理,而在下一条链路上由 PPP 处理。 网络层将从每个不同的链路层协议接收不同的服务。 在本书中,我们将链路层数据包称为帧(frames)

物理层 Physical Layer

链路层的工作是将整个帧从一个网络元件(element)移动到相邻的网络元件,而物理层的工作是将帧内的各个位从一个节点移动到下一个节点。 该层中的协议再次依赖于链路,并进一步依赖于链路的实际传输介质(例如,双绞铜线、单模光纤)。 例如,以太网有许多物理层协议:一种用于双绞铜线,另一种用于同轴电缆,另一种用于光纤,等等。 在每种情况下,都以不同的方式在链路上移动比特(bit)。

1.5.2 封装 Encapsulation

图 1.24 显示了数据沿发送端系统的协议栈、中间链路层交换机和路由器的协议栈向上和向下、然后在接收端系统的协议栈向上的物理路径(physical path)。 正如我们在本书后面讨论的,路由器和链路层交换机都是分组交换机。 类似于终端系统,路由器和链路层交换机将它们的网络硬件和软件组织成层。 但是路由器和链路层交换机并没有实现协议栈中的所有层; 他们通常只实现底层。 如图 1.24 所示,链路层交换机实现了第 1 层和第 2 层; 路由器实现了第 1 层到第 3 层。这意味着,例如,互联网路由器能够实现 IP 协议(第 3 层协议),而链路层交换机则不能。 稍后我们将看到,虽然链路层交换机无法识别 IP 地址,但它们能够识别第 2 层地址,例如以太网地址。 请注意,主机实现了所有五个层; 这与互联网架构将其大部分复杂性置于网络边缘的观点是一致的。
image.png
Figure 1.24 ♦ Hosts, routers, and link-layer switches; each contains a different set of layers, reflecting their differences in functionality
图 1.24 还说明了封装(encapsulation)的重要概念。 在发送主机,应用层报文(图 1.24 中的 M)被传递到传输层。 在最简单的情况下,传输层获取消息并附加额外的信息(所谓的传输层首部(header)信息,图 1.24 中的 Ht),这些信息将被接收端传输层使用。 应用层报文和传输层首部信息(application-layer message and the transport-layer header information)共同构成传输层段(transport-layer segment)。 因此,传输层段封装了应用层报文。 添加的信息可能包括允许接收方传输层将消息传递给适当的应用程序的信息,以及允许接收方确定消息中的位是否在路由中发生更改的错误检测位。然后传输层将段传递给网络层,网络层添加网络层首部(header)信息(图 1.24 中的 Hn),例如源和目标端系统地址,创建网络层数据报(network-layer datagram)。 然后将数据报传递到链路层,链路层(当然!)将添加自己的链路层首部信息并创建链路层帧(link-layer frame)。 因此,我们看到在每一层,数据包都有两种类型的字段:首部字段(header fields)和有效负载字段(payload field) 有效负载通常是来自上层的数据包。
这里的一个有用的类比是通过公共邮政服务从一个公司分支机构向另一个分支机构发送局间备忘录(interoffice memo)。 假设在一个分支办公室的 Alice 想要向在另一个分支办公室的 Bob 发送一份备忘录。 备忘录类似于应用层报文。 爱丽丝把备忘录放在一个办公室信封里,信封正面写着鲍勃的名字和部门。 办公室间信封类似于传输层段——它包含头信息(Bob 的姓名和部门编号)并封装应用层消息(备忘录)。 寄件分局邮件收发室收到局间信封后,将其放入另一个信封内,适用于通过公共邮政服务发送。寄件收发室还在邮政信封上写明寄件和接收分支机构的邮政地址。 在这里,邮政信封类似于数据报——它封装了传输层段(局间信封),它封装了原始消息(备忘录)。 邮政服务将邮政信封投递到接收分支机构的邮件室。 在那里,解封装过程开始。 收发室提取局间备忘录并将其转发给鲍勃。 最后,鲍勃打开信封并取出备忘录。
封装的过程可能比上面描述的更复杂。例如,一个大消息可能被分成多个传输层段(它们本身可能被分成多个网络层数据报)。在接收端,这样的段必须从其组成数据报中重建。