TCP和UDP在同一时间使用相同的端口是如何实现的?

16

我在搜索过程中看到,可以在同一台计算机上使用两个不同的程序通过网络通信,只要一个使用UDP,另一个使用TCP,并且使用相同的端口和网络接口。然而,我没有得到一个好的解释,它是如何实现的以及为什么这是可能的?

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

如果可能,请详细解释一下,或者提供一个关于这个主题的好文章链接。


1
这相当于问为什么可以同时拥有5个苹果和5个橙子。 - Oliver Charlesworth
1
好的,那我的第二个问题呢? - Xsmael
1
@OliverCharlesworth,完全不是这样。这一切都关乎“套接字”端点的区别所在。他的问题只是询问这种区别的因素有哪些。是的,TCP 是一个“苹果”,UDP 是一个“橙子”,但它们同样可以被视为套接字的“水果”。 - Brian White
2
@Xsmael “端口”是一个逻辑概念——它是一种接受或发起连接或数据的命名方式。恰好,TCP端口有端口号,UDP端口也有端口号。但是,“TCP和UDP上的相同端口”这样的东西并不存在,因为TCP端口永远不会是UDP端口,因为一个接受/发起TCP连接,而另一个接受/发起UDP数据。这使它们成为不同的端口。例如,计算机甚至可以有两个不同的UDP端口80,一个绑定到127.0.0.1,另一个绑定到127.0.0.2——它们是不同的端口。 - David Schwartz
3
@Xsmael,它们通常是绑定到回环接口的两个不同IP地址。但是如果你有两个套接字,一个绑定到IP 127.0.0.1的UDP端口80,另一个绑定到IP 127.0.0.2的UDP端口80,则它们绑定到不同的端口。发送到一个端口的流量不可能发送到另一个端口。可以将其视为第2个北码头和第2个南码头。它们具有相同的端口号,但是是不同的端口。 - David Schwartz
显示剩余4条评论
4个回答

23
其他回答是正确的,但有些不完整。
一个IP(又名“INET”)套接字“连接”(即两个进程之间的通信,可能位于不同的机器上)由五元组定义:协议、源地址、源端口、目标地址、目标端口。你可以看到这并不限于像TCP这样的有状态连接。
这意味着你可以将不同的进程绑定到该五元组的任何唯一实例。因为“协议”(例如TCP和UDP)是区分因素的一部分,所以每个都可以有不同的进程。
理论上,如果它们绑定到不同的接口(网络卡、环回等),则可以将不同的服务绑定到相同的TCP端口,尽管我从未尝试过。
然而,标准做法始终是在相同的端口号上使用相同的服务。如果支持UDP和TCP,则它们仅是与该相同服务通信的不同方式。例如,DNS在53号端口上使用UDP进行查找,因为它们是小型请求,比创建TCP连接更快,但DNS还会在53号端口上使用TCP进行“传输”,这是不经常发生且可能具有大量数据的操作。
最后,在完全准确性方面,它不一定是五元组。IP使用“协议”传递到下一层,例如TCP和UDP,尽管还有其他协议。TCP和UDP各自根据剩余的四个项目分别区分连接。可以在IP之上创建使用完全不同(也许没有端口)差异化机制的其他协议。
然后还有不同的套接字“域”,例如“unix”套接字域,它与“inet”完全不同,使用文件系统进行寻址。

从理论上讲,如果不同的服务绑定到不同的接口(网络卡等),则可以将它们绑定到相同的TCP端口,尽管我从未尝试过。实际上,这是正确的,我知道这一点,因为您可以将网络卡连接到不同的网络,通信是独立的。 - Xsmael
这意味着您可以将不同的进程绑定到该5元组的任何唯一实例。这是否意味着我可以在相同的端口和协议(比如TCP),但不同的目标IP上进行监听? - Xsmael
你的两个评论是一样的。IP地址与网络接口相关联。你应该能够将不同的进程绑定到不同IP地址上的相同TCP端口号...但我从未尝试过。这似乎是一个坏主意。 - Brian White
实际上,我的第二个评论不同。就我所理解的而言(如果我错了请告诉我),源IP是一个接口上本地计算机的IP地址,而目标IP是远程计算机的IP地址,因此不依赖于本地计算机接口。如果我使用不同的源IP,也就意味着使用不同的网络接口,那么它可以工作,但是如果只有不同的目标IP,会怎样?根据你的5元组方法。 - Xsmael
1
将出站套接字绑定到特定的IP/接口与将监听套接字绑定到特定的IP/接口没有任何区别。对于出站套接字,通常使用端口号0来让系统选择一个未使用的端口,而监听套接字通常希望使用一个明确定义的端口号。但从概念上讲,它们是相同的。因此,理论上可以在同一台机器和同一TCP端口号上拥有完全不同的服务,但绑定到不同的IP地址。这是不寻常的(至少可以这么说),因此其他限制(或直接的操作系统错误)可能会干扰。 - Brian White
显示剩余2条评论

5

仅通过IP地址和端口无法确定目标。还有一件事情- IP头有一个称为协议的字段,它区分TCP和UDP端点。因此,只要通信协议不同,就有可能让两个进程绑定到相同的IP:端口。


我可以同时在TCP的85端口和HTTP的同一端口85上进行监听吗? - Xsmael
不是。HTTP是一种应用层协议,它使用TCP。 - Prabhu
那么,传输层协议是基础吗?我们只需要在那个层面上检查对吧? - Xsmael

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

0

因为它们不是地址方式的唯一组成部分。这就像你可以在不同的街道上有相同编号的两座房子,或者你知道约翰·沃芬不是约翰·比格布特的红色Lectroid。

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

至于第二个问题,答案在其他地方。


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