谈到互联网,很多人脑海中会出现各种各样的术语和服务,但是互联网是如何设计并构建的呢?作为一个网络,互联网的架构本质是什么? 石头兄弟和我曾经一起译过一本《计算机网络问题与解决方案》的巨著,但真正仔细阅读并从中有所收获的朋友并不多。最近,石头兄弟推荐了另一篇文章https://cacm.acm.org/magazines/2023/2/268956-extracting-the-essential-simplicity-of-the-internet/fulltext ,内容精炼简洁,不敢私藏,编译分享给大家。
如今,互联网提供了人们所依赖的无处不在的连接。许多人也都知道,互联网的基本设计是在20世纪70年代发明的,以允许计算机交换数据。自1983年陆续采用以来,它基本上保持不变 ,同时优雅地适应应用程序,技术,规模,范围和容量的根本变化,成为了人们不可或缺的一部分。
作为如此出色的IT基础设施,其系统架构也是怎样的呢?
1. 本质需求:互联网的服务模型
在进行通信时,所有主机上的软件都必须依赖基础设施的服务模型。因此,服务模型的设计需要在最适合主机软件的内容和基础设施可以支持的内容之间进行折衷。在设计数据传输服务模型时,必须选择其传输单元并确保性能。鉴于计算机通信的突发性,一个小的传输单元是必要的,以实现有效的资源利用。互联网使用一组比特的数据包,当前的数据包大小通常不超过1.5 kb。
互联网应用程序有着各种各样的网络性能要求,从低延迟(交互式视频或闭环控制)到高带宽(传输大数据集)和可靠传输(文件传输)。工程化的本能是支持将这些需求与网络基础设施结合起来,以保证延迟、带宽和可靠性方面的特定界限。然而,互联网必须与各种各样的本地分组网络互联,例如无线和有线、共享接入以及点对点,其中许多网络不能保证性能。这些网络能够支持的最小公分母是“尽最大努力”的数据包传输,网络试图传输所有的数据包,但是不能保证数据包是否、什么时候或以什么速率传输。
因此,关于服务模式的根本问题是,是更好的技术和支持所有应用需求或容纳所有的数据分组网络,只提供一个适度的最小公分母和“尽力而为”的服务模式。互联网的设计选择了质朴的方式,即采用尽力而为的服务模式。
现在看来,这是一个更好的选择。首先,较松散的服务模式对基础设施施加了最低限度的要求,从而使互联网得以极其迅速地发展。简而言之,由于对性能的要求不高,互联网的部署速度和范围都很大。其次,应用程序有严格的网络要求是电话网络的延续,电话网络的智能终端系统与智能网络相连,完全负责满足电话的严格性能要求,即固定速率传输和可靠传输。随着越来越强大的计算机作为终端,通过对互联网应用程序的设计来适应不同级别的性能,从而放松了它们的需求。在大多数情况下,网络运营商还可以通过提供足够的带宽来确保合理的性能,也就是说,通过部署更多和更快的链路,使网络很少拥塞。
2. 体系抽象:互联网的架构
体系结构是关于功能的组织,而不是它的实现。模块化是体系结构的指导原则,要求将系统的目标分解为具有干净接口的更小的任务。互联网的目标是允许两台不同计算机上的应用程序进行通信,因此可以分解为两个组成部分:
(i)网络基础设施的作用(主机之间尽最大努力传输数据包)
(ii)主机上的网络支持软件的作用(使应用程序更容易使用这种尽力而为的传输)。
2.1 网络基础设施
基础设施实现的主机到主机交付任务可以分解为三个不同的任务,这些任务被分层设计,高层具有更广泛的空间范围,低层处理更多的本地任务。因此,从发送主机向接收主机发送数据包的过程涉及到将这些本地发送任务集合在一起。提供最佳数据包传输的本地和低级的任务是通过链路或广播进行传输,这需要数模转换和纠错,这两者都不是互联网所特有的。这个本地传递任务由所谓的物理层(L1)处理。
鉴于 L1能够通过链路发送比特流,下一个任务是在本地分组网络中实现通信(如以太网或无线网络)。这包括两个步骤:
(i)用一组比特位组成数据包,前面有一个数据包头,描述这些位应该传送到哪里;
(ii)将这些数据包传送到本地网络中的适当目的地。将第二步限制为本地(而非全局)传输,可以使用不可伸缩的技术,如广播(介质本身确保广播数据包到达所有主机(如无线))和洪泛(网络确保洪泛数据包到达所有主机)。这个任务是由传统上称为链路层或 L2来处理的。在非广播网络中,这项任务是由本地网络中的交换机实现的,这些交换机将数据包转发到它们的目的地。
最后一项任务是将数据包从发送方的网络传送到目的地的网络,利用 L2的能力将这些网络中的数据包传送到各个主机。这种网络的互连由网络互连层(L3)处理,并由在 L2连接到两个或多个网络的路由器实现。数据包通过一系列的路由器进行转发(路由器到路由器的交付由两个路由器所连接的网络中的 L2支持) ,直到它们到达目的网络。这一层连接网络还定义了 互联网的服务模型,即 L3将数据传送到更高层的主机软件。
因此,互联网提供的无处不在的连接能力始于一个概念上简单而大胆的设计。
2.2 主机软件中的网络支持
网络基础设施中主机对主机服务模型没有指定数据包应该传递到哪个主机的应用程序,而且如果没有额外的帮助,应用程序很难达到最佳性能。为了纠正这些问题,主机操作系统除了提供其他网络支持外,还提供了传输层(L4)。基于称为“端口”的数据包头中的元数据,L4将数据包传递给主机上的各个应用程序为了使应用程序更容易使用尽力而为的服务,一些公共传输协议提供了三种功能。
四层互联网架构是模块化的自然结果。每一层只与正上方和正下方的层相互作用。由于数据包总是通过 L1的物理媒体到达,所以主机必须实现所有四个层; 路由器实现前三个层,而交换机只实现前两个层。因此,这里有四个问题需要解答。
问题 # 1: 这种分层架构支持哪种多样性,如何管理它?
只要一个层的两个实现提供相同的向上和向下接口,它们在架构上是可互换的。此外,互联网架构的模块化允许在 L4处共存多个传输协议,在 L2处共存多个本地网络设计,在 L1处共存多个物理技术,每个都提供自己独特的接口。L1和 L2技术由网络提供商选择,网络提供商可以确保它们的接口兼容,也就是说,本地网络设计可以使用一组链路技术。应用程序在调用操作系统的网络 API 时选择它所需的 L4协议。应用程序和网络提供商独立作出选择,也就是说,应用程序不知道它目前所在的网络,网络提供商也不知道其网络上将使用哪些应用程序。当且仅当 L3上有一组所有 L2设计和 L4协议都兼容的接口时,这种方法才能无缝地工作。因此,我们必须在 L3有一个单一的协议,即互联网协议(IP) ,目前是 IPv4及IPv6。IP 作为互联网架构的“蜂腰”,其独特性使所有其他层次的多元化创新成为可能。
问题 # 2: Internet 使用什么标识符?
互联网必须使 L2和 L3数据包头能够识别路由的目的地,并允许用户和应用程序识别他们想要访问的服务。这导致了三种地址,通常,主机上每个可连接的硬件网络接口(如 Wi-Fi、蜂窝网卡或以太网卡)都有一个称为 MAC 地址的永久唯一地址,L2使用该地址来识别目的地。L3使用 IP 地址,它指定互联网中的一个唯一网络,以及当前使用该网络中的地址的特定主机接口(这种地址分配可以随时间变化)。用户和应用程序使用应用程序级别的名称来引用基于主机的服务。为了使这些名称具有某种程度的持久性,它们独立于服务所基于的机器以及这些主机可能放置在网络中的位置。在这三个标识符(应用程序级别的名称、 IP 地址和 MAC 地址)中,前两个必须解析为次低级别的标识符。因此,当一台主机上的应用程序试图向另一台主机上的应用程序发送数据包时,它必须将应用程序级别的名称解析为 IP 地址。当数据包到达网络时,它通过 L2发送到目的地主机或下一跳的路由器。在这两种情况下,IP 地址都必须解析为 MAC 地址。
问题3: 如何组织互联网基础设施?
互联网不仅仅是一个由路由器连接的非结构化的 L2网络集合。相反,它是自治系统(AS)的集合,也称为域,每个域包含一组由单个实体管理的 L2网络。AS的例子包括企业、大学和商业互联网服务提供商(ISP)。这些系统控制它们自己的内部 L3路由,并且必须与其他系统建立路由协议,以便在系统之间提供主机到主机的传输。因此,L3涉及两个路由任务:
(i)在 AS 内的网络之间进行路由(域内路由) ,由该 AS 中的路由器处理;
(ii)在 AS 之间进行路由(域间路由) ,由连接两个或更多个 AS 的所谓边界路由器处理。
这两个路由任务有不同的需求,因此需要不同的路由范例和协议。
问题4: 这些部分是如何组合在一起的?
通过互联网传送数据包的过程始于应用程序将应用程序级别的名称解析为一个 IP 地址,然后调用主机的网络支持将数据发送到该目标 IP 地址。这将导致对 L4的调用,该调用将数据打包并调用 L3来传递这些数据包。在 L3,数据包通过一系列路由器被转发,直到它到达它的目的网络(由数据包报头中的目的 IP 地址标识)。每个路由器都有一个转发表,它将目标 IP 地址映射到下一跳路由器的 IP 地址。在接收到数据包后,路由器在转发表中查找合适的下一跳路由器,然后通过调用 L2将数据包发送到该下一跳节点。L2必须首先将下一跳路由器的 IP 地址解析为一个 MAC 地址,然后将数据包传送到下一跳路由器(通过广播或通过一系列交换机转发数据包,如下一节所述) ,然后由下一跳路由器将数据包返回给 L3。这个过程中的关键技术挑战是设置 L3转发表,以便下一跳的集合总是导致数据包到达适当的目的地。
3. 互联网的三个核心机制
互联网架构确定了实现互联网体系结构所必需的三个重要机制ーー路由、可靠性和名称解析方案。
3.1 路由
术语“路由”是指通过互联网将数据包转发到目的地主机的一般问题,这种问题发生在 L3并由路由器实现,或者在 L2由交换机实现,而L2上的实现称为交换而不是路由。从考虑 L3域内路由开始,假设:
- 每个 L3包头包含一个目的 IP 地址,
- 每个路由器有一组相邻的路由器,它在 L2连接
- 每个路由器有一个转发表,正确地指示路由器是否连接(在 L2)到数据包的目的地网络,如果没有,确定性地将到达数据包的目的地映射到数据包应该转发到的相邻下一跳路由器。
简化问题,重点先放在一组静态转发表成功引导数据包到达其目的地的情况。路由器之间的互连集称为网络拓扑图,假设它们是连接的; 将转发表集称为转发状态; 将这些表的并集称为路由状态。给定的路由状态实例是有效的,如果它总是将数据包指向它们的目的地; 如果存在一个环(即,一个起始位置和一个目的地址) ,数据包可以返回到它已经访问过的路由器。因此,当且仅当没有环时,路由状态实例才有效。
假设没有循环; 因为网络是连接的和有限的,所以任何数据包最终都必须到达连接(在 L2)到其目的地的路由器。假设存在一个给定目的地的循环; 任何寻址到该目的地的包进入循环将永远不会到达目的地。
为什么要关心这个明显的结果?因为互联网使用各种路由算法来计算转发状态,这些路由算法之间的关键概念差异在于它们在稳态下避免循环的方式。路由协议是一种复杂的分布式系统,它解决了由于网络链路失效和恢复而导致网络拓扑图发生变化时,如何快速自动地重新计算转发状态的问题。这里,避免了这些分布式协议的复杂性,只关注算法在静态网络上收敛到一个稳定状态时所产生的转发状态。在这些算法中,避免稳态循环的方法主要取决于路由器之间共享什么样的信息。
例如,一个路由器知道它的邻近路由器,并且可以使用洪泛算法与其他路由器共享这个本地信息。在稳定状态下,每个路由器都可以利用这些信息来组装整个网络拓扑图。如果所有路由器在这个共享网络拓扑图上使用相同的无环路径查找算法来计算它们的转发表,那么得到的路由状态总是有效的。这种方法称为“链路状态”路由。
许多计算机科学界人士认为,互联网仅仅是一个复杂协议的集合,而不是一个概念上简单而大胆的设计。
另一种情况是,每个路由器根据一些度量(如延迟)通知它的邻近路由器它自己的距离所有其他网络。路由器 α 可以计算其到每个目的地网络 n 的距离为 dα (n) = minβ [ dβ (n) + d (α,β)] ,其中 dβ (n)是从每个相邻路由器 β 到网络 n 的距离,d (α,β)是两个路由器之间的距离 α,β。这种分布式计算的稳定状态产生到每个目的地的最短路径路由,这不能有环。这就是所谓的“距离矢量”路由。
当网络拓扑图发生变化时,在距离向量路由和链路状态路由的重新计算路由过程中(即协议尚未收敛到稳定状态时)都可能出现路由状态的临时环路。如果不加以检查,数据包在这样的循环中无休止地循环可能会导致严重的拥塞控制。为了防止这种情况,IP 协议明智地在数据包头中加入了一个字段,该字段从发送主机设置的初始数字开始,然后每当数据包到达一个新的路由器时,该数字就递减。如果该字段达到零,则丢弃数据包,从而限制数据包可以穿越临时环路的次数,从而确保临时环路不会发生灾难性的情况。如果没有这种简单的机制,所有的路由协议都需要排除临时环路,这种程度的关注可能会使路由协议复杂化。
考虑 L3域间路由。AS显然必须携带它们作为源或目的地的所有数据包; 所有其他数据包都被视为传输通信,在从源 AS 到目的 AS 的路上通过其他 AS。AS 希望能够自由选择他们所携带的传输流量,以及他们用来将传输流量转移到目的地的路线。对于互联网服务提供商来说,这两种策略选择在很大程度上取决于它们与邻近的自主网络服务提供商的经济性考量,因此它们希望将这些选择保密,以避免泄露有助于竞争对手的信息。
虽然域间路由选择实际上是由边界路由器实现的,这涉及到它们之间一些复杂的域内协调,但是可以简单地建立域间路由模型,将互连的 AS 集合形成一个图,并由 AS 自己做出路由决策。域间路由必须:
- 允许 AS 做出任意的策略选择,所以不能使用距离向量
- 保持这些策略选择的私有性,所以不能使用链路状态路由
这将需要 AS 使他们的策略明确,以便每个其他 AS 可以计算使用这些策略的路由。另一种方法是允许AS系统通过选择向谁宣传他们的路由(通过向邻近的AS系统发送消息说,“你可以使用我的路径到达这个目的地”) ,以及当几个邻居已经向他们发送到给定目的地的路由时,选择这些路由来实现他们的策略。这些都是在距离向量路由中使用的相同消息和选择,但距离向量不允许策略灵活性: 路由向所有邻居公布,只选择最短路径。这种局部自由提供了政策灵活性和隐私,但是如何防止在计算路由时出现稳态环路?互联网的解决方案是交换路径信息。当 AS“ A”公布到相邻 AS“ B”的路径(针对特定目的地)时,它指定该流量到目的地的整个 AS 级路径。如果 AS“ B”看到它已经在那条路径上,它就不会使用那条路径。如果所有的 AS都遵守这个明显的约束,那么无论 AS做出什么策略选择,我们称之为“路径向量”路由的稳定状态都将是无环的。路径向量路由在目前的域间路由协议 BGP 中使用,因此,BGP 是将互联网上的许多自动化系统粘合在一起的粘合剂。
由于对性能要求不高,互联网的部署速度和范围都很大。
这种路径矢量方法确保在任何稳态下都没有回路。然而,这并不能确保路由协议收敛到一个稳定状态, 例如,策略振荡就是路径向量算法不收敛的情况。它也不能确保所有产生的稳定状态提供所有端点之间的连接,因为所有 AS 都可以拒绝向给定 AS 提供过境连接。令人感到困惑的是,为什么这些异常没有在互联网上观察到,理论分析表明,典型的运营实践(路由选择最大化收入和最小化成本)产生路由策略,将总是收敛到稳定的状态,提供端到端连接之间的所有端点。
在非广播网络中,避免环路也起到了一定的作用,在非广播网络中,洪泛通常用于到达目的地。生成树协议(spanning-tree protocol,STP)通过选择不使用某些链接在网络之外来创建一棵树,也就是说,从网络拓扑图中消除所有环。一旦网络成为生成树,就可以通过让每个交换机在生成树的所有相邻链路上转发数据包(数据包到达的链路除外) ,将数据包洪泛给所有主机。这种洪泛允许主机和路由器通过一个“地址解析协议”(ARP)消息来解析 IP 地址到 MAC 地址,该消息询问,“哪个主机或路由器有这个 IP 地址?”; 所有者然后响应其 MAC 地址。在这个 ARP 交换期间(实际上每当主机发送数据包时) ,交换机可以通过记住它们最近从该主机收到数据包的链路来学习如何在不发生洪泛的情况下到达特定主机。生成树上的任意两个节点之间只有一条路径,因此可以通过发送来自该主机的数据包到达的链路来到达该主机。因此,使用这样的“学习式交换机”,将 IP 地址解析为 MAC 地址的行为确定了发送和接收主机之间的转发状态。当向 MAC 地址已经解析的主机发送数据包时,网络不需要使用洪泛,而是可以直接发送数据包。
总而言之,所有的路由算法都必须有一种机制来避免处于稳定状态(即协议收敛之后)的环路形成,而稳定状态又依赖于交换的信息。为了限制 AS 中与相邻路由器之间的信息交换,需要使用距离向量来保证无环,从而产生最短路径。为了提高域内路由的路由灵活性,一个更好的选择是链路状态,它需要洪泛的邻居信息,但允许使用任意的无环路径计算。为了允许 AS 在域间路由中实施单独的策略控制,它们可以交换显式的路径信息以避免环路。为了在 L2中实现动态洪泛和路由学习,有必要将网络拓扑图转换为生成树,因为它们本身是无环的。在路由中可能会考虑其他问题,例如,如何从失败中恢复而不必重新计算路由,以及如何使用集中控制来简化路由协议(如 SDN) ,但是这里的重点是阐明在常用的路由范例中避免环路的作用。
3.2 可靠传输
在讨论的路由分析时,即使有效的路由状态,由于过载链路或故障路由器仍然会导致数据包的丢弃。互联网架构并不能保证前三层的可靠性,而是明智地将这个任务留给传输层或应用程序本身,丢失的数据包只有在被发送主机重新传输时才会被传输。
可靠的传输是由传输协议确保的,该协议建立了从一个应用程序获取数据并将其传输到远程应用程序的连接。一些重要的传输协议,例如广泛使用的 TCP,提供了一个可靠的字节流抽象,其中字节流中的数据被分成数据包并按顺序传输,所有数据包丢失由传输协议本身来恢复。可靠的字节流抽象可以完全由主机软件实现,可以区分一个字节流中的数据包和另一个字节流中的数据包,在数据包上有序号,这样它们就可以在任何数据传递到接收应用程序之前被正确地重新排序,并且重新传输数据包直到它们成功地传递。
非正式情况下,可靠的传输协议从应用程序获取数据,以数据包的形式将其传输到目的地,最终通知应用程序传输已成功完成或失败终止,在这两种情况下都停止进一步的传输。假设底层网络最终传递一个重复发送的数据包,因此持久协议总是能够成功。对于这种情况,在发送方和接收方之间需要什么通信来确保协议可以通知应用程序它已经成功了,当且仅当所有数据包已经被接收么?有两种常见的方法: 接收方可以在接收到数据包时向发送方发送确认(ACK) ,或者在怀疑数据包丢失时向发送方发送非确认(NACK)。
ACK 对于可靠的传输是必要的和充分的,而 NACK 既不是必要的也不是充分的。一个可靠的传输协议只有当它知道所有的数据包都已经发送完毕时才能宣布成功,这只能通过每个数据包接收到一个 ACK 来推测。没有 NACK (它本身可以被删除)并不意味着已经接收到了数据包。但是,NACK 可能很有用,因为它们可以提供关于发送方应该何时重新传输的及时信息。例如,TCP 使用显式 ACK 来提高可靠性,并根据超时和隐式 NACK (当预期的 ACK 未到达时)发起重新传输。
3.3 名称解析
除了通过 ARP 将 IP 地址解析为 MAC 地址之外,互联网还必须将应用级别的名称解析为一个或多个 IP 地址。这些名称非正式地称为主机名,正式的名称被称为完备的域名。可以使用非标准术语应用程序级别的名称,既不指特定的物理机器(而 MAC 地址指的是) ,也不直接关系到域间路由中使用的域概念。
任何应用程序级的命名系统必须:
为了应对这些挑战,互联网采用了一种称为域名系统(DNS)的分层命名结构。命名空间被划分为称为域的区域,这些区域被递归地细分为较小的域,并且解析和管理控制都是分层完成的。每个命名域都有一个或多个命名服务器,可以在其域内创建新的子域并解析名称。名称可以完备的解析为一个或多个 IP 地址),也可以将解析指向一个或多个可以进一步解析此类名称的子域名服务器。此层次结构从一组顶级域(TLD)开始,商业注册允许客户在这些 TLD 下注册子域。TLD 到其名称服务器的解析由一组 DNS 根服务器(其地址为所有主机所知)处理,解析从那里沿着命名层次结构进行。例如, www.myschool.edu 首先由根服务器解析,该根服务器指向edu域名服务器,再指向 myschool. edu 的一个名称服务器,然后将 www.myschool.edu 解析为一个 IP 地址。这种层次结构允许高度并行的名称解析和完全分布式管理控制,这两者对于处理 互联网命名的规模至关重要。
4. 互联网成功的秘密
本文试图将互联网难以理解的复杂性降低为一小组设计选择:
理解这些决定背后的原因不足以理解当今互联网的复杂性,但足以设计一个具有大致相同属性的新互联网。不幸的是,这种简单性并不足以解释互联网的长寿,为什么互联网的设计在处理速度、规模、范围、技术和使用方面的巨大变化方面如此成功呢?
4.1 质朴
互联网没有设法满足所有可能的应用要求,而是采用了一种非常有限但非常普遍的服务模式,这种模式没有任何保障。于是再对智能设备和非智能网络上:
如果因特网采用了一种更为复杂的服务模式,它可能会将自己局限于创建时存在的应用程序要求,可以用当时可用的技术实现。这将导致一种针对少数应用程序的复杂设计和迅速过时的技术,这是短期成功但长期失败的根源。
4.2 模块化
四层互联网架构的模块化导致了清晰的责任划分: 网络基础设施(L1/L2/L3)支持更好的数据包传递(在容量、覆盖范围和弹性方面) ,而应用程序(由 L4协助)为用户创建基于这种数据包传递服务模型的新功能。因此,这种架构使得两种截然不同的生态系统,即网络基础设施和互联网应用得以独立地繁荣发展。
然而,互联网的模块化超越了其正式的体系结构,在其标准驱动的基础设施范围内,最大限度地实现了自治的更一般方法,这与电话网络更严格的一致性形成了鲜明的对比。例如,对 AS 的唯一要求是其路由器支持 IP 并参与域间路由协议 BGP。否则,每个系统都可以部署任何 L1和 L2技术以及任何域内路由协议,而无需与其他系统协调。类似地,各个命名域必须支持 DNS 协议,否则可以采用它们选择的任何名称管理策略和名称解析基础结构。这种基础结构的自主性允许出现不同的操作实践。例如,一个大学校园网络、一个超大规模的数据中心网络和一个 ISP 骨干网络有着非常不同的运营需求; 互联网固有的自主性使得它们能够以自己的方式满足自己的需求,并且随着时间的推移不断发展。
4.3 失败是常见情形
随着系统规模的扩大,在任何时候,系统的某些组件发生故障的可能性越来越大。因此,通常会认为按照算法复杂性或状态爆炸来扩展,而有效地处理故障也是一个关键的可扩展性要求。与期望正常运行并进入特殊模式以从故障中恢复的系统不同,几乎所有的互联网机制都将故障视为常见事件。
例如,在基本的路由算法中,无论是由于链路故障还是由于环路的重新计算,路由的计算都以相同的方式进行。类似地,当一个数据包丢失时,它必须被重新传输,但是这种重新传输预计会频繁发生,而且在传输协议中并不是特殊情况。这种将失败视为常见案例的设计风格,是谷歌等构建超大规模基础设施的基础,这种风格最初是在互联网上开创的。
4.4 粗略共识和可运行代码
互联网发明者没有采用当时电信世界中流行的正式设计委员会,而是明确地选择了另一条道路: 鼓励较小的团体构建可行的设计,然后由一个社区选择采用哪种设计。大卫 · 克拉克是互联网架构的领袖之一,他在一次演讲中说: “我们拒绝国王、总统和投票。我们相信粗略的共识和可运行的代码。”这种平等主义精神延伸到互联网作为连接所有用户的统一交流平台的共同愿景。因此,互联网的发展不仅受到纯技术决策的影响,而且受到早期互联网社区对连接世界的共同平台价值以及他们对实现这一愿景的共同所有权的信念影响。
5. 没有完美
有许多领域的互联网的设计是次优解,但其中大多数是低层次的细节,不会改变高层次的表示。互联网设计中有三个领域存在着更多的基本问题。
5.1 安全性
许多人将互联网安全的糟糕状况归咎于安全性,认为安全性并不是其设计的首要考虑因素,尽管面对失败时的处理能力确实是一个重要的考虑因素。这种批评是错误的,原因有两个:
(1)在一个相互联系的世界中,安全性是一个比网络安全更复杂和难以捉摸的目标,而互联网只能确保后者;
(2)虽然互联网架构本身并不提供网络安全,但有一些协议和技术,其中一些正在广泛使用,可以在很大程度上实现了这些安全性。
更准确地说,如果能确保下列属性是传输两个主机之间的数据:,那么就可以说网络是安全的:
后三种一般可以通过加密协议来保证。互联网的可用性容易受到分布式拒绝服务(DDoS)攻击,其中许多主机被当作了机器人使目标的流量过载。有一些技术可以过滤掉这种攻击性流量,但它们只是部分有效。可用性还受到 BGP 易受攻击的威胁,因为 AS的路由存在漏洞; 加密解决方案是可用的,但它们没有得到广泛部署。因此,有一些加密协议和缓解方法可以使因特网在很大程度上满足安全网络的定义。
然而,未能使互联网成为一个固有的安全网络绝对不是当前安全问题的主要原因,安全网络不能防止主机软件的不安全性。例如,如果一个应用程序被设计为泄露其用户的信息,或者冒充其用户执行不必要的金融交易,那么网络几乎无法阻止这种恶意行为。如果用户无意中下载了恶意应用程序,或者某些攻击(如缓冲区溢出)将一个良性应用程序变成了恶意应用程序,那么主机就可能被感染。关于互联网安全性的指责通常指的是在主机上放置恶意软件的容易性,但这主要不是一个网络安全问题。
5.2 网络内分组处理
早期的互联网设计者认为,网络基础设施应该通常集中于数据包传输,避免更高层次的功能,但是目前几乎每个运营的网络都违反了所谓的网络内数据包处理的规则。现代网络有许多中间地带,它们提供了不只是传输的功能,例如防火墙(控制哪些数据包可以进入网络)、广域网优化(通过缓存以前的数据来提高网络效率)和负载均衡(将请求导向负载不足的主机)。
2012年的一项调查显示,大约三分之一的网络组件是中间件,三分之一是路由器,三分之一是交换机。其中一些网内处理功能部署在单个企业内部,以提高其内部效率; 这种行为只在企业网内产生影响,因此被广泛视为一种可接受的现实。此外,正如下面所讨论的,一些云和内容提供商已经部署了大型专用网络,部署网内功能(特别是断流、缓存和负载均衡) ,降低了延迟,提高客户可见的可靠性。
5.3 缺乏进化能力
由于每个路由器都实现了 IP 协议,因此很难改变互联网的服务模式。最近由于 IPv4地址短缺而加速过渡到 IPv6的过程,也保留了相同的服务模式。几十年来,互联网一直没有重大的架构变化,没有可行的方案替代互联网。然而,中央控制的数据中心部署的大型专用网络通过其网内处理为客户提供优越的服务,今天的大多数客户端流量要么通过本地控制中心缓存其原始 AS 服务,要么直接使用从源 AS 到具有其专用网内处理中心的大型专用网络。中央控制中心的大型专用网络与云和内容服务垂直整合,这些服务是现在比 ISP 更占主导地位的经济力量。
因此,已经开始看到了一个新的全球基础设施的过渡,这些私有网络已经取代了当前互联网的几乎所有流量的最后一公里,这将标志着互联网经济时代的结束,当时它没有真正的竞争对手,虽然互联网面临着许多挑战,但是,对于互联网的未来,没有一个挑战比解决两种愿景的分歧更为重要: 一种愿景是使早期互联网社区活跃起来的,即一个统一的互联网将所有用户连接起来,基本上与端点提供的服务脱节; 另一种愿景是以新兴的大型私有网络为代表,在这种网络中使用网内处理提供了更好的性能。
6. 一句话小结
互联网是一个工程奇迹,体现了非常大胆且有预见的设计决策。不要让互联网的复杂性掩盖了其核心设计的简单性和所取得的成就,不要忘记导致互联网诞生的勇气、社区精神和高瞻远瞩,这或许是互联网更有价值的一个方面。