流媒体网欢迎您!
全世界的网络联合起来,流媒体世界一定能实现!
 
   
IPTV | P2P流媒体 | 移动流媒体 | 数字家庭 | 流媒体宽频 | 网络流媒体 | 安防监控 | 视频会议 | VIP会员 | 行业专题 | 业内专访
 
 
 
您现在的位置: 流媒体网 >> P2P >> 程序源码 >> P2P正文
 
P2P之UDP穿透NAT的原理与实现(附源代码)
作者:shooting…  来源:p2pcn  发布时间:2006-4-25 11:11:00

                    |
 NAT A (外网IP:202.187.45.3)                 NAT B (外网IP:187.34.1.56)
   |   (内网IP:192.168.0.1)                      | (内网IP:192.168.0.1)
   |                                             |
Client A  (192.168.0.20:4000)             Client B (192.168.0.10:40000)


  首先,Client A登录服务器,NAT A为这次的Session分配了一个端口60000,那么Server S收到的Client A的地址是202.187.45.3:60000,这就是Client A的外网地址了。同样,Client B登录Server S,NAT B给此次Session分配的端口是40000,那么Server S收到的B的地址是187.34.1.56:40000。

  此时,Client A与Client B都可以与Server S通信了。如果Client A此时想直接发送信息给Client B,那么他可以从Server S那儿获得B的公网地址187.34.1.56:40000,是不是Client A向这个地址发送信息Client B就能收到了呢?答案是不行,因为如果这样发送信息,NAT B会将这个信息丢弃(因为这样的信息是不请自来的,为了安全,大多数NAT都会执行丢弃动作)。现在我们需要的是在NAT B上打一个方向为202.187.45.3(即Client A的外网地址)的洞,那么Client A发送到187.34.1.56:40000的信息,Client B就能收到了。这个打洞命令由谁来发呢,呵呵,当然是Server S。

  总结一下这个过程:如果Client A想向Client B发送信息,那么Client A发送命令给Server S,请求Server S命令Client B向Client A方向打洞。呵呵,是不是很绕口,不过没关系,想一想就很清楚了,何况还有源代码呢(侯老师说过:在源代码面前没有秘密 8)),然后Client A就可以通过Client B的外网地址与Client B通信了。
   
  注意:以上过程只适合于Cone NAT的情况,如果是Symmetric NAT,那么当Client B向Client A打洞的端口已经重新分配了,Client B将无法知道这个端口(如果Symmetric NAT的端口是顺序分配的,那么我们或许可以猜测这个端口号,可是由于可能导致失败的因素太多,我们不推荐这种猜测端口的方法)。
   
  下面是一个模拟P2P聊天的过程的源代码,过程很简单,P2PServer运行在一个拥有公网IP的计算机上,P2PClient运行在两个不同的NAT后(注意,如果两个客户端运行在一个NAT后,本程序很可能不能运行正常,这取决于你的NAT是否支持loopback tran

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  ... 下一页  >> 

    
责任编辑:playcat911

发表评论】【告诉好友】【打印此文】【关闭窗口收藏此页到365Key   

  • 上一篇P2P:
  • 下一篇P2P: 没有了
  •  
    相关新闻
    试论当前P2P发展现状与运营方案
    P4P异军突起,P2P即将过时?
    网络电视正在改变中外互联网格局
    P2P应用调查:Gnutella用户最多 BT其次
    LimeWire仍为最流行P2P软件  µTorrent紧追