TCP和UDP套接字可以使用相同的端口吗?

139

首先,使用UDP和TCP在同一台服务器上是否存在问题?

其次,我可以使用相同的端口号吗?

2个回答

160

是的,你可以同时使用同一个端口号来处理TCP和UDP协议。很多协议已经这么做了,比如DNS使用udp/53 tcp/53。

技术上,每个协议的端口池是完全独立的,但对于可以使用TCP或UDP的高级协议而言,默认情况下它们使用相同的端口号是一种惯例。

当编写服务器时,请注意TCP套接字的事件顺序要比UDP套接字复杂得多,因为除了普通的socketbind调用外,您还需要进行listenaccept调用。

此外,accept调用将返回一个新的套接字,您还需要在该套接字上进行接收事件的轮询。您的服务器应该准备在原始套接字上继续accept连接,同时服务于多个客户端,每个客户端都将在其自己的套接字上触发接收事件。


1
另一个例子是在137-139上使用UDP和TCP的NetBIOS。 - Eric Fortis
2
@Eric Fortis RFC 1700里有很多例子,我们不必列举所有,好吧?;-) - user207421
2
@Eric Fortist,为什么每个人都应该了解NetBIOS端口号? - user207421
4
好的,请问您需要翻译的内容是什么? - Eric Fortis
16
这个答案没有解释的是:'端口' 的语义对于每个传输层协议(但有些可能没有此语义)是具体的(OSI模型第4层)。因此,TCP有自己的端口,由TCP堆栈解释;UDP有自己的端口,由UDP堆栈解释。因此可以说,UDP和TCP之间不共享端口;只是恰好两种协议都有相同的"端口"定义,并且为了简化起见,我们使用相同的端口值将不同类型的多个连接与同一服务关联起来。 - moala
显示剩余6条评论

14

首先,服务器上同时使用tcp和udp没有问题。

其次,我们可以在同一端口上同时有UDP和TCP请求,因为每个请求都由源IP,目标IP,源端口,目标端口和协议组成的五元组来标识 (因为协议可以是TCP或UDP)。


4
您所陈述的原因经常被提及,但实际上它是毫无意义的。不存在所谓的UDP连接,也没有任何情况下会考虑与相关协议无关的连接。事实上,端口分别是TCP和UDP的产物,因此永远不可能混淆它们。 - user207421
1
谢谢您指出我的错误。确实使用UDP没有连接。 - aMooly

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