1

我有一个关于网络层的问题,即:

众所周知,在层架构中,N+2层应该只依赖于N+1层,而对N层一无所知。例如,在一个典型的应用程序中,Web 层应该只依赖于业务逻辑层,而不依赖于数据访问层

当谈到计算机网络时,情况似乎有所不同。在应用层,程序不仅要知道传输层(TCP端口),还要知道网络层(IP地址)

这让我很困惑,你怎么看?

谢谢你的帮助。

4

1 回答 1

3

一般来说你是对的。不幸的是,网络中各层之间的边界有点模糊,不仅因为我们有一个未使用的标准 (OSI) 和事实上的标准,它不执行你提到的想法,还因为协议通常不严格绑定到一层但可以在其中一个以上做事。大量的协议是在 OSI 模型之前和标准化之前开发的,然后进行一些根本性的改变已经太迟了。因此,有些协议被认为位于两层之间(或两层上),例如 MPLS、ARP 等。以及基于同一层上的另一个协议的协议,例如在 IP 之上运行的 OSPF,即使它们被认为在 L3 上。

你提到的是另一个例子。原因是寻址不是在最上层(应用层)而是在网络层(对于主机/网络适配器)和传输层(对于进程/应用程序)进行的。因此,您需要知道 IP 地址和端口号(实际上是一个协议)才能对远程应用程序进行寻址。这就是网络套接字作为应用程序和网络之间的网关(或 API)出现的地方。因此,即使您在技术上对违反分层模型的原则是正确的,您实际上并没有在 L3 或 L4 上做任何事情(但您可以;))。您不需要对数据包进行分段、处理重传或担心纠错等,您只需在创建套接字时传递所需的寻址信息。

TCP/IP 更注重实现的可行性,OSI 更关注标准而不是该标准的实现。这有它的坏和好的方面。如果您很好地使用该功能,那么自由实现协议的能力可能是一个优势,并且由于您没有严格遵守某些规范,您可以更有效地做一些事情......或者失败。混合“职责”的缺点是显而易见的,很好的例子是像 H.323 这样的协议,它将 IP 地址嵌入到用户的有效负载中,所以如果你想做 NAT,例如,你需要检查有效负载、更改 IP 地址、重新计算校验和,以及类似的东西,而不仅仅是处理网络层的翻译。

为什么东西还是这样?可能是因为需要更新的设备和协议、应用程序等数量庞大,而且这需要很多时间,所以没有简单的方法可以改变其中的任何一个。看看采用 IPv6 的速度已经超过 15 年了。

于 2013-08-02T20:35:47.383 回答