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

时间:2014-08-02 13:20:34

标签: java networking network-programming udp nat

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

UDP是否以不可配置的方式在Internet上运行?

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

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

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

对于我的编程观点,我想有办法直观地使用它。 与创建DatagramSocketDatagramPacket一样,使用数据和目标配置数据包并通过互联网发送。

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

2 个答案:

答案 0 :(得分:5)

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

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

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

此问题有各种修复,最简单的一种是手动端口转发(如您所发现的),但这是任何点对点应用程序所面临的众所周知的问题。如果您需要联系NAT后面的计算机(即联系大多数家庭用户)并且您希望您的应用程序能够开箱即用(没有您的用户摆弄他们的路由器),您需要研究NAT遍历技术,在您的实施中实现它们应用程序,并希望用户的家用路由器支持它们。这是脖子上的巨大痛苦。

答案 1 :(得分:0)

编辑:与Joachim Pileborg一起提出正确的建议!

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

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

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

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

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

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

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