ICMP 是否使用第 3 层以上的任何进程?

ICMP 是否使用第 3 层以上的任何进程?

我正在做一个项目,必须描述从第 7 层到第 1 层的 ping 过程。Ping 使用第 3 层的 ICMP,因此数据位于第 3 层报头下。这是否意味着上面的任何层都不重要,还是它们仍然以某种方式被使用?

答案1

它使用应用层(根据您的型号,为 7 或 4)和 3 及以下。ICMP 不像 TCP 或 UDP 那样灵活,因此它提供的功能集相当有限。ICMP最多支持255 命令消息类型,并在内部进行,而不是使用上层协议将网络 IO 分发到各个进程。

因此,应用程序驱动使用命令消息来控制网络。例如,Ping 是一个应用程序,它创建适合 ICMP 数据包的数据结构,并将其提交给操作系统以发送到 IP。然后它等待 IO 返回。当 IP 堆栈接收到回显响应时,它会将该 IO 传递给程序,然后程序可以向用户打印消息。

与 TCP/IP 类似,应用层控制和协调网络堆栈提供的所有原始操作,为现代用户构建有价值的功能。

如果你是一个有代码意识的人,考虑一下此代码片段在 SO 上。它将侦听 ICMP 消息,并将其打印在程序输出上。您可以看到它为 ICMP 建立了一个“原始套接字”,将该套接字绑定到 IP 接口(均为第 3 层操作),建立了一些数据结构并从套接字 IO 读取,寻找响应。当收到 ICMP 消息时,其数据区域将出现在程序 IO 流中,并将打印在屏幕上。它非常整洁。

按要求编辑:

因此,OSI 模型是一种思考责任的抽象表示,即任务具有先决条件(其下层使用的协议的特征)和必须满足的后置条件。该模型所做的另一件事是建立通过每个任务传输数据的方法。

OSI 模型的主要目标是提供一种方式来描述应用程序如何轻松地发送和接收网络消息,这种方式与系统配置无关,使其可以在系统之间移植。在早期,应用程序必须重写才能在其他平台和配置上运行,因为应用程序必须自己完成所有工作。通过分离职责,程序可以只专注于自己的工作,而且这在系统之间不会有太大差异。此外,系统和网络管理员可以更改系统连接到其他系统的方式,而不会对应用程序产生任何影响。

OSI 堆栈的底层是关于系统互连的基本网络标准。每个人都必须以同样的方式做这些事情,否则什么都行不通。所有制造商都有义务遵守这些规则,以便拥有可以销售的产品。

然而,操作系统供应商并不热衷于那些妨碍其平台脱颖而出的僵化规则和结构。从未出现过完全符合 OSI 标准的系统的原因是没有操作系统供应商愿意编写这样的系统。

因此,OSI 1-4 层是可靠、可预测且必不可少的。然而,第 5 层和第 6 层完全是可选的。应用程序要么编写代码来使用它们,要么不编写,这取决于它们的需求。

大多数现代应用程序只是从传输协议段中读取数据。在这些情况下,没有针对 L5/L6 的封装数据报。段有效负载中的数据是应用程序数据,因此应用程序只需将 IO 流附加到 L4 端口并从中读取/写入即可。

对于 ICMP,由于它不使用第 4 层,因此应用程序仅读取原始 IP 套接字。概念相同。

第 5 层仅用于需要网络代理或隧道的应用程序。此数据报的有效负载通常是通过隧道发送的另一个帧或数据包,或通过 SOCKS 代理代理的段。应用程序通常不知道代理正在运行,或者将利用操作系统来处理第 5 层(如果适用于该系统),尽管某些操作系统上的某些应用程序实际上可能控制 L5 数据报的解封装。通常,L5 操作在内核中使用驱动程序(VPN 虚拟网络适配器、系统代理等)来处理。

值得注意的是,大多数第 5 层协议用于控制与应用程序发送/接收消息的愿望无关的交互,并且通常对参与通信的两个系统也没有意义。它通常用于控制网络,以便这两个系统可以通信。事实上,大多数情况下,应用程序数据流被操作系统拦截,系统应用程序处理外部数据报的封装,因此它会获取应用程序数据包,并将它们放入应用程序甚至不知道存在的其他数据包中。此时系统应用程序控制着数据。

第 6 层实际上并没有用到。在我使用过的任何编程框架中,编码都是在应用程序中使用适当的库来处理的。应用程序可以根据需要使用操作系统的编码器/解码器来编写第 6 层操作,或者提供自己的编码器/解码器,但根据我的经验,这通常由应用程序处理,不会影响数据报封装。

所以,归根结底,所有这些都是为了给应用程序提供可以读取和写入的 IO 流,以便通过网络发送和接收消息,而几乎无需预先了解网络的工作原理。这就是现代网络的全部内容。

如果系统使用系统范围的代理或 VPN,它通常会自动封装 L5 数据报,这样发送应用程序甚至不知道它在那里。在接收端,L5 标头在接收时已经被剥离,因为它已被代理服务器或 VPN 端点处理,因此远程操作系统只是将数据从第 4 层有效负载传输到应用程序。

因此,给定的数据包将只封装其需要的层数,以完成工作。有些低级应用程序仅在第 2 层运行,不包含 L3+ 组件。有些网络层应用程序不使用 L4+,因此它们不封装任何更高层的内容(如 ICMP)。您必须拥有您希望操作的层以下的所有层,但不需要任何层以上的内容。最常见的应用程序专注于第 4 层的读写,并让操作系统根据需要处理第 5 层和第 6 层。

最后,我理解你为什么感到困惑,以及为什么很难找到关于这个主题的好的信息。要真正理解这一切,你需要对网络、应用程序编程和操作系统设计有所了解,所以我花了很多年才觉得我充分了解了这一切的工作方式。

答案2

ICMP 是互联网控制消息协议顾名思义,ICMP 是一种互联网协议。 这是不是一个开放系统互连协议。

互联网协议栈只有四层:

  • 应用
  • 运输
  • 互联网
  • [链接](该层被认为存在于互联网之外,它不是由互联网协议栈本身指定的)

ICMP 是互联网层协议,是互联网协议栈的第二层。

还有其他流行的网络分层模型,例如以太网堆栈:

  • 链路层
    • 逻辑链路控制 (LLC)
    • 媒体访问控制 (MAC)
      • 协调子层 (RS)
  • 物理层
    • 物理编码子层 (PCS)
    • 物理介质附加子层 (PMA)
    • 物理介质相关子层 (PMD)

所有这 8 个层和子层加在一起只对应于 Internet 协议栈中的一个单层,即链路层。它们对应于 OSI 协议栈中的两个层,即物理层和数据链路层。

如您所见,所有这些不同的堆栈都有不同的层,并且不能保证一个堆栈中的协议(例如以太网堆栈中的 IEEE 802.3cd 或互联网堆栈中的 ICMP)可以完美地映射到不同的堆栈。

例如,您无法将 ICMP 映射到以太网堆栈。您可以尝试将 IEEE 802.3cd 映射到互联网堆栈,但这确实不精确:您只能说它属于链路层,但在以太网堆栈中,该层分为 8 个层和子层,而 IEEE 802.3cd 仅属于其中之一,而不是全部。

同样,如果您尝试将 IEEE 802.3cd 映射到 OSI 堆栈,您只能说它属于物理层,但在以太网堆栈中,它对应于三个不同的子层,而 IEEE 802.3cd 仅属于其中之一。

相关内容