TCP P2P 技术 穿透NAT

161 views
Skip to first unread message

周立发

unread,
Aug 17, 2009, 11:51:58 PM8/17/09
to weihuachao1984, china-li...@googlegroups.com
我研究P2P穿越NAT技术也有一段时间了,相关文档其实也很多,不过全是英文的,我都放在我的docs.google.com里,如果你需要我可以共享给你。

附件是我在网上找到的一份源代码。假设你一台Server有公网IP地址,另外有一些Client在局域网内,并且可以是分布在不同的局域网里,比如你家里和公司两台局域网的电脑,都可以在nat-reg.h文件里设定Server的IP地址,然后在命令行运行Client,Client会连接Server并注册自己,然后两个Client之间就可以穿透NAT进行P2P通信了。如果你有条件可以试一下并麻烦告诉我结果,看这份源代码是否能实现基于TCP的NAT穿透。

源代码使用方法:
1、解压
2、make
3、在Server上运行nat-server
4、在多个Client上运行nat-client
nat-punch.zip

王虎

unread,
Aug 18, 2009, 2:09:05 AM8/18/09
to china-li...@googlegroups.com
好东西啊,研究研究。
麻烦把资料共享给我吧。
谢谢……

2009/8/18 周立发 <zhou...@gmail.com>

Jacky

unread,
Aug 18, 2009, 5:39:13 AM8/18/09
to China Linux Fans
应该看到邮件里共享的文档了吧?收不到再告诉我
收到了一起研究、共享心得啊

On 8月18日, 下午2时09分, 王虎 <ghostste...@gmail.com> wrote:
> 好东西啊,研究研究。麻烦把资料共享给我吧。
> 谢谢……
>

> 2009/8/18 周立发 <zhoul...@gmail.com>
>
> > 我研究P2P穿越NAT技术也有一段时间了,相关文档其实也很多,不过全是英文的,我都放在我的docs.google.com

Jacky

unread,
Aug 18, 2009, 9:52:24 AM8/18/09
to China Linux Fans
刚仔细看了一下,这份源代码是基于UDP的,UDP穿透NAT是很简单的,大家应该都会的。
我这儿有几份TCP方面的文档,有兴趣的朋友一起研究一下吧:
p2pCommunicationAcrossNAT.pdf
https://docs.google.com/fileview?id=0B5vB2C0NG8AeNTljYTY4ODEtM2ZjZS00NzA5LTllNmQtZTQ0M2E1NmIxMDM1&hl=zh_CN

CharacterizationAndMeasurementOfTCPTraversalThroughNATsAndFirewalls.pdf
https://docs.google.com/fileview?id=0B5vB2C0NG8AeOTZlOTAwMDEtNzU3NC00N2Q1LWI2YmEtZjU1YmNiNjI0NDhl&hl=zh_CN

natblasterEstablishingTCPConnectionsBetweenHostsBehindNATs.pdf
https://docs.google.com/fileview?id=0B5vB2C0NG8AeNWM3ZGU5MGMtOGMyZS00MDQ2LWFiZTEtYjY4YWFmNzg1OWVh&hl=zh_CN

Microtiger

unread,
Aug 18, 2009, 9:57:11 PM8/18/09
to china-li...@googlegroups.com
发哥,也共享给我吧,我对这个也很有兴趣,想研究研究!
I want to be a complete engineer - technical genius and sensitive humanist all in one!


2009/8/18 Jacky <zhou...@gmail.com>

Microtiger

unread,
Aug 18, 2009, 10:01:11 PM8/18/09
to china-li...@googlegroups.com
上面的文章都打不开,报告如下错误:

抱歉,您请求的页面(或在线文档)无法访问。

请检查地址并重试。


I want to be a complete engineer - technical genius and sensitive humanist all in one!


2009/8/19 Microtiger <micro...@gmail.com>

Jacky

unread,
Aug 19, 2009, 10:10:59 PM8/19/09
to China Linux Fans
其它几位朋友都下载成功了呢,你再试试

On 8月19日, 上午10时01分, Microtiger <microti...@gmail.com> wrote:
> 上面的文章都打不开,报告如下错误:
>
> 抱歉,您请求的页面(或在线文档)无法访问。
>
> 请检查地址并重试。
>
> I want to be a complete engineer - technical genius and sensitive humanist
> all in one!
>

> 2009/8/19 Microtiger <microti...@gmail.com>


>
> > 发哥,也共享给我吧,我对这个也很有兴趣,想研究研究!
> > I want to be a complete engineer - technical genius and sensitive humanist
> > all in one!
>

> > 2009/8/18 Jacky <zhoul...@gmail.com>


>
> > 刚仔细看了一下,这份源代码是基于UDP的,UDP穿透NAT是很简单的,大家应该都会的。
> >> 我这儿有几份TCP方面的文档,有兴趣的朋友一起研究一下吧:
> >> p2pCommunicationAcrossNAT.pdf
>

> >>https://docs.google.com/fileview?id=0B5vB2C0NG8AeNTljYTY4ODEtM2ZjZS00...
>
> >> CharacterizationAndMeasurementOfTCPTraversalThroughNATsAndFirewalls.pdf
>
> >>https://docs.google.com/fileview?id=0B5vB2C0NG8AeOTZlOTAwMDEtNzU3NC00...
>
> >> natblasterEstablishingTCPConnectionsBetweenHostsBehindNATs.pdf
>
> >>https://docs.google.com/fileview?id=0B5vB2C0NG8AeNWM3ZGU5MGMtOGMyZS00...

xuanfei

unread,
Aug 27, 2009, 12:56:30 PM8/27/09
to china-li...@googlegroups.com
哇塞!这段时间没来,那么多东西好玩的东西哈, 忙完手头项目;马上玩下这个, 其实很久以前都想实现这个功能,只是当初连脚本都还些不会:)

我的环境相当吻合,感觉这个功能是就像是我提的需求一样 嘿嘿:)

谢谢发哥^_^


--
祝 => 天天天蓝:)
following => https://twitter.com/xuanfei

Jacky

unread,
Aug 28, 2009, 7:06:26 AM8/28/09
to China Linux Fans
你那里有环境太好了,我想写些程序测试一下,如果能成功这是绝对有突破意义的。想想局域网里一台主机都可以开Web服务而不需要公网IP,多爽啊

得意孤星

unread,
Aug 28, 2009, 7:48:55 AM8/28/09
to china-li...@googlegroups.com
局域网里面的主机可以开web服务什么意思阿

--
Sent from my mobile device

kemy.chen
bbs.cnsmartphone.com

Jacky

unread,
Aug 28, 2009, 8:28:05 AM8/28/09
to China Linux Fans
如果你现在要开个网站让大家访问需要什么条件?一台机器,那是当然的。
然后呢?你这台机器得有个公网IP地址,或者需要在网关上做端口转发到你这台机器别人才能访问到吧?
如果TCP 穿透NAT技术实现了,那么就实现在我们这种条件下的任何人只要有台电脑就可以开个网络服务给其它人,比如HTTP Server、
FTP Server,最好是做个视频服务。
最终就实现了基于TCP的P2P网络了,不象现在的QQ、MSN之流用UDP做P2P

On 8月28日, 下午7时48分, 得意孤星 <kemy.c...@gmail.com> wrote:
> 局域网里面的主机可以开web服务什么意思阿

得意孤星

unread,
Aug 28, 2009, 8:32:41 AM8/28/09
to china-li...@googlegroups.com
原来如此,如果你server的ip无法被client获得 如何通迅呢

--

Jacky

unread,
Aug 28, 2009, 10:28:11 AM8/28/09
to China Linux Fans
On 8月28日, 下午8时32分, 得意孤星 <kemy.c...@gmail.com> wrote:
> 原来如此,如果你server的ip无法被client获得 如何通迅呢
这就是研究TCP NAT的意义啊,现在就在研究这问题呢

xuanfei

unread,
Sep 9, 2009, 1:07:43 PM9/9/09
to china-li...@googlegroups.com
to:周老师
源码包nat-punch.zip 编译后 ,可以测通;还是居于UDP的吧...

--------------------公网------------------------
Server:
[root@centos net]# netstat -anlp|grep nat-server
udp        0      0 0.0.0.0:11147               0.0.0.0:*                               2338/nat-server    
[root@centos net]# cat log
Allocating peer "222" index 0 (behind NAT).
0.0.0.0:11148 : 218.5.2.219:11457
Allocating peer "111" index 1 (behind NAT).
0.0.0.0:11148 : 218.5.2.219:7250
Allocating peer "333" index 2 (behind NAT).
0.0.0.0:11148 : 125.77.38.202:60051

------------------------内网----------------------


Client-A:(公司 外网地址:218.5.2.219)
shell#./nat-client 111
输出信息:因主机还在公司明天补上~~


Client-B:(公司 外网地址:218.5.2.219)
shell#./nat-client 222
输出信息:因主机还在公司明天补上~~


Client-C:(家 外网地址:125.77.38.202)
xuanfei@XFH:~/code/c/nat-punch$ ./nat-client 333
My ID is "333".
Attempting to register with introducer.
RegDesc received.
Sending to peer "222" at 218.5.2.219:11457.
Sending to peer "111" at 218.5.2.219:7250.
PeerMsg from 222
Attempting to register with introducer.
RegDesc received.
Sending to peer "222" at 218.5.2.219:11457.
Sending to peer "111" at 218.5.2.219:7250.
PeerMsg from 111
PeerMsg from 222





2009/8/18 周立发 <zhou...@gmail.com>

我研究P2P穿越NAT技术也有一段时间了,相关文档其实也很多,不过全是英文的,我都放在我的docs.google.com里,如果你需要我可以共享给你。

附件是我在网上找到的一份源代码。假设你一台Server有公网IP地址,另外有一些Client在局域网内,并且可以是分布在不同的局域网里,比如你家里和公司两台局域网的电脑,都可以在nat-reg.h文件里设定Server的IP地址,然后在命令行运行Client,Client会连接Server并注册自己,然后两个Client之间就可以穿透NAT进行P2P通信了。如果你有条件可以试一下并麻烦告诉我结果,看这份源代码是否能实现基于TCP的NAT穿透。

xuanfei

unread,
Sep 9, 2009, 1:52:40 PM9/9/09
to china-li...@googlegroups.com
安装文档中顺藤摸瓜到咯http://midcom-p2p.sourceforge.net/ http://www.brynosaurus.com/pub/net/p2pnat/#sec-tcp
看上面的信息那我只能用盲人摸象来形容我的英文阅读水平咯:(;  高手翻译下:)

从上面分别下子natserver 和natcheck 修改下Server地址后测试:
http://midcom-p2p.sourceforge.net/natserver.c
http://midcom-p2p.sourceforge.net/natcheck.c


--------------------公网------------------------
Server:(ip 220.233.246.13)
 
[root@centos net]# ps xua|grep natserver
root      2559  0.0  0.0   1796   140 pts/0    S    01:29   0:00 ./natserver 1
root      2561  0.0  0.0   3912   700 pts/0    S+   01:31   0:00 grep natserver

 

------------------------内网----------------------


Client-C:(家 外网地址:125.77.38.202)
xuanfei@XFH:~/code/c/nat-punch$ ./natcheck -v
server 1: 220.233.246.13 at 220.233.246.13:9856
server 2: tears.lcs.mit.edu at 18.26.4.77:9856
server 3: sure.lcs.mit.edu at 18.26.4.29:9856
Local TCP port: 59525
Local UDP port: 43233
Request 1 of 20...
Connection to server 1 complete
Server 1 reports my UDP address as 125.77.38.202:61329
Server 1 reports my TCP address as 125.77.38.202:62867
checktcp connect: Connection refused

 
Client-A Client-B :待测试:)


Jacky

unread,
Sep 10, 2009, 8:48:19 AM9/10/09
to China Linux Fans
谢谢!前面这份代码是基于UDP的,大家都知道了。

我在写的TCP的已经在我自己的PC机上试过了,但没什么大意义,因为是一台机器自己既做server又做clientA和clientB,没有经过任
何路由器(连虚拟机都没用,因为我的机器太老了跑不起来VirtualBox或VMware),再过些天我改好了发一份大家来测试一下公网上TCP是否
可穿透。

On 9月10日, 上午1时52分, xuanfei <xuanfei2...@gmail.com> wrote:
> 安装文档中顺藤摸瓜到咯http://midcom-p2p.sourceforge.net/http://www.brynosaurus.com/pub/net/p2pnat/#sec-tcp


> 看上面的信息那我只能用盲人摸象来形容我的英文阅读水平咯:(; 高手翻译下:)
>
> 从上面分别下子natserver 和natcheck 修改下Server地址后测试:http://midcom-p2p.sourceforge.net/natserver.chttp://midcom-p2p.sourceforge.net/natcheck.c
>

> *--------------------公网------------------------*
>
>
>
> > *Server:*(ip 220.233.246.13)


> > [root@centos net]# ps xua|grep natserver
> > root 2559 0.0 0.0 1796 140 pts/0 S 01:29 0:00
> > ./natserver 1
> > root 2561 0.0 0.0 3912 700 pts/0 S+ 01:31 0:00 grep
> > natserver
>

> > *
> > ------------------------内网----------------------*
>
> > *Client-C:*(家 外网地址:125.77.38.202)

michael

unread,
Sep 10, 2009, 11:40:32 AM9/10/09
to China Linux Fans
嗯,对NAT穿越方面的技术也很感兴趣,一年前在学校时曾经看过相关文档,无奈没有时间和能力尝试去实现。现在还记得一些,好像穿越的策略还跟NAT的
配置类型有关系吧。
菜鸟愚见,多多包涵。
刚刚参加工作,更没时间,等这段时间忙过了,再找周老师要些文档看看,谢谢。

> nat-punch.zip
> 13K查看下载

Jacky

unread,
Oct 1, 2009, 11:56:45 AM10/1/09
to China Linux Fans
http://blog.pluskid.org/?p=369

发现这里有一种通过ssh穿透nat的方法。

Reply all
Reply to author
Forward
0 new messages