可能根本不存在TCP的NAT打洞操作,不知道有人搞成功过没有



------
我摘录网上流行的一篇文章,标题是《TCP实现P2P通信、TCP穿越NAT的方法、TCP打洞》,我逐一分析他的打洞描述:

原文:1、 S启动两个网络侦听,一个叫【主连接】侦听,一个叫【协助打洞】的侦听。

  2、 A和B分别与S的【主连接】保持联系。

   3、 当A需要和B建立直接的TCP连接时,首先连接S的【协助打洞】端口,并发送协助连接申请。同时在该端口号上启动侦听。注意由于要在相同的网络终端上绑定 到不同的套接字上,所以必须为这些套接字设置 SO_REUSEADDR 属性(即允许重用),否则侦听会失败。

4、 S的【协助打洞】连接收到A的申请后通过【主连接】通知B,并将A经过NAT-A转换后的公网IP地址和端口等信息告诉B。

  5、 B收到S的连接通知后首先与S的【协助打洞】端口连接,随便发送一些数据后立即断开,这样做的目的是让S能知道B经过NAT-B转换后的公网IP和端口号。

   6、 B尝试与A的经过NAT-A转换后的公网IP地址和端口进行connect,根据不同的路由器会有不同的结果,有些路由器在这个操作就能建立连接(例如我 用的TPLink R402),大多数路由器对于不请自到的SYN请求包直接丢弃而导致connect失败,但NAT-A会纪录此次连接的源地址和端口号,为接下来真正的连 接做好了准备,这就是所谓的打洞,即B向A打了一个洞,下次A就能直接连接到B刚才使用的端口号了。

  7、 客户端B打洞的同时在相同的端口上启动侦听。B在一切准备就绪以后通过与S的【主连接】回复消息“我已经准备好”,S在收到以后将B经过NAT-B转换后的公网IP和端口号告诉给A。

   8、 A收到S回复的B的公网IP和端口号等信息以后,开始连接到B公网IP和端口号,由于在步骤6中B曾经尝试连接过A的公网IP地址和端口,NAT-A纪录 了此次连接的信息,所以当A主动连接B时,NAT-B会认为是合法的SYN数据,并允许通过,从而直接的TCP连接建立起来了。

------
我只分析关键的描述:

[color=#FF00]
4.S的【协助打洞】连接收到A的申请后通过【主连接】通知B,并将A经过NAT-A转换后的公网IP地址和端口等信息告诉B。 
[/color] 

这个所谓转换后的公网IP和端口,实际上是和服务器的那个连接的端口,这个端口是否就是一个洞,它是否接受不同IP的连接呢?事实是,我试验,它根本不接受connect连接。
 
[color=#FF00]
5、 B收到S的连接通知后首先与S的【协助打洞】端口连接,随便发送一些数据后立即断开,这样做的目的是让S能知道B经过NAT-B转换后的公网IP和端口号。 
[/color] 

我不知道,他为什么要发送一些数据,事实上,只要连接就知道IP和端口来,没有必要发送数据。
 
[color=#FF00]
 7、 客户端B打洞的同时在相同的端口上启动侦听。B在一切准备就绪以后通过与S的【主连接】回复消息“我已经准备好”,S在收到以后将B经过NAT-B转换后的公网IP和端口号告诉给A。

 8、 A收到S回复的B的公网IP和端口号等信息以后,开始连接到B公网IP和端口号,由于在步骤6中B曾经尝试连接过A的公网IP地址和端口,NAT-A纪录 了此次连接的信息,所以当A主动连接B时,NAT-B会认为是合法的SYN数据,并允许通过,从而直接的TCP连接建立起来了。 
[/color] 

7所谓的NAT-B的公网IP和端口还是和S连接的端口,但是TCP每个连接都有一个新的端口,同样一个对S的洞,是否能够被别的IP使用呢?
总之,这个文章的核心操作技术双方发起连接的端口,都是连接服务器的那个连接外网端口,我试验的结果是根本行不通。

------
甚至对于比较简单的情况,一个内网对一个公网IP,公网发出对内网的连接请求都不响应。

一个内网的计算机A对服务器S发起一个连接,我们称为socketAS,连接成功,S得到A的外网IP和端口,这里注意,每个连接,这个端口是不同的。如果服务器针对这个端口发送connect,根本就连不上,即使A已经启动了针对socketAS本地端口上的监听。

如果A有发起一个连接socketAS2,但是使用不同的端口,如果服务器响应这个连接,那么和第一个情况相同,没有意义。如果服务器不响应这个连接,而是发起一个针对它的connect,能否成功呢?问题是,不响应的话,socketAS2的外网端口又无从知道。
------
没搞过TCP 打洞,MARK。。。
------
WINDOWS自带的FTP客户端程序的send命令就是让服务器反向连接


=======================================================
FreeLaxy, your backup.
=======================================================

------
认真学习天天向上!
你考试不及格,并不表示不存在能考及格的.
------
有及格的能露个面吗?
------
当然了,别光说废话
------
p2p模型中的服务器,看起来不就是一个代理服务器吗?但是这个代理只服务一件事情就是告知对方的ip和端口。
------
这个可能要涉及到路由器上的NAT连接生存周期,比如TCP,UDP老化时间。
------
这哥们像个大尾巴狼一样, 发N个帖也不结贴, 看来不让他掏点RMB, 对不起他.
------
1500 RMB, 或者200USD,帮你搞定, 保住你饭碗. 让你摆脱2P的困惑,可以达到3P,4P--- NP.

高级合理的打洞方式, 保你爽, 多次打洞, 撞洞帮上的几率为0. 价格便宜, 量又足.

需要就咪我.不要害羞.
------
我只分析关键的描述:

[color=#FF00]
4.S的【协助打洞】连接收到A的申请后通过【主连接】通知B,并将A经过NAT-A转换后的公网IP地址和端口等信息告诉B。 
[/color] 

这个所谓转换后的公网IP和端口,实际上是和服务器的那个连接的端口,这个端口是否就是一个洞,它是否接受不同IP的连接呢?事实是,我试验,它根本不接受connect连接。

Wenxy answer: 不接受连接的原因有多种:1, 对方的网关有防火墙; 2, 对方没有listen(); etc.
 
[color=#FF00]
5、 B收到S的连接通知后首先与S的【协助打洞】端口连接,随便发送一些数据后立即断开,这样做的目的是让S能知道B经过NAT-B转换后的公网IP和端口号。 
[/color] 

我不知道,他为什么要发送一些数据,事实上,只要连接就知道IP和端口来,没有必要发送数据。

Wenxy answer: 同意,有时为了维持一个tcp连接,需要定时发送保活数据。记得TCP协议里有一个保活定时器,虽然RFC只是建议TCP/IP协议栈实现它。
 
[color=#FF00]
 7、 客户端B打洞的同时在相同的端口上启动侦听。B在一切准备就绪以后通过与S的【主连接】回复消息“我已经准备好”,S在收到以后将B经过NAT-B转换后的公网IP和端口号告诉给A。

  8、 A收到S回复的B的公网IP和端口号等信息以后,开始连接到B公网IP和端口号,由于在步骤6中B曾经尝试连接过A的公网IP地址和端口,NAT-A纪录了此次连接的信息,所以当A主动连接B时,NAT-B会认为是合法的SYN数据,并允许通过,从而直接的TCP连接建立起来了。 
[/color] 

7所谓的NAT-B的公网IP和端口还是和S连接的端口,但是TCP每个连接都有一个新的端口,同样一个对S的洞,是否能够被别的IP使用呢?
总之,这个文章的核心操作技术双方发起连接的端口,都是连接服务器的那个连接外网端口,我试验的结果是根本行不通。

Wenxy answer:TCP打洞是可以的,Internet上的server就是一个中介,把处于LAN里的计算机经过NAT后的公网IP和端口告诉对方,你的试验方法对了吗?在LAN的网关设置对了吗?尝试设置好网关NAT参数,关闭信源、信宿、Gateway上的防火墙试试!失败是成功之母,:).
------
路由器上的NAT连接生存周期
------
神帖留名,另外膜拜11楼
------
就最简单的情况,一个内网,一个公网的情况,公网如何对内网发起连接,当然TCP的,有人能简单的写几个关键代码吗?

我的疑问如下:

公网调用connect函数的时候,指定的端口是如何获得的。肯定是来自上一个客户端发起的的连接,那么那个连接是断开还是保持,还是无所谓。

这时候,其实是上一次连接同时吧,客户端已经启动了发起连接的本地端口的监听,这种情况下,是否就应该连接成功了。
------
TCP打洞与UDP不同,关键是涉及端口重用
------
不错 学习
------
看可那
------
ggggggggggggggggggggggggggggggggggggggggggggggg
------
哎!!!!
------
先记着,问题大家讨论
------
不错 慢慢看
------
不错的帖子 学习

------
技术观摩中
------
learning......
------
发为积分努力发贴
------
路过。。。。。。
------
11楼强人
------
mark
学习资料
------
我靠,这么多的顶的,就是没人说关键的呀,太卑鄙了吧,我知道很多人是可以解决这个问题的。
------
我看有些代码,纠结于处理客户端用户什么的,那些都不是关键的,就是如和让外网主动连上内网,问题就解决了。
------
学习一下
------
好贴 顶呀
------
不错的帖子 学习

------
只听过UDP的。学习一下。
------
每天回帖即可获得10分可用分!
------
1分!!!
------
这就是那篇文章代码运行的结果,看来不是我没有理解,而是他确实不适合我的网络,不过我就是普通路由器局域网环境,应该是有代表性的,而且迅雷早我的环境里确实可以建立TCP的客户对客户的连接。


------
学习中。

------
学习了,谢谢!
------
学习个屁呀,我这篇帖子就是告诉你们,网上流行的这些文章代码,都是垃圾,根本不行。
------
太不幸了. 怎么能这样?
------
要发定时发“握手”包,保持当前链路。然后一切就OK了
------
学习一下
------
不错:学习了................
------
看看。
------
楼上打广告, 死老妈.
------
mark~~
------
来个。。。。
------
那篇文章所说的TCP打洞前提是peers双方的一方是外网IP或者开启UPnP的情况下可以穿透成功!!
------
引用 11 楼 brent1901 的回复:
1500 RMB, 或者200USD,帮你搞定, 保住你饭碗. 让你摆脱2P的困惑,可以达到3P,4P--- NP.

高级合理的打洞方式, 保你爽, 多次打洞, 撞洞帮上的几率为0. 价格便宜, 量又足.

需要就咪我.不要害羞.

------
长见识了
------
迅雷是开UPNP
------
好好学习 ,天天向上
------
先研究下网络环境吧,很多时候网上流行的一些代码是受限于特定的网络环境的。
当然也不排除一些自己都没有测试通过的代码拿出来祸国殃民的,坚决打击。。。
------
hahahhahahahahaah
------
学习一下
------
moderator is so kind
------
不错。。。。。。。。。。。。。。。。。。。。。
------
什么 东西。。。。。。。。
------
这是怎么回事啊?
------
我想 应该可以实现 现在我们用的QQ中文件传输的原理应该就是TCP打洞。分别在两个不同的局域网的QQ是可以实现文件传输的,文件传输就是用得tcp协议。他们是怎么实现连接的,我感觉应该是用tcp打洞。
------
纯属路过,没看懂打洞是什么意思
------
不错学习了
------
呵呵,暂时看不懂大家讨论的东西,正在自学中啊!!
  有机会在讨论吧
------
学习了
------
asdsasasa
------
没试过,不过应该是可以的,google TCP实现P2P通信、TCP穿越NAT的方法、TCP打洞
------
学习一下
------
see a see
------
好高深啊。
------
跟具体网络环境有关。

现在的路由很多都有维护tcp连接的状态,故tcp穿透几率不高。

udp本身信息很少,还是udp穿透更符合实际。
------
mark mark
------
好高深啊。
------
不懂,zhen debu dong
------
太牛了,看不懂啊~~~
------
不知道可不可这样理解
引用
主机A 和主机B分别有端口 1,2 为主连接与辅连接

A.1 与 B.1 主连接正常后,
A.2 去连接 B.1 -- 在 A.NAT 上开了个洞 A.NAT.2
A 在 A.2 上开启侦听
B 使用 B.2 连接 A.NAT.2 -- 便会在 B.NAT 上开个洞 B.NAT.2

这样 B.NAT.2 对应 B.2, A.NAT.2 对应 A.2



------
看起来还得多学学呀
------
监听在内网应该打洞吧。(或别的方式公开端口)
监听如果是在外网估计不需要打洞了吧。

不太熟悉。我将持续关注。
------
不错 慢慢看
------
不错 慢慢看
------

------
行云流水,估计不会有人解决!
------
不懂,我是来看头像的-_-!!! ps: 每天回帖即可获得10分可用分!
------
发帖出错,害我发了两次,靠
------
不懂,mark
------
引用 88 楼 scenmiao 的回复:

另外提醒大家:以后在中国去麦当劳,肯德基一定记得要发票!!!
麦当劳、肯德基每年在中国,因为我们不习惯要发票的原因,而掠走将近2亿的税收。 请把这条信息完好(不加任何修改复制)发至其它群体。 是中国人的就转发一下。累不了!

------
没搞过TCP 打洞,MARK
------
楼猪拿无知当个性,大家还这么热情高涨,真不知道时代变成啥样了
------
楼主不防把你不成功的代码贴出来让我看看,帮你看看毛病出在哪里。。。
------
最近也在纠缠这个问题,关注
查了很多资料,都失败了

桂ICP备07017180号