P2P之UDP穿透NAT源码分析

P2P 之UDP 穿透NAT 源码分析

说明:

     有关这方面的介绍很多,请参考P2P 之 UDP 穿透NAT 的原理与实现的讲解。主要技术就是NAT ,网络地址转换。

要强调的一点是,当内网客户端要连接公网服务器时,会在NAT 上建一个Session, 并且分配一个端口( 十分重要) ,并且记录相应的公网IP 地址和端口。这个时候,从该公网服务器发送的数据到该端口的数据,将会被转发到该内网客户端,其它IP 发送到该端口的数据,将被抛弃。

如果客户端的套接字同时向两个不同的公网服务器连接。NAT 的处理是不同的, Symmetric NAT 是会再建一个 Session 并且分配一个新端口号,而 Cone NAT 会再建一个 Session ,但仍然使用原来的端口号。

穿透原理:

返回到前面讲的内容。我们要收到外网的数据,必须要发送一个数据包,会在NAT 上建一个Session, 并且分配一个端口( 十分重要) ,并且记录相应的公网IP 地址和端口。就可以收到该公网发送过来的信息。

所以问题就变为:内网客户端A 发送一个数据包连到NATB 的公网地址。然后就可以接收到NATB 公网地址发送过来的数据(其实是由内网用户外发,它只是转发)。但是现在问题来了: A 客户端通过公网服务器得到了NATB 的外网IP 及端口,于是就发数据过去,满怀信心的等待连接,没想到数据到了NATB 这里,NATB 说:“我内网的用户又没有连接你,那有不请自己来,我不认识你。”于是就把数据抛弃了。B 客户端也同样这样。A 和B 都想把公网NAT 信息告诉对方,只要有一方收到消息就可以通信,问题是双方没有连接,怎么能通知该消息呢?所以这个问题就需要由公网服务器来处理。

当A 想和B 通信的时候, 需要向公网服务器发送消息,由公网服务器把消息发送给B ,B 再向A 发送连接请求( 打洞) 。然后B 就可以接受A 的消息了。B 想和A 通信的时候,也是同样的道理。

这样A 即能和公网服务器通信,又可以和B 客户端通信了。

 

注意:因为NAT 设备会收回一些不活动的Session ,因此,双方必须经常互发心跳数据包,让Session 一直存活着。

 

服务器端源码简单分析:

服务器启动后,启动消息线程。接受数据,然后,根据消息头(登录,下线,打洞,得到用户列表,发送文件等)。

登录流程:

就创建一个用户结构,并把用户的姓名,IP ,端口号加入到用户列表中(这里用户的IP ,实际是NAT 的公网IP )。

      下线流程:

          直接从用户列表中删除该用户信息。

        用户列表:

          定时发送用户列表给用户,或者用户主动请求用户列表。

       打洞:

          A 客户端请求连接B 客户端的,把B 客户端的IP ,端口号(NAT 外网地址)发送给B ,B 收到之后发送一个数据到A 的NAT 外网地址。

客户端源码简单分析:

  登录流程: 把用户信息,发送给公网服务器。

  退出流程: 发送相应消息,给公网服务器。

  用户列表: 发送相应消息,从公网服务器得到用户列表信息。

  连接其它客户:

* 流程:直接向某个用户的外网IP 发送消息,如果此前没有联系过

  *      那么此消息将无法发送,发送端等待超时。

  *      超时后,发送端将发送一个请求信息到服务端,

  *      要求服务端发送给客户C 一个请求,请求C 给本机发送打洞消息

  *      以上流程将重复MAXRETRY 次

 

  一个线程接受数据:

     接受消息:其它用户发来的消息

     接受公网服务器发来的打洞消息。

     接受用户列表消息。

     接收公网服务器发来的心跳数据。

    

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值