networking - UDP、防火墙和 nat
问题描述
我正在调试一些使用 UDP 通信的代码。我的客户位于 NAT 和防火墙后面。我的服务器是我打开上述 UDP 端口的 AWS 机器。但是,该协议的一部分涉及服务器回答我的客户端。我预计不会工作(NAT和防火墙)。令我惊讶的是,我的客户端正在从服务器接收数据包!
这怎么可能?我的意思是,TCP(通过 UDP)有一个连接的概念,所以我猜 NAT 和路由器可以将传入的 UDP 数据包关联为对出口连接的回复。但是这对于纯 UDP 协议是如何(以及为什么)起作用的呢?我的 NAT/防火墙会让随机 UDP 进入我的客户端机器吗?
解决方案
这怎么可能?
这就是 NAT 的工作原理。您写道,服务器正在回答您的客户端。这意味着客户发起了对话。使用 UDP 而不是 TCP 并不重要。NAT 设备仍会创建适当的映射以让答案通过。否则,所有 UDP 都会在 NAT 之后被破坏。
我的意思是,TCP(通过 UDP)有一个连接的概念,所以我猜 NAT 和路由器可以将传入的 UDP 数据包关联为对出口连接的回复。但是这对于纯 UDP 协议是如何(以及为什么)起作用的呢?
UDP不是面向连接的事实是无关紧要的。当然,TCP 有会话的概念,但两者都有端口号,而这正是 NAT 所需要的。
我的 NAT/防火墙会让随机 UDP 进入我的客户端机器吗?
这不是“一些随机的 UDP”。它是来自客户端发送内容的相同 IP 和端口号的 UDP 段。
推荐阅读
- android - 一周中不同日子的 Android 通知
- css - 垂直对齐稍微偏离中心
- google-apps-script - 谷歌表格中“setformula”后的公式解析错误
- python - Flask 和 Threading 切换布尔变量:UnboundLocalError:分配前引用的局部变量 'test'
- azure - 从 Azure 服务结构群集中删除节点后,群集状态为“无法升级服务”
- javascript - node.js req.body 返回未定义(已解决)
- android - 在运行反应本机(cli)应用程序时停留在命令提示符上的空闲状态
- r - 带有嵌入式 R 代码的 Rcpp,不显示 R 代码的输出
- c# - 为什么 C# 在使用 GetComponent 时看不到另一个脚本中的变量?C#
- c++ - 将模板用作数组维度时,模板如何工作?