路由器是网络层的主力,在本章中,我们了解了它们如何完成将IP数据报转发到目的地的“基本工作”。但在本章和前几章中,**我们还遇到了网络中的其他网络设备(“盒(boxes)”),它们位于数据路径上,执行转发以外的功能**。我们在第2.2.5节中遇到了Web缓存;在第3.7节中遇到了TCP连接拆分器;在第4.3.4节中遇到了网络地址转换(NAT)、防火墙和入侵检测系统。我们在第4.4节中了解到,通用转发允许现代路由器通过通用的“匹配加操作”操作轻松自然地执行防火墙和负载均衡。<br />在过去的20年里,我们看到了这种中间盒(middleboxes)的巨大增长,RFC 3234将其定义为:
在源主机和目标主机之间的数据路径上执行IP路由器正常、标准功能以外的任何中间盒功能 “any intermediary box performing functions apart from normal, standard functions of an IP router on the data path between a source host and destination host”
我们大致可以确定中间盒执行的三种类型的服务:
- NAT转换(NAT Translation)。正如我们在4.3.4节中看到的,NAT盒实施私有网络寻址,重写数据报头IP地址和端口号。
- 安全服务(Security Services)。防火墙根据报头字段值阻止流量或重定向数据包以进行其他处理,例如深度数据包检测(DPI)。入侵检测系统(IDS)能够检测预定的模式并相应地过滤数据包。应用程序级电子邮件筛选器会阻止被认为是垃圾邮件、网络钓鱼或其他安全威胁的电子邮件。
- 性能增强(Performance Enhancement)。这些中间盒执行服务请求(例如,HTTP请求或搜索引擎查询)到可以提供所需服务的一组服务器之一的服务请求(例如,HTTP请求或搜索引擎查询)的压缩、内容高速缓存和负载均衡等服务。
许多其他中间盒[RFC3234]在有线和无线蜂窝网络中都提供属于这三类服务的功能[Wang 2011]。
随着中间箱的激增,随之而来的是对该设备的操作、管理和升级。独立的专用硬件盒、独立的软件栈以及独立的管理/操作技能会带来巨大的运营成本和资本成本。因此,研究人员正在探索使用商用硬件(网络、计算和存储)以及构建在通用软件栈之上的专用软件来实施这些服务,这或许并不令人惊讶—这正是十年前SDN采取的方法。此方法已成为众所周知的网络功能虚拟化(network function virtualization,NFV)[Mijubi 2016]。另一种也被探索过的方法是将中间盒功能外包给云[Sherry 2012]。
多年来,Internet体系结构在网络层和传输/应用层之间有明显的分离。在这些“好日子”里,网络层由在网络核心内运行的路由器组成,它们只使用IP数据首部中的字段将数据报转发到目的地。传输层和应用层在网络边缘运行的主机中实施。主机之间在传输层段和应用层报文中交换数据包。今天的中间盒显然违反了这种分离:位于路由器和主机之间的NAT盒重写网络层IP地址和传输层端口号;网络内防火墙使用应用层(例如HTTP)、传输层和网络层首部字段阻止可疑数据报;电子邮件安全网关被注入电子邮件发送方(无论是否恶意)和目标电子邮件接收方之间,根据列入白名单/黑名单的IP地址以及电子邮件地址过滤应用层电子邮件。虽然有些人认为这样的中间盒有点令人厌恶[Garfinkel 2003],但也有一些人接受了这样的哲学,即这样的中间箱“存在的原因是重要的和永久的”—它们满足了一个重要的需求—而且我们在未来会有更多的中间箱,而不是更少[Walfish 2004]。关于在网络中将服务功能放在哪里的问题,请参阅所附侧栏中“端到端论点”一节中略有不同的观点。
PRINCIPLES IN PRACTICE 实践中的原则 ARCHITECTURAL PRINCIPLES OF THE INTERNET 互联网的体系结构原则 考虑到互联网的巨大成功,人们可能会自然地想知道,指导这个可以说是人类有史以来最大、最复杂的工程系统发展的结构原则是什么。RFC 1958在题为“Internet的体系结构原则(Architectural Principles of the Internet)”的文章中指出,如果这些原则确实存在,那么它们确实是最小的: “互联网社区的许多成员会争辩说,没有架构,只有一种传统,这一传统在最初的25年里没有被记录下来(或者至少没有被IAB记录下来)。”不过,非常笼统地说,社区认为目标是互联互通,工具是互联网协议,情报是端到端的,而不是隐藏在网络中的。[RFC 1958] 好了,我们就是这么回事!我们的目标是提供连接,将只有一个网络层协议(我们在本章中研究的著名IP协议),并且“智能”(有人可能会说“复杂性”)将放在网络边缘,而不是放在网络核心中。让我们更详细地看一下后两个注意事项。 THE IP HOURGLASS IP沙漏 到目前为止,我们已经非常熟悉在图1.23中第一次遇到的五层Internet协议栈。这个栈的另一个可视化,如图4.31所示,有时被称为“IP沙漏(IP hourglass)”,说明了分层Internet体系结构的“窄腰(narrow waist)”。虽然Internet在物理层、链路层、传输层和应用层有许多协议,但只有一种网络层协议-IP协议。这是数十亿互联设备中的每一个都必须实现的协议。这条窄腰在互联网的惊人增长中起到了至关重要的作用。IP协议的相对简单性,以及它是Internet连接的唯一通用要求的事实,使得从以太网到WiFi再到蜂窝再到光网络的各种基础链路层技术非常不同的网络成为Internet的一部分。[Clark 1997] 指出,他称之为“跨越层(spanning layer)”的窄腰的作用是“……隐藏这些各种 [底层] 技术之间的详细差异,并为上述应用程序提供统一的服务接口。” 特别是对于 IP 层:“IP 生成层如何实现其目的? 它定义了一组基本的服务,这些服务经过精心设计,因此可以从广泛的底层网络技术中构建。 软件作为互联网 [即网络] 层的一部分,将这些低层技术提供的每一种技术转化为互联网层的公共服务。” Figure 4.31 ♦ The narrow-waisted Internet hourglass 图4.31♦窄腰互联网沙漏 有关细腰的讨论,包括互联网以外的例子,请参见[Beck 2019;Akhshabi 2011]。我们在这里注意到,随着互联网体系结构进入中年(当然,互联网的年龄在40到50岁之间,它才有资格进入中年!),人们可能会注意到,通过中间盒的兴起它的“窄腰”可能确实变宽了一点(就像中年人经常发生的那样!)。 THE END-TO-END ARGUMENT 端到端的论证 RFC 1958中的第三条原则—“智能是端到端的,而不是隐藏在网络中的”—说明了功能在网络中的位置。在这里,我们已经看到,直到最近中间盒的兴起,大多数互联网功能实际上都被放在了网络的边缘。值得一提的是,与20世纪的电话网络直接形成对比的是,20世纪的电话网络有“哑巴”(不可编程)端点和智能交换机,而互联网一直都有智能端点(可编程计算机),从而能够在这些端点上放置复杂的功能。但是,在一篇极具影响力的论文[Saltzer 1984]中提出了一个更有原则性的观点,即在端点实际放置功能,该论文阐述了“端到端的论证”。它写道: “ . . . 有一个功能列表,每个功能都可以通过以下几种方式中的任何一种实现:由通信子系统,由其客户,作为合资企业,或者可能是冗余的,每个都执行自己的版本。 在推理此选择时,应用程序的要求提供了一类参数的基础,如下所示: 只有站在通信系统端点的应用程序的知识和帮助才能完全和正确地实现所述功能。因此,提供该可疑功能作为通信系统本身的特征是不可能的。(有时,通信系统提供的功能的不完整版本可能有助于提高性能。) 我们将这种针对低级函数实现的推理称为“端到端论证”。” 说明端到端论证的一个例子是可靠的数据传输。由于数据包可能在网络内丢失(例如,即使没有缓冲区溢出,持有排队数据包的路由器也可能崩溃,或者其中数据包排队的网络部分由于链路故障而分离),因此端点(在这种情况下通过TCP协议)必须执行错误控制。正如我们将在第6章中看到的,某些链路层协议确实执行本地错误控制,但这种本地错误控制本身是“不完整的”,不足以提供端到端的可靠数据传输。因此,必须实现端到端的可靠数据传输。 RFC 1958故意只包括两个参考文献,这两个参考文献都是“关于因特网体系结构的基础论文”。其中一篇是端到端论文本身[Saltzer 1984];第二篇论文[Clark 1988]讨论了DARPA互联网协议的设计哲学。对于任何对互联网架构感兴趣的人来说,这两本书都是有趣的“必读之书”。[Clark 1988]的后续作品是[Blumenthal 2001;Clark 2005],它根据当今互联网必须运行的更加复杂的环境重新考虑互联网架构。