互联网上的UDP。它是如何工作的?

7

我正在编写一个网络聊天程序(使用Java,但对问题没有影响),并希望使用UDP协议,但在互联网上它没有工作。经过一些调查,我发现必须激活特定端口的端口转发。所以现在我的问题是:

UDP是否可以在互联网上以非可配置方式工作?比如,如果我想编写一个完整的网络游戏,使用UDP有意义吗?或者需要玩家激活端口转发和打开端口等操作?

那么什么时候使用UDP才有意义?为什么?

我实际上并不理解UDP的全部意义。

从我的编程角度来看,我希望有一种直观的方法来使用它。例如创建DatagramSocketDatagramPacket,配置数据和目标包并将其发送到互联网上。

至于我的用户,我不希望他们进行任何特定的配置,比如打开他们想要使用的确切端口等。我只希望他们使用程序(服务器和客户端),它应该工作。


1
昨天更具体地针对了这个项目。我没有得到答案,为什么这个问题现在似乎深深地沉没在 StackOverflow 的深处。因为我想要得到答案,所以我再次提问。 - Loki
大多数多人游戏使用UDP进行大部分通信。但是对于聊天,它们通常不使用UDP,而是使用TCP。 - Some programmer dude
不要重复提出相同或过于相似的问题,而是修改现有的问题。请耐心等待,您可能不会立即得到答案,但好的问题往往会尽早得到回答。 - Some programmer dude
1
那么他们如何处理用户打开端口并激活端口转发的要求? - Loki
1
你可能想要阅读并学习关于UPnP的内容。 - Some programmer dude
2个回答

6
您遇到的问题不是UDP与TCP的问题(虽然我认为使用不可靠的、无序的UDP作为聊天应用程序的基础似乎是一个奇怪的选择)。
问题在于NAT穿透。简而言之,家用路由器执行一项名为NAT-网络地址转换的网络功能。他们这样做是为了使用单个公共IP地址来为NAT内部的所有机器(赋予私有地址 - 通常是10.0.0.0或192.168.0.0)提供服务。然后,路由器将来自局域网内部的所有数据包中的源IP地址从私有地址更改为公共地址。它使用端口号“记住”哪台机器向哪个地址发送了什么,以便在响应到达时执行反向转换。
当有人想要初始化与NAT后面的机器建立连接时,问题就出现了。没有看到先前的传出连接,NAT不知道应该将数据包转发到哪个内部计算机和端口。这就是发生在您身上的事情。

这个问题有多种解决方法,最简单的方法是手动端口转发(就像你已经发现的那样),但这是任何点对点应用程序所面临的一个众所周知的问题。如果您需要联系NAT后面的机器(即联系大多数家庭用户)并且希望您的应用程序开箱即用(无需用户调整其路由器),则需要研究NAT穿越技术,在应用程序中实现它们,并希望用户的家庭路由器支持它们。这是一个巨大的麻烦。


那么,回到游戏示例,他们使用NAT穿透技术来保持用户的配置过程? - Loki
1
点对点应用程序(如BitTorrent、Skype等)都必须进行某种形式的NAT穿透。一种穿越NAT的示例技术是让用户与某个中央服务器保持永久的TCP连接(由用户发起)。然后,如果有人想要向特定用户发送消息,则将消息发送到服务器,服务器再将其中继给相关用户。 - Malt
1
另一个例子是使用多种协议之一来自动配置NAT。例如IGD:https://en.wikipedia.org/wiki/Internet_Gateway_Device_Protocol这个想法是在用户程序中使用IGD来配置用户的NAT。 - Malt
1
是的,TCP也存在类似的问题,只要监听传入连接的机器位于NAT后面。在这里,看一下Vuze(比特流客户端)维基上的NAT指南:http://wiki.vuze.com/w/NAT_problem - Malt
1
这是另一个可能有用的链接: https://dev59.com/aHI_5IYBdhLWcg3wEOzq - Malt
显示剩余2条评论

0

编辑:根据Joachim Pileborg的正确建议进行了修改!

UDP通常是动作类游戏的更好选择,对于需要及时更新有关玩家、玩家输入或游戏世界的最新数据的客户端或服务器至关重要。

TCP通过三次握手来建立连接(这需要时间)。如果您的游戏通信协议是通过TCP进行的,则必须在消息中接收到所有数据包后才能使用该消息。即使是少量的互联网拥塞也可能导致游戏延迟。

TCP适用于必须完全到达的通信。

使用UDP,客户端或服务器可以通过单个数据包发送最新的玩家/游戏状态,而这些数据包不依赖于按顺序到达。如果数据包迟到或乱序到达...应该忽略它们。

UDP适用于需要快速传输但丢失单个数据包无关紧要的通信。

Java平台中应该都提供了这两种协议。

以下是一些进一步阅读材料: http://gafferongames.com/networking-for-game-programmers/udp-vs-tcp/


1
TCP/IP是完整IP协议栈的通用名称,我想你指的只是TCP。而且仅在连接建立时是同步的,一旦连接建立,协议就完全是异步的。 - Some programmer dude

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