UDP通过Internet。 它是如何工作的?

当我正在编程网络聊天(java,但不应该对问题产生影响),并且想要使用UDP时,我遇到了它无法通过互联网工作的问题。 经过一番研究后,我发现你必须为激活的特定端口进行端口转发。 所以现在谈到我的问题:

UDP是否以不可配置的方式在Internet上工作?

例如,如果我要编写整个网络游戏,那么使用UDP是否有意义? 或者我是否要求播放器激活Portforwarding并打开端口等?

什么时候使用UDP呢? 为什么?

我实际上并不理解UDP的全部要点。

对于我的编程观点,我希望有一种方法可以直观地使用它。 与创建DatagramSocketDatagramPacket ,使用数据和目标配置数据包并通过Internet将其发送出去。

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

您遇到的问题不是UDP与TCP之间的问题(尽管使用不可靠,无序的UDP作为聊天应用程序的基础对我来说似乎是一个奇怪的选择)。

问题是NAT遍历 。 简而言之,家用路由器执行称为NAT的网络function- 网络地址转换 。 他们这样做是为了为NAT内的所有机器使用单个公共IP地址(它们被赋予私有地址 – 通常是10.0.0.0或192.168.0.0)。 然后,路由器将从LAN内发送的所有数据包中的源IP地址从私有地址切换到公共地址。 它使用端口号“记住”哪台机器发送了什么地址,以便在响应到达时执行向后转换。

当有人想要启动与NAT后面的机器的连接时,就会出现问题。 在没有首先看到传出连接的情况下,NAT不知道应该将数据包转发到哪个内部计算机和端口。 这就是你发生的事情。

对于这个问题有各种修复,最简单的一种是手动端口转发(正如您所发现的),但它是任何对等应用程序所面临的众所周知的问题。 如果你需要联系NAT后面的机器(即联系大多数家庭用户)并且你希望你的应用程序开箱即用(没有你的用户摆弄他们的路由器)你需要研究NAT遍历技术,在你的实现中实现它们应用程序,并希望用户的家用路由器支持它们。 颈部疼痛很大。

编辑:与Joachim Pileborg的正确建议!

UDP通常是基于动作的游戏的更好选择,其中使用关于玩家,玩家输入或游戏世界的最新数据来更新客户端或服务器是至关重要的。

TCP以3次握手开始建立连接(这需要时间)。 如果您的游戏通信协议是通过TCP,则消息中的所有数据包必须在消息可用之前到达。 即使是少量的互联网拥塞也可能导致游戏延迟。

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

使用UDP,客户端或服务器可以在不依赖于按顺序到达的单个数据包中发送最新的播放器/游戏状态。 如果数据包迟到或者无序到达……应该忽略它。

UDP适用于需要快速通信的通信,但丢失单个数据包是可以的。

两者都应该在您的Java平台中可用。

这里有一些进一步的阅读: http : //gafferongames.com/networking-for-game-programmers/udp-vs-tcp/