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

标签 java networking network-programming udp nat

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

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

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

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

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

从我的编程角度来看,我希望有一种直观的方式来使用它。 就像创建 DatagramSocketDatagramPacket 一样,使用 Data 和 Destination 配置数据包并通过 Internet 将其发送出去。

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

最佳答案

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

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

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

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

关于java - 互联网上的 UDP。它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25095459/

相关文章:

java - 在构建 JSTL 经典 Select 标签后,我应该将 null 设置为大项吗

Java 使用对象和构造函数

linux - 内核模块到以太网数据包回显

virtio : how does it control the network speed/duplex? 中的 Linux ethtool

Java:根据我的类(class)校正器的说法,为什么这是错误的?

java - Java 的非阻塞 Web 服务器

java - 通过 Java 中的按钮终止服务器程序

c - 最长前缀匹配表

iPhone TCP 连接

networking - 如何使用 UdpSocket 通过特定网络接口(interface)发送?