N2N 奇怪的问题,导致我觉得其作者对于一些网络入门知识的理解出现错误?

2021-10-14 21:28:27 +08:00
 documentzhangx66
非引战,只是讨论问题。

1.在公网的 CentOS 7.6,yum 安装 n2n,并建立了 SuperNode 。

2.在公司内网的 CentOS 7.6 以同样方式,安装了相同版本的 n2n 来作为 EdgeNode 。

3.n2n 版本:
n2n v.2.9.0.r1015.f5b730b for x86_64-unknown-linux-gnu

4.公网的 SuperNode,没启动 N2N 的 SuperNode 程序,先在 SuperNode 的相同端口,启动了 TCP Server 程序与 UDP Server 程序;接着,公司内网的 EdgeNode 通过 TCP Client 程序与 UDP Client 程序,都能向 SuperNode 发送数据,证明网络没问题。也就是说公司内网的 EdgeNode 能主动访问公网的 SuperNode 的 TCP 与 UDP 端口。

5.SuperNode 启动后,无任何 WARNING 或 ERROR 。

6.问题来了,启动 EdgeNode,一开始也无任何 WARNING 或 ERROR,但进入注册阶段后,EdgeNode 每隔几秒就出现警告:
[edge_utils.c:1541] WARNING: supernode not responding, now trying .....

7.排查:
SuperNode 通过 netstat -nlap | grep SuperNode 端口,看到 tcp 与 udp 都在同一个 SuperNode 端口进行监听。但 EdgeNode 启动后,SuperNode 这边没看到有新的 tcp 连接。

先解释一下,使用命令 netstat -nlap | grep xx 端口后,如果该端口有新的 TCP 连接对 SuperNode 进行 connect 连入,会被显示出来。

既然没有新的 TCP 连接,那么 EdgeNode 必然是通过 UDP 来向 SuperNode 发送数据。

众所周知,UDP 是一个单向无回复的协议。

当 EdgeNode 向 SuperNode 发送了一条 UDP Request 请求数据,并且希望得到 SuperNode 的 Respond 响应数据,那么,

要不 EdgeNode 需要向 SuperNode 开一条新的 TCP 连接来拿 Respond 数据(方法 1 ),要不 SuperNode 需要向 EdgeNode 开一条新的 TCP 链接(方法 2 )或发送 UDP 数据(方法 3 )。

方法 1:从 SuperNode 的 netstat -nlap | grep SuperNode 端口来看,并没有 tcp 新连接产生。所以 N2N 并没有使用这种方法。

方法 2 与方法 3:从网络拓扑结构来看,公网的 SuperNode 也无法向内网的 EdgeNode 发送消息,这是基本常识。就算能发,说明 SuperNode 与 EdgeNode 互通或公司网关对内网的 EdgeNode 做了端口映射或 DMZ,此时也不需要 N2N 这款软件了。

所以,EdgeNode 报这个错:WARNING: supernode not responding,难道是作者对网络结构或 tcp 、udp 的理解,出现偏差??

但能写 N2N 的人,会犯这种低级错误?
1846 次点击
所在节点    问与答
1 条回复
ysc3839
2021-10-15 05:06:47 +08:00
绝大多数的 NAT 实现在内部主机向外发送 UDP 包后是允许外部主机发回的,如果真像你所说“公网的 SuperNode 也无法向内网的 EdgeNode 发送消息”,那可以认为 UDP 废掉了,这就和 NAT 的目的相违背了,NAT 是要在保证现有协议兼容性的情况下复用 IP 地址,不是防火墙。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/807893

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX