AlexGuo1998 最近的时间轴更新
AlexGuo1998

AlexGuo1998

V2EX 第 525200 号会员,加入于 2020-12-23 13:33:54 +08:00
AlexGuo1998 最近回复了
2021-10-09 00:36:07 +08:00
回复了 nowheretoseek 创建的主题 程序员 探讨下百度网盘机器人的实现
如果想直接调网盘 API 的话,可以参考一下 BaiduPCS-Py: https://github.com/PeterDing/BaiduPCS-Py
2021-06-28 17:14:19 +08:00
回复了 withzhaoyu 创建的主题 程序员 咨询下 v 友们志愿填报的问题
个人的经验(教训?)是要报真正喜欢的专业。
我大学都报到微电子去了,结果天天想着写代码,成绩也感人,最后延毕一年今年才毕业。
不过至少最后找到大厂工作了,算是有个好结局吧。
另外就是搞清你弟弟想读计算机是不是单纯因为喜欢打游戏(
2021-06-28 16:54:46 +08:00
回复了 RE 创建的主题 问与答 只要存在 Symmetric NAT 就无法打洞(穿透)了对吗?
前几天刚好发现这个问题,仔细研究了一下。
如果允许猜测的话,不妨把对称性 NAT 分为端口有规律和无规律两种,其中端口有规律定义为“可以在一定程度上预测下几次连接的外部端口”,端口无规律定义为“多次连接中内部端口、目标 IP 、目标端口任意一个变化时,外部端口在几乎全部范围内随机变化”,则一共有五种 NAT 。
甲:全锥形 乙:IP 限制锥形 丙:IP 和端口限制锥形 丁:有规律对称性 戊:无规律对称性(用甲乙丙丁戊来标识是为了防止和别处定义的 NAT 类型混淆)
甲和乙自然不必多说,可以和任意其他 NAT 连接;丙和丙之间也没有问题。剩下五组传统意义上都是不可能的,考虑猜测和概率的情况分别讨论:

丙丁:丙针对某一内部端口有确定的外部端口( a ),丁可以预测下一次连接的外部端口( b )。丙用 a 连接丁的 b,丁连接丙的 a 。此时很有可能丁使用的外部端口是 b,即打通。
为了增加成功率,丙可以用 a 连接多个丁的外部预测端口( b1, b2...),则丁使用任意一个外部端口时都可打通。

丁丁:两边都用多个内部端口连接对方的预测外部端口(不一定是下一次的外部端口,可能是几次后的)。
不妨记丁 1 的预测端口为 a,丁 2 的预测端口为 b,开始连接时,因为使用不同的内部端口,对称 NAT 会分配不同的外部端口,即丁 1 用( a1, a2...)连接丁 2 的 b,丁 2 用( b1, b2...)连接丁 1 的 a 。
只要 a 在( a1, a2...)中且 b 在( b1, b2...)中,即打通。
这就是一楼论文说的“两个对称 NAT 连接”的方法,据作者所说,测试成功率非常高,接近 100%。我这里没有实测过。
顺便论文链接挂掉了,这里好像还能下载到: https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.455.3700

丙戊:理论上是可行的,但是需要同时开大量(几百个)端口,且与概率相关。
丙用同一个外部端口( a )连接多个戊的外部端口( c1, c2...),戊用多个内部端口连接丙的外部端口( a )。
戊的内部端口不重要,重要的是 NAT 对这些端口分配了不同的外部端口( b1, b2...)。这样只要( b1, b2...)和( c1, c2...)中有一个重叠即打通。
听起来概率好像很低,但是实际上算一下还是可能的:设丙开启 m 个连接,戊开启 n 个连接,可以用以下递推公式算出打通的概率:
P(m,n) = P(m,n-1) + (1-P(m,n-1))*m/(65535-(n-1)),其中 P(m,0) = 0 。取几个数字:m=n=213 时 P=50.07%; m=n=300 时 P=74.83%; m=n=500 时 P=97.86%; m=n=600 时 P=99.61%; m=n=700 时 P=99.95%。
经过仿真,公式计算结果与仿真结果一致。不过我这里没有做实际的测试,也许会遇到开太多端口被临时封杀的情况。

丁戊:在可操作的范围内可能性很低。
我唯一能想到的方法就是丁连接戊的多个随机端口( d1, d2...),戊按顺序连接丁的多个预测端口( c1, c2...)。
记丁实际使用的外部端口为( a1, a2...),戊实际使用的外部端口为( b1, b2...),即丁第 m 次连接使用外部端口 a_m 连接 d_m,戊第 n 次连接使用外部端口 b_n 连接 c_n 。
因为丁可预测,可知( a1, a2...)与( c1, c2...)之间有较大部分重叠,取使 a_m 与 c_n 相同的 mn,判断 d_m 和 b_n 是否相同,如果相同则打通。
如果预测足够精准,每次 d_m 和 b_n 相等的概率就是 1/65535,而次数之间独立,P(m)=1-(1-1/65535)^m 。m=45425 时 P=50%。
不过两边都不需要同时打开上千个端口,可能和下面相比还算有一点微小的可能性——

戊戊:在可操作的范围内不可能。因为两边都是对不同目标端口随机选择外部端口,要打通约等于两只无头苍蝇撞上。单次连接成功的概率为 1/(65535^2)。
(当然如果两边都开 65535 个端口还不被封杀,概率还是比较高的。仿真结果不到 50%)

纯手打,如果有错还请大家纠正。
@hello2060 感觉现在的浏览器会自动识别,不一定需要 moov 放在头部了(当然放在头部应该更好)
上次用 Firefox 测试过:在线播放一个很大的 MP4 视频(~8GB,moov 在尾部),一开始 Firefox 直接无参数请求文件,下载了约 48KB 之后切断(可能判断没有读到 moov 块),然后用 Range 头请求了最末尾 100KB,最后从头部继续下载,结果是不必等待下载完全即可串流播放。后来用较小的文件测试结果一致,其他的浏览器应该也有类似的逻辑
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1035 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 13ms · UTC 21:19 · PVG 05:19 · LAX 13:19 · JFK 16:19
Developed with CodeLauncher
♥ Do have faith in what you're doing.