我刚刚了解到 Ping 直接使用 ICMP,即它绕过了传输层。这怎么可能呢?应用程序 (L5) 不应该在传输层 (L4) 中使用 UDP 或 TCP 吗?我知道的是,每一层都看不到 2 层以下的所有内容,即应用程序使用套接字与 L4 交互,但看不到 L3 到 L1。
答案1
当人们说“Ping”时,他们指的是 ICMP ping,因为这就是最初的平是的。ICMP 实际上比 UDP 和 TCP 传输协议的运行级别要低,并且不使用端口[1]:
ICMP,像一个更高级别的协议一样使用IP的基本支持,但实际上ICMP是IP的一个组成部分,每个IP模块都必须实现。
这主要是因为 ICMP 用于报告错误,因为 IP 本身并不完全可靠。因此,ICMP 是一种使用 IP 而不是 TCP/UDP 的低级协议。Ping 只是一个使用 ICMP 的工具(得益于低级 C),但是,ICMP 不仅仅是 ping 或 traceroute,它的主要用途完全不同,正如我所指出的那样。
我不知道您是如何得知层对下层是盲目的。事实并非如此,至少就我所知并非如此。Ping 可以通过在 C 中实现它想要的任何协议来使用它。
像 C 这样的低级语言可以直接访问基于系统 IP 的模块,因此可以使用 C(以及现在几乎任何其他用 C 编写的语言)来使用任何此类协议。
更明确地解释一下(tl;dr):
Ping 是基于 ICMP 的工具,它不使用 TCP 和 UDP,因此它不能与端口一起工作(因为协议不需要端口,只有服务才需要)。它不需要更高级别协议(如 TCP)的功能,因此它不实现它们。尽管平作为一个应用程序,它在 ICMP 上运行并且不使用任何端口。