Skip to content

P2P 对于一端的端口为动态端口(Symmetric NAT),优化打洞逻辑#198

Merged
djylb merged 3 commits intodjylb:masterfrom
cr4n5:master
Jan 20, 2026
Merged

P2P 对于一端的端口为动态端口(Symmetric NAT),优化打洞逻辑#198
djylb merged 3 commits intodjylb:masterfrom
cr4n5:master

Conversation

@cr4n5
Copy link
Copy Markdown
Contributor

@cr4n5 cr4n5 commented Jan 18, 2026

场景

逻辑

  • 动态端口:监听本地256(+1)个端口,并且每个本地端口都向固定端口端发送UDP探测包
  • 固定端口:只监听本地原先的一个端口,随机向动态端口端的65535个端口发送UDP探测包,上限为1000个端口

理论概率

$P=1-\frac{C_{65280}^{1000}}{C_{65536}^{1000}}=0.98$

PS

TODO

  1. 由于 父定时器等 会超时响应,1000个端口不会全部探测完,可能会影响成功率,这段待优化
  2. npc nat 的命令使用STUN服务器检查nat类型,不过会出现检测不准确的问题,例如检测出类型为Symmetric NAT,实际为固定端口,可以加一个使用nps的p2p服务进行检测

@djylb
Copy link
Copy Markdown
Owner

djylb commented Jan 18, 2026

貌似破坏旧版兼容性了,我想想咋处理。

@cr4n5
Copy link
Copy Markdown
Contributor Author

cr4n5 commented Jan 18, 2026

貌似破坏旧版兼容性了,我想想咋处理。

不同版本的npc应该是兼容的,只是nps与npc的p2p初步通信有了破坏性更改
我想可以把新增的本地回显地址放在通信内容的末尾,这样应该可以兼容 好像也不行...
nps对于不同npc版本发不同的p2p包应该可以做到新版本nps兼容旧版本npc

@djylb
Copy link
Copy Markdown
Owner

djylb commented Jan 18, 2026

貌似破坏旧版兼容性了,我想想咋处理。

不同版本的npc应该是兼容的,只是nps与npc的p2p初步通信有了破坏性更改
我想可以把新增的本地回显地址放在通信内容的末尾,这样应该可以兼容 好像也不行...
nps对于不同npc版本发不同的p2p包应该可以做到新版本nps兼容旧版本npc

没事,不兼容就不兼容吧,大版本号也该加了。我在想要不直接抛开历史包袱直接重构整个p2p部分,把能上的特性一块上了,比如用低ttl避免触发运营商防火墙之类的。

@cr4n5
Copy link
Copy Markdown
Contributor Author

cr4n5 commented Jan 19, 2026

提交后的逻辑,应该基本能完成一端为 对称型 ,另一端为 端口受限型 的打洞,除非 对称型 的出口ip有多个
如果要重构p2p的代码,我觉得也得考虑一下需求面,测试情况覆盖,稳定性
若要继续增加p2p的成功率就要考虑俩端都为 对称型 或者 多出口ip 的情况,也需要考虑这种情况对于用户占比高不高
单增加使用 低ttl 可能( 也暂时不需要重构

@djylb djylb merged commit f70450c into djylb:master Jan 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants