为啥可以同时在 TCP 和 UDP 上使用相同的端口?

Posted

技术标签:

【中文标题】为啥可以同时在 TCP 和 UDP 上使用相同的端口?【英文标题】:Why is it possible to use the same port on TCP and UDP at the same time?为什么可以同时在 TCP 和 UDP 上使用相同的端口? 【发布时间】:2015-06-17 01:27:41 【问题描述】:

我在搜索时看到可以在同一台计算机上使用两个不同的程序,使用相同的端口和相同的网络接口通过网络进行通信,前提是一个使用 UDP,另一个使用 TCP。但是我没有得到很好的解释,它实际上是如何工作的以及为什么会这样?

由于 UDP 不会在对等方之间建立真正的连接,而只是将数据包发送到某个地址,因此多个程序是否也可以使用相同的 UDP 端口?我知道 TCP 不可能,因为它会在服务器和客户端之间创建同步连接,但是 UDP 呢?

如果可能,请详细解释,或链接有关该主题的好文章。

【问题讨论】:

这相当于问为什么可能同时有5个苹果和5个橙子。 好的,我的第二个问题怎么样? @OliverCharlesworth,一点也不。这完全是关于区分“套接字”端点的原因。他的问题只是哪些因素是这种差异的一部分。是的,TCP 是“苹果”,而 UDP 是“橙子”,但很容易两者都只是套接字的“果实”。 @Xsmael “端口”是一个逻辑概念——它是一种接受或发起连接或数据的命名方式。碰巧的是,TCP 端口有端口号。此外,UDP 端口具有端口号。但是不存在“TCP 和 UDP 上的相同端口”之类的东西,因为 TCP 端口永远不会与 UDP 端口相同,因为一个接受/发起 TCP 连接,另一个接受/发起 UDP 数据。这使它们成为不同的端口。一台计算机甚至可以有两个不同的 UDP 端口 80,例如,一个绑定到 127.0.0.1,另一个绑定到 127.0.0.2——它们是不同的端口。 @Xsmael 它们通常是绑定到环回接口的两个不同 IP 地址。但是,如果您有两个套接字,一个绑定到 IP 127.0.0.1 的 UDP 端口 80,另一个绑定到 IP 127.0.0.2 的 UDP 端口 80,它们绑定到不同的端口。发往一个端口的传入流量不可能发往另一个端口。可以把它想象成对接端口 2 向北和对接端口 2 向南。它们的端口号相同,但端口不同。 【参考方案1】:

其他答案是正确的,但有些不完整。

IP(又名“INET”)套接字“连接”(即两个进程之间的通信,可能在不同的机器上)由 5 元组定义:协议、源地址、源端口、目的地址,目的端口。可以看到,这不仅限于 TCP 之类的有状态连接。

这意味着您可以将不同的进程绑定到该 5 元组的任何唯一实例。因为“协议”(例如 TCP 和 UDP)是区分因素的一部分,所以每个都可以有不同的进程。

理论上,如果不同的服务绑定到不同的接口(网卡、环回等),您可以将它们绑定到同一个 TCP 端口,尽管我从未尝试过。

然而,标准做法是始终在同一个端口号上使用同一个服务。如果同时支持 UDP 和 TCP,它们只是与同一服务通信的不同方式。例如,DNS 使用端口 53 上的 UDP 进行查找,因为它们是小请求,并且比创建 TCP 连接更快,但 DNS 也使用端口 53 上的 TCP 进行“传输”,这种传输不频繁且可能包含大量数据。

最后,完全准确地说,它不一定是 5 元组。 IP 使用“协议”传递到下一层,例如 TCP 和 UDP,尽管还有其他的。 TCP 和 UDP 分别根据其余 4 项区分连接。可以在 IP 之上创建使用完全不同(可能是无端口)差异化机制的其他协议。

然后还有不同的套接字“域”,比如“unix”套接字域,它与“inet”完全不同,使用文件系统进行寻址。

【讨论】:

理论上,如果不同的服务绑定到不同的接口(网卡等),你可以将它们绑定到同一个 TCP 端口,虽然我从未尝试过。对,我知道,因为你可以将网卡连接到不同的网络,所以通信是独立的。 这意味着您可以将不同的进程绑定到该 5 元组的任何唯一实例。 这是否意味着我可以侦听相同的端口和相同的协议(比方说)TCP但不同的目的地IP? 你的两个cmets是一样的。 IP 地址与网络接口相关联。您应该能够将不同的进程绑定到不同 IP 地址上的相同 TCP 端口号……但我从未尝试过。似乎是个坏主意。 其实我的第二条评论是不同的。据我了解(如果我错了,请告诉我)source ip 是本地计算机在一个接口上的 ip,而 destination ip 是远程计算机的 ip,因此不依赖本地计算机接口。如果我使用不同的 source ip 这意味着不同的网络接口,那么它会起作用,但是不同的 destination ip 怎么样?根据您的 5 元组方法 为传出套接字绑定到特定 IP/接口与为侦听套接字绑定到特定 IP/接口没有任何不同。对于传出套接字,您通常使用端口#0 让系统选择一个未使用的套接字,而侦听套接字通常希望使用明确定义的端口号。但从概念上讲是一样的。所以是的,理论上可以在同一台机器和相同的 TCP 端口号上拥有完全不同的服务,但绑定到不同的 IP 地址。这是不常见的(至少可以说),因此其他限制(或彻底的操作系统错误)可能会干扰。【参考方案2】:

目标不是由 IP Addr:Port 单独识别的。还有一件事 - IP 标头有一个名为 Protocol 的字段,用于区分 TCP 和 UDP 端点。因此,只要通信协议不同,两个进程就可以绑定到同一个 IP:Port。

【讨论】:

所以我可以同时监听 TCP 的 85 端口和 HTTP 的 85 端口? 没有。 HTTP 是使用 TCP 的应用程序级协议。 那么,传输层协议,是基础吗?我们只需要检查那个级别吗?【参考方案3】:

连接的端点是由 IP、协议(TCP 或 UDP)和端口定义的 UDP 和 TCP。这意味着只要您使用不同的协议,通信的端点也是不同的。

【讨论】:

【参考方案4】:

因为它们不是寻址方式的唯一组成部分。这与为什么您可以在不同的街道上拥有两个相同编号的房屋,或者您知道 John Whorfin 与 John Bigbooté 不是同一个 Red Lectroid 的原因相同。

每个 IP 数据包都包含一个字段,说明要使用哪种传输层协议,并且在该协议的域内有一组端口,可以与任何其他协议相同,因为它们实际上是完全独立的设置。

关于第二个问题,there are answers elsewhere.

【讨论】:

以上是关于为啥可以同时在 TCP 和 UDP 上使用相同的端口?的主要内容,如果未能解决你的问题,请参考以下文章

请问同一台机器上udp端口和tcp端口可以一样对吗,不会冲突?

TCP有235端口,UDP也可以有235端口,为啥不会冲突?

TCP/IP协议的端口号

TCP和UDP使用同一端口通信

这篇 TCP UDP 绝了!

为啥tcp udp两种端口是否一样的呢?