ICMP 怎么能不使用端口,而 TCP/IP 呢?

How can ICMP not use a port, but TCP/IP does?

对于诸如 ICMP 之类的协议,它不需要端口。那么,为什么各种 TCP 和 UDP 应用程序需要为其分配一个端口呢?只有一个端口然后将应用程序名称之类的东西路由到正确位置的缺点是什么——例如,它会转到一个端口并具有 application="mysql" 标记,而不是“3306”?

端口是一些 transport-layer协议的地址,具体来说,TCP和UDP使用端口号。 TCP和UDP都使用相同范围的端口号(0到65535),因为它们都使用16位无符号整数作为端口号,但它们不是相同的端口; TCP 端口 12345 与 UDP 端口 12345 不同。其他传输协议使用其他寻址,或根本不寻址。

例如,这是 RFC 793, Transmission Control Protocol 定义端口的方式:

To allow for many processes within a single Host to use TCP communication facilities simultaneously, the TCP provides a set of addresses or ports within each host.

ICMP不是传输协议,它是IP的组成部分。 RFC 792, Internet Message Control Protocol 是这样表述的:

ICMP, uses the basic support of IP as if it were a higher level protocol, however, ICMP is actually an integral part of IP, and must be implemented by every IP module.

它回到网络层以及每一层如何选择将层数据报的有效负载发送到哪里。例如,以太网 header 具有以太网类型字段,该字段告诉以太网将以太网帧的有效负载发送到哪里。不同的协议将向以太网模块注册。 IPv4 使用以太网类型 0x800,IPv6 使用以太网类型 0x86DD。 Here is the list of registered Ether Types.

IPv4 有协议字段(IPv6 使用下一个 Header 字段来做同样的事情)告诉它把数据包有效负载发送到哪里。 ICMP 是第 1 号协议,UDP 是第 17 号协议,TCP 是第 6 号协议。一个协议将向 IP 模块注册,以告诉它将数据包的有效负载发送到哪里。 Here is the list of registered protocol numbers.

以同样的方式,一些传输协议允许应用程序向传输协议注册,以便传输协议知道将传输数据报的有效负载发送到哪里。例如,默认情况下,HTTP 服务器将向 TCP 注册其端口 80,但可以修改。