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

Lok*_*oki 4 java networking udp network-programming nat

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

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

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

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

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

对于我的编程观点,我希望有一种方法可以直观地使用它.与创建DatagramSocket和创建一样DatagramPacket,使用数据和目的地配置数据包并通过互联网发送.

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

Mal*_*alt 5

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

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

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

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