免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: mik
打印 上一主题 下一主题

大家讨论一下 IM 的实现结构和方案 [复制链接]

论坛徽章:
0
81 [报告]
发表于 2009-07-07 23:52 |只看该作者
原帖由 flw 于 2009-7-7 23:32 发表

你说的不错,TCP 穿越的关键点正是在这个地方。

你知道“同时打开”这个概念吗?
服务器 X 为 A 和 B 两个 client 做好时间同步,
A 和 B 同时向对方发起连接请求,只要时间偏移控制在 MSL 之内,
理论 ...



我在做udp穿越的时候, 这样尝试过, 但这个时间很难控制, 很难保证从a发出去的包, 在没到达b的gateway前, b必须向a发出一个包。


我当时做udp的做法是控制ttl, 让a象b发出的包, 在经过他的nat后, 直接丢弃。 b也是同样的, 然后在彼此发包。

但tcp这样做不行, 所以很难对这个时间。成功几率应该不大。不过这个的确没尝试过。

[ 本帖最后由 xhl 于 2009-7-12 00:47 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
82 [报告]
发表于 2009-07-07 23:56 |只看该作者
原帖由 xhl 于 2009-7-7 23:52 发表

我在做udp穿越的时候, 这样尝试过, 但这个时间很难控制, 很难保证从a发出去的包, 在没到达b的gameway前, b必须向a发出一个包。

我当时做udp的做法是控制ttl, 让a象b发出的包, 在经过他的nat后 ...

有一些增加成功率的办法,
比如修改 TTL,改变 TCP 序号、SYN flood,以及通过 server IP 欺骗实现伪三次握手。
不过有些操作需要 root 用户权限,就不是那么方便了。

在网络条件好的时候,同时打开应该还是很容易实现的。

[ 本帖最后由 flw 于 2009-7-8 00:01 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
83 [报告]
发表于 2009-07-08 00:12 |只看该作者
原帖由 xhl 于 2009-7-8 00:03 发表


哈哈, 要想做到很高的穿透率, 还是很难的。 因为nat多半都是平行的, 要分析很多类型, 猜他的算法, 堵他分配的临时port.

其实tcp的穿越 也可以通过 ip-over-udp来实现, 就是如果能打通udp, 可以用他 ...

端口的问题确实是个大问题。

ip-over-udp 的想法我 2003 年也搞过,
可惜灌水灌太多了,没时间搞这些有意义的东西了。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
84 [报告]
发表于 2009-07-08 00:45 |只看该作者
原帖由 xhl 于 2009-7-7 20:09 发表

都是必须先是出去到某个指定的ip:port的, 在nat上记录一个短时间的名单, 这样外面这个ipOR ...

你说的不错,TCP 穿越的关键点正是在这个地方。

你知道“同时打开”这个概念吗?
服务器 X 为 A 和 B 两个 client 做好时间同步,
A 和 B 同时向对方发起连接请求,只要时间偏移控制在 MSL 之内,
理论上是可以完成三次握手成功穿越的。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
85 [报告]
发表于 2009-07-08 02:44 |只看该作者
原帖由 xhl 于 2009-7-7 23:52 发表
我在做udp穿越的时候, 这样尝试过, 但这个时间很难控制, 很难保证从a发出去的包, 在没到达b的gameway前, b必须向a发出一个包。
我当时做udp的做法是控制ttl, 让a象b发出的包, 在经过他的nat后 ...


我本地简单的模拟了一下

同一个socket

  1. bind 127.0.0.1 2000
  2. connect 127.0.0.1 2000
复制代码

每次都能连接成功

两个socket(不同进程的)分别

  1. bind 127.0.0.1 2000
  2. connect 127.0.0.1 2001
复制代码

  1. bind 127.0.0.1 2001
  2. connect 127.0.0.1 2000
复制代码

就不能连接成功了.  是不是需要设置一个什么号,具体怎么操作呢?
如果过了nat一般怎么获取外部的端口呢?

论坛徽章:
0
86 [报告]
发表于 2009-07-08 06:18 |只看该作者
HTTP端口是没法封的,因为封了,那人家啥Web事都做不了。
放着HTTP阳关道不走,非要走独木桥?

论坛徽章:
0
87 [报告]
发表于 2009-07-08 08:06 |只看该作者

回复 #87 xinglp 的帖子

需要中间服务器仲裁,帮助做时间控制和端口号预测。控制做的好的话成功率还是很高的。

论坛徽章:
34
ChinaUnix元老
日期:2018-07-04 15:10:362015年亚洲杯之阿联酋
日期:2015-02-06 17:15:532015亚冠之武里南联
日期:2015-06-06 15:40:252015亚冠之北京国安
日期:2015-06-17 15:42:412022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:322015亚冠之阿尔纳斯尔
日期:2015-09-20 09:42:1215-16赛季CBA联赛之北京
日期:2016-01-15 10:03:5915-16赛季CBA联赛之青岛
日期:2016-04-26 16:44:4915-16赛季CBA联赛之广夏
日期:2018-07-04 15:33:21C
日期:2016-10-25 16:12:142017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之同曦
日期:2017-02-22 22:41:10
88 [报告]
发表于 2009-07-08 10:37 |只看该作者

回复 #3 html1999 的帖子

楼主跟马腾化联系吧!

论坛徽章:
0
89 [报告]
发表于 2009-07-08 11:26 |只看该作者

回复 #2 xhl 的帖子

Miranda IM 熟悉吗,我要做这个了,到时有不懂的向你请教啊

论坛徽章:
0
90 [报告]
发表于 2009-07-08 13:31 |只看该作者
87楼的兄弟。  我没怎么看明白你的测试。

p2p的tcp也不是同时彼此都打开一条连接。 而是一个listen 一个connect.

至于说如何知道nat外面的地址, 有公用的协议, stun, turn 等, 都是判断自己的网络出口用的。


89楼的兄弟, 我认为靠中间server来协调发包时间是不可能的。 因为存在网络时延。

                               s
                             /   \
                            /     \
                           a --- b     

三者之间的带宽是不保证平衡的,而且一个ip包的速度, 跨度范围也很大, 往往这样做的结果就是, 一方还是过早的到达另一方。 被记了黑名单。

猜nat规则一般是用stun 来完成就可以了, 不过要增加点特殊操作, 标准的不够用。

[ 本帖最后由 xhl 于 2009-7-8 13:33 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP