ICMP是传输层协议吗?

17

我正在观看一段关于网络的视频讲座,在那里讲师提到ICMP是一个传输层协议。但是,谷歌搜索显示各种论坛将其描述为网络层协议。这让我很困惑。能否有人澄清一下?

2个回答

21

传输层协议涉及将数据从端到端发送并确保(或明确地不确保)可靠性。TCP用于从一台计算机向另一台计算机发送数据,并包含必要的逻辑以确保数据正确传输,而UDP则用于在希望获得可靠性的情况下从一台计算机向另一台计算机发送数据。

ICMP实际上并没有这样做。它的工作是帮助路由器确定互联网的形状以及使用不同协议发送数据包的方向。因此,它被认为是网络层协议,因为它的工作是确保数据被路由到正确的位置,但实际上并不路由数据。

希望这有所帮助!


3
这个答案中“typically”这个词不合适,要么是,要么不是。请删去“typically”。 - user207421
3
《RFC792》的第一段是关于ICMP协议的,其中写道:“ICMP利用IP的基本支持就像它是一个更高级别的协议,但实际上,ICMP实际上是IP的一个组成部分,并且必须由每个IP模块实现。” - Clifford Fajardo

8
毫无疑问,ICMP是一个网络层协议。它经常与传输层混淆的原因是ICMP在没有任何传输层的情况下工作。例如,ping或traceroute没有明确定义的端口。相反,每台机器的TCP/IP堆栈负责处理和响应传入的ICMP消息(而不是查找端口并传递给相应的应用程序,这是所有其他应用程序的情况)。
更新:
显然,这听起来令读者困惑,因此这里是Richard Stevens的《TCP/IP Illustrated》中解释概念和意图的快照。
引用该书。
“定位标记为ICMP和IGMP的协议框始终是一项挑战。早些时候,我们将它们显示在与IP相同的层次上,因为它们确实是IP的附属品。但是在这里,我们将它们显示在IP上方,以重申ICMP消息和IGMP消息封装在IP数据报中。”
教授“某些协议和应用程序”与每个层次负责不同任务(传输端到端,而网络则是跳到跳)的标准概念的不同工作方式是困难的,并需要时间消化。
接下来最重要的学习内容是,
即使您使用来自同一台计算机的多个控制台进行ping到另一个控制台,它仍然能够跟踪所有单独的所谓连接(仅涉及消息交换,否则没有像tcp那样的连接)。
如何完成上述操作取决于操作系统。Linux堆栈将8个字节放入ICMP的数据字段中,其中包含触发原始应用程序层的端口。这也在同一书籍中的ping程序下解释了。
同样适用于较低层协议,例如ARP / RARP。

它究竟是何时“常常与传输层混淆”?除了在这个问题中,我从未见过它。它能够在没有传输层的情况下工作并不意味着它在传输层中。否则,一切都必须在传输层中。你只是在增加混淆。 - user207421
1
首先,通过OSI模型学习,我发现学生们会认为总有某种传输层存在。如果没有看到它们,他们会认为ICMP可以独立处理传输。首先了解始终存在一个端口来标识应用程序,然后学习一些不需要端口的例外情况是新的。即使Stevens的圣经将ICMP列在某种混杂的领域中,称其在某种意义上像传输,在另一方面像网络。我对堆栈有一个模糊的印象。我会查找并在此引用。 - fkl
我并没有说我自己对ICMP感到困惑。令人困惑的是为什么有人会认为它是传输层协议,或者你声称的推理方式,这实际上是没有意义的,正如我所指出的那样。当然,如果人们坚持使用过时和不适用于TCP的OSI模型进行教学,而TCP本身有其自己的先前模型,那么任何事情都可能发生。 - user207421
2
书籍《Linux内核网络编程》(第3章)指出ICMP是第4层(传输层)协议。然而,我更倾向于支持Stevens的观点。http://www.amazon.com/Linux-Kernel-Networking-Implementation-Experts/dp/143026196X - holgac
3
我听说有一位斯坦福教授在谈论 ICMP 协议时加了一个警告:“严格来说,它是一个传输层协议,但它实际上是为网络层服务的。” 但我会相信创造者的话;此外,《RFC792》(https://tools.ietf.org/html/rfc792)这个文件概述了 ICMP 协议: “ICMP 使用 IP 的基本支持,就好像它是更高层的协议一样,然而,ICMP 实际上是 IP 的一个组成部分,并且必须被每个 IP 模块实现”。我倾向于相信,因为每个 IP 模块都需要它,所以它是一个网络协议。 - Clifford Fajardo
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接