决定像罗胖一样,坚持转发他的60“语音, 看我能不能一样坚持下来!

p2p穿通TCP协议

技术笔记 eagle 6074℃ 0评论

好了下面我们讨论TCP协议的P2P技术,TCP协议的通讯不存在UDP协议的两个问题,当然也有它的缺点,就是对网络的开销比较大。

虽然TCP协议的P2P技术在网络上的资料不太多,但其实TCP协议的内网打洞和UDP也差不多,只是有少许不同,这里我简单做下介绍。(TCP协议的内网打洞我现在还是写不出来,只是有一个问题没有解决,就是端口重用问题,希望大牛可以给我指点一下

和上面的图一样,我们要实现主机1和主机2直接的TCP协议的P2P通讯。下面的步骤资料来自于网络(略有删改)

主机1和主机2 进行通讯的步骤
1.服务器启动两个网络侦听,一个叫【主连接】侦听,一个叫【协助打洞】的侦听。 
           2. 主机1和主机2 分别与服务器的【主连接】保持联系。
3.当主机1需要和主机2 建立P2P的TCP 连接时,首先连接服务器的【协助打洞】端口(此时NAT1已经自动打了一个“洞”),并发送协助连接申请。同时在本机连接到服务器【协助打洞】端口的端口号上启动侦听。注意由于要在相同的网络终端 上绑定到不同的套接字上,所以必须为这些套接字设置 SO_REUSEADDR 属性(即 允许重用),否则侦听会失败。
4. 服务器的【协助打洞】连接收到主机1 的申请后通过【主连接】通知主机2,并将主机1 经过 NAT1 转换后的公网 IP 地址和端口等信息告诉主机2。
5.主机2收到服务器 的连接通知后首先与服务器的【协助打洞】端口连接(此时NAT2已经自动打了一个“洞”),随便发送一些数 据后立即断开,这样做的目的是让服务器能知道主机2 经过 NAT2 转换后的公网 IP 和端 口号。
6.主机2尝试与主机1的经过 NAT1转换后的公网 IP 地址和端口进行 connect,根据不 同的路由器会有不同的结果,有些路由器在这个操作就能建立连接,大多数路由器对于不请自到的 SYN 请求包直接丢弃而导致 connect 失败,但 NAT1会纪录此次连接的源地址和端口号,为接下来真正的连接做好了准备,下次主机1 就能直接连接到主机2刚才使用的端口号了。
7.主机2打洞的同时在相同的端口上启动侦听。主机2 在一切准备就绪以后通过 与服务器的【主连接】回复消息“我已经准备好”,服务器在收到以后将主机2 经过 NAT2 转 换后的公网 IP 和端口号告诉给主机1
8. 主机1 收到 服务器回复的主机2 的公网 IP 和端口号等信息以后,开始连接到 主机2 公网 IP 和 端口号,由于在步骤 6 中 主机2 曾经尝试连接过 A 的公网 IP 地址和端口,NAT1 纪录 了此次连接的信息,所以当 主机1 主动连接 主机2 时,NAT2 会认为是合法的 SYN 数 据,并允许通过,从而直接的 TCP 连接建立起来了。

有的人会问,为什么主机1和主机2不用发送数据到服务器上来维持NAT1和NAT2的“洞”呢? 这就是TCP“打洞”与UDP“打洞”的不同了,TCP打洞的“洞”是没有生命周期的,等到连接断开,TCP的“洞”就会自动关闭。

        注意以上的TCP穿透步骤没有经过我的测试,所以不知道其可行性,请大家自行测试(网络中对于TCP内网穿透技术也存在各种质疑,所以其可行性尚还不知道),但个人觉得原理应该没错的

另外说下基于P2P技术的升级P4P技术,百度百科:http://baike.baidu.com/view/595104.htm,能看明白P2P技术的,看这个应该也不成问题(P4P技术主要用于传输与共享文件)

                                                BY:zcnhonker
                                                于bbs.cnhonker.com

转载请注明:艾依小站 » p2p穿通TCP协议

喜欢 (0)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址