如果你是一个网络从业者,一定学习过 OSI 7 层模型,长期以来,这一直作为我们理解和解决网络问题的基石存在。
然而,2023年9月,Robert Graham 在Google文档发表了一篇名为“OSI Deprogrammer,重新构想网络空间”的文章,并主张“OSI模型必须淘汰!”
Robert Graham曾在20世纪90年代末担任Network General的首席架构师,为OSI和TCP/IP编写代码。本文的大部分内容来自他从不同角度看待网络的经验,而不仅仅是OSI或TCP/IP的角度。其后也在数据中心工作了多年,解决了很多互联网的核心问题,除了实践经验外,他还综合了很多学术论文的观点。
Graham在摘要中表示,OSI模型是一个彻头彻尾的谎言,没有任何帮助。除了作为20世纪70年代大型机的历史注脚外,它应该被彻底移除。
我们普遍理解的OSI 7层模型每层都有其独特的功能:
物理层: 处理硬件,如电缆和网卡。
数据链路层: 确保连接设备之间有牢固的链接,并处理错误。它定义了“帧”——物理链接可使用的最大单元,并标识了链接上的内容。
网络层: 使用链路层的帧和链路层标识在不同网络之间发送数据。
传输层: 管理设备之间的数据流并修复错误。
会话层: 使用一个或多个底层传输设置并维护应用程序之间的连接。
表示层: 确保数据可读且安全。
应用层: 软件应用与网络进行交互的地方。
Graham认为,OSI模型存在多个方面的问题:
它基于过时的、大型机时代的概念,强调跨过程调用栈的严格功能分离,而这些概念已不再适用。
它缺乏灵活性,实际上网络中的功能可以在不同上下文之间交叉。调用可以进入传输层(TCP、UDP),影响网络和链路层(IPv4或IPv6,以及以太网或光网络)在会话方面的行为。
它对网络交换的哪些部分发生在本地,哪些发生端到端以及在此过程中客户端和服务器的各自角色方面施加了限制。
本文重点选取了“误解”一章的部分内容,这一章中Graham揭露了诸如“分层”之类的普遍“错误”观念。
01OSI 不是通用理论
OSI 被视为理论的主要原因是很多人并不知道它的含义。该模型包含很多只适用于大型机网络的术语。大家不了解大型机,所以当遇到一个本应特定于大型机的术语时,他们反过来强行将其重新解释,让它来做到包含所有网络通用的含义。
这一点在“会话层(session)”尤为明显。在 OSI 命名这一层时,它与一般会话无关,而是与将终端连接到大型机的非常具体的问题有关。他们甚至可以用许多同义词来称呼它:连接层、通道层、讨论层、对话层、交互层、关联层等等。
我们所认为的会话 (如在HTTP中)实际上在 OSI 中称为关联(associations),并分配给应用层。
而OSI 的会话从来就不是指我们现在所认为的抽象的、理论性的概念。它从不包含HTTP会话cookie、SSL会话握手和NetBIOS会话服务等内容。
人们往往会被自己的无知所迷惑。他们不知道OSI最初的session是什么意思,所以相信它可以是任何意思。这就导致了每个人的解释都不一样的问题。这同样适用于几乎所有其他OSI术语。它们都有特定的含义——对大型机而言。我们不清楚这些词在其他语境中到底是什么意思,所以每个人都在对它们的意思做出自己的解释。
02OSI不是一个框架
OSI 模型中的“层”有两个用途。第一个是协议的具体设计。第二个是某种分类法、层次结构、分类系统、类别、框架、时间线、位置或本体论。即使没有协议属于这层,也会将概念分配给层。
例如,没有表示层协议,但尽管如此,人们还是将功能分配给该层,例如加密或压缩。
我们现在将功能分配给层的方式实际上很大程度上都是用的TCP/IP 模型。今天的传输层几乎从未像 OSI 那样定义,而取决于 TCP 如何定义自身。
实际上,网络的大多数功能都可以发生在任何层。
例如,我们分配给传输层的大多数功能,连接、分段、流量控制和重传实际上可以在任何层发生。
我们所看到的分配给层的功能来自于重新解释。将以太网和TCP/IP协议的功能分配给最近的OSI层,然后根据以太网和TCP/IP的功能定义OSI层。由于TCP 支持这些功能(连接、分段、流量控制、重传),并且我们将 TCP 指定为Transport传输,因此我们声称这些是传输层的功能。
层中定义的真正功能实际上很小。例如,OSI 对传输层的真正定义是它是端到端的,其中端点被定义为在两台计算机上运行的进程。就这样,没有更多了。
所有层都是如此。OSI 几乎没有为任何特定层分配任何内容,现在分配给特定层的大多数功能都是由多个 OSI 层处理的。
03OSI前 3 层是虚构的,下4层也不准确
OSI 模型有 7 层。然而,在当今的互联网上,只有最后 4 个以任何合理的形式存在。这给很多人带来了难题,他们往往选择以下两种策略之一:
1)忽略上面 3 层,重点关注下面 4 层。
2)制作一些东西来填充上面 3 层。
OSI 模型的上面 3 层是虚构的,下面 4 层大致映射到以太网 MAC+PHY 和互联网 TCP/IP。
这里的一个问题是,以太网和互联网实际上并不符合这 4 层的原始定义,即 20 世纪 70 年代创建的定义。为了让它变得合适,他们对 OSI 的说法以及以太网和互联网的工作原理“撒了谎”。
最大的谎言是假装以太网不是网络。
以太网是一个成熟的网络,它根据目标地址逐跳转发数据包。这就是以太网交换机内部发生的情况。然而,为了能够合理解释这一切,他们创造了一些新词,例如, 当以太网执行中继时,将中继称为“桥接”,而当互联网执行中继时,将中继称为“路由”。事实上,它的功能相同,只有细微的差别。
同样,TCP/IP 互联网是一个互联网络 ,而不是 OSI网络层设想的网络,必须对它们最初的含义“撒谎”,才能够自圆其说。
同样的情况也发生在互联网上,互联网确实在以太网上运行,但在一个模型中一起展示细节是错误的抽象层。正确的抽象层是在本地网络(如以太网)上定义互联网。然后我们可以展开子层,显示每个子层如何执行相同的功能。这样,上2层就不会与下2层纠缠在一起。
04OSI 的“层”概念并不存在
除了列举具体的层之外,OSI 还将分层(layering)作为一个抽象概念。
例如以下抽象,其中每一层都是根据它如何与这一端的相邻层交互来定义的,同时与远程端的对等层进行通信。
但实际上没有任何层纯粹以这种方式工作。
网络堆栈最重要的原则是事物是分层的。但这并不意味着存在固有的层次,即某些东西属于 某个特定的层次。
我们喜欢分层的是整个网络。互联网是一个完整的网络。在ISP中,它可能位于MPLS之上,MPLS 也是整个网络。MPLS本身可以在本地链路上分层,包括以太网,这是一个完整的网络。
分层的另一种类型是协议。它们是在彼此之上运行的,但这并不意味着它们属于堆栈中的某个位置。
例如,MS-RPC一种重要的 Microsoft 协议,下图是它的原理图。它基于各种协议,而这些协议又相互叠加。
这里没有一致的框架。“事物”只是分层在其他“事物”之上。
有些人可能会声称 IPv4 和 IPv6 是同一“层”的替代“协议”,但事实并非如此。它们实际上是同一协议的两个版本。它们与互联网堆栈的其余部分(例如TCP、UDP、ICMP、DHCP、DNS等)集成度太高。唯一可以实际声明层的地方是整个网络的抽象层,例如Internet 层或以太网层。
层的一个重要概念是它们彼此独立。而 OSI 并没有能够体现这一点。互联网没有固定的层数。当数据包通过互联网传输时,它们下面的层数会发生巨大变化。同样,顶部的层数也根据应用而变化。然后还有诸如 VPN 之类的东西,它们将互联网置于自身之上。
05数据包标头
OSI 强调数据包沿层传递,每层添加一个标头。有时在数据包嗅探器中看起来是这样,但这不是正确的抽象。相反,协议在其有效负载中封装了其他内容。
下面是Wireshark的图片,它是一个数据包嗅探器,可以从本地网络捕获数据包。该显示共有三个窗格。
顶部窗格显示已捕获的数据包列表。
底部窗格显示数据包的原始十六进制转储。
中间窗格“解码”十六进制转储,显示原始字节的含义,例如对应于IP 标头的字节。
以下是与上面相同的数据包的十六进制转储,并对每个标头进行了着色:以太网、IPv4、TCP,然后是 SSL (TLS) 记录标头。
OSI 通过数据包在一端沿网络堆栈下行来描述这一点,每一层都添加自己的标头。该过程在接收时相反,每一层在传递到上面的下一层之前剥离自己的标头。
这种概念化的方式并不适用于所有情况,在实践中只有偶尔才能发生。
特别是TCP 的有效负载是字节流,而不是数据包。当 TCP 有效负载较小且适合单个段时,它看起来符合上图。但在其他情况下,单个 TCP 分段可能携带多个有效负载,或者有效负载可能跨越多个 TCP 分段。
下面的Wireshark 捕获中可以看到这两种情况都发生了。SSL (TLS) 将数据作为一系列记录进行传输。我们看到单个 TCP 段可以包含多个 SSL 记录,并且一个 SSL 记录可以跨越多个 TCP 段。
在下面的数据包中,我们在单个 TCP/IP 数据包中看到五个 SSL 记录。其中四个记录完全包含在数据包中,而第五个记录跨越该数据包的末尾和下一个数据包的开头。
用上面的图来画这个,就会变成下面这样:
这类错误在现实世界中具有重要意义。以Snort IDS为例。它尝试通过搜索数据包中的签名 (特定攻击特有的字节模式)来检测黑客活动。它将每个TCP 段视为仅包含一个SSL 记录,并且无法检测到不符合此条件的攻击。
关键字“depth”是从数据包有效负载的开头而不是流的开头开始测量的。例如,以下是著名的 OpenSSL Heartbleed攻击的签名,与|18 03 03 00 40| 的 SSL 记录标头匹配。在数据包的前五个字节中。
但是,正如我们在上面看到的,SSL 记录标头可以出现在 TCP 有效负载中的任何位置,而不仅仅是数据包边界。TCP 确实有数据包边界的概念,这是只有我们人类才能看到的东西。以下是利用Heartbleed 的数据包 ,它不会触发上述签名,因为它在前面插入了 7 字节的 TLS 记录,将包含攻击的第二条记录推入数据包的更深处,超出了 depth:5 的 限制。
在当今的网络堆栈中,这种向数据包添加标头的模型实际上只出现在两个地方。一个是内核添加组合的 TCP/IP 标头,另一个是添加以太网标头:
这与替代的两层模型一致,即互联网在以太网等本地网络上运行。
尽管我们在数据包中看到一系列的标头,但实际的层边界并不完全落在我们看到的线上。它们是一个偶然的产物,而不是被设计成这样工作的。
06仅本地可见性
OSI 模型假设所有层作为单个网络一起工作,所有内容都遵循相同的模型。
事实是,我们只能了解本地网络或互联网上发生的情况。我们的数据包到底发生了什么细节对我们来说是不透明的。下图重新绘制了上面的模型,其中左侧符合我们的网络,但网络的其余部分如何未知,有时层数较少,有时层数较多。我们无法了解网络的其余部分是如何构建的。
07控制协议
大家根据数据传输方式来学习分层,但对于控制信息如何传输存在很多困惑。
我们需要DHCP 来配置IP地址。
我们需要ICMP 来控制消息。
我们需要 ARP 和NDP 来查找以太网上的MAC 地址 。
我们需要DNS 将名称转换为地址。
我们需要以太网中的一个子层来自动协商链路速度。
我们需要TCP中的SYN和FIN数据包来创建和销毁连接。
我们需要完全脱离网络堆栈的SSL证书管理。
WiFi 需要与接入点关联。
在所有层,有时我们还需要身份验证以确保安全。
所有层上都有大量的网络管理正在进行,跟踪计费和监控等使用情况。
数据如何传输是容易的,但控制是困难的。
当试图将 OSI 模型应用于TCP/IP时,它被彻底歪曲了。尽管像DHCP这样功能运行在UDP 之上,但它们并不是“应用层”的一部分。DHCP的功能是IP 协议功能的重要组成部分。这同样适用于BGP,尽管它运行在路由器之间的 TCP 连接上,但它确实是 IP“层”的一部分。
08OSI 从不是真正的标准
Graham 一直在反复强调,当前我们所学的或者是别人教授给我们的,并不是原始的 OSI 标准,而是他们自己的非标准解释。
OSI 从来就不是一种理论或正确的框架。人们如此重视它的部分原因是因为它被认定为“标准”。换句话说,如果大家都采用了这个标准,那么它就成为了理论和框架。
但 OSI 失败了。1980 年左右的学术论文和早期教科书是错误的,因为没有人真正采用该框架,OSI 最初的计划从未完成,已被互联网淘汰。尽管官方标准文件存在,但它是一个已失效的标准。这是谎言,不是真理。无论有多少标准组织坚称这是事实,它仍然是一个谎言。
OSI 是由不懂网络的人编写的。他们专注于终端与大型机的对话,因为这是他们自己的大部分个人经验。OSI 就是这样设计的。
1981 年,当 Tanenbaum 创建第一本计算机网络大学教科书时,TCP/IP 尚未发布。这在某种程度上是正确的,因为当时大多数学术论文都以某种方式引用了 OSI 模型。但后期的 OSI只是通过强行解释,让它来适配当今互联网的发展模式。
互联网并不是因为它而发展的。
09争 议
研究科学家George Michaelson表示对Graham的观点并不完全赞同。Michaelson介绍,自己自1982年以来就一直在这个领域工作,曾在英国的VAX VMS系统上使用PL/1编写OSI传输类1、2和3的早期实现,并在1985/6年在伦敦的UCL-CS参与了由Marshall Rose监督的项目,后来成为ISODE系统。其现在在应用领域工作,涉及到X.400和X.500系统(电子邮件和目录服务)。
Michaelson称QUIC协议在UDP上保持连接状态的做法很好地符合会话层的定义。它保存的状态使应用程序在底层网络发生变化时保持灵活。这正是OSI模型中会话层所执行的一些功能。同样,TLS模块模拟了会话层行为。
Michaelson还认为物理-链接-网络的抽象不可被摒弃,因为这些概念与我们的理解密切相关。Michaelson强调,模型不仅是一本规则书,更是相互理解和进一步讨论的基础。
总的来说,Graham的文章推理严密,感兴趣的朋友可以点击阅读原文查看完整内容,也欢迎大家在评论区发表自己的观点!
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !