《c# 实现p2p文件分享与传输系统》 二、 设计 - 续(NAT穿透)

本文涉及的产品
公网NAT网关,每月750个小时 15CU
简介: c#实现P2P文件分享与传输系统 二、设计 - 续(NAT穿透)  首先要抱歉,因为这些日子较忙,没有写文章,这个系列拖了很久,现在开始继续。     上一篇文章介绍了p2p系统Tracker Server和Peer,以及文件描述符,本篇接着讲NAT Server的部分。

c#实现P2P文件分享与传输系统 

二、设计 - 续(NAT穿透)

  首先要抱歉,因为这些日子较忙,没有写文章,这个系列拖了很久,现在开始继续。 

    上一篇文章介绍了p2p系统Tracker Server和Peer,以及文件描述符,本篇接着讲NAT Server的部分。由于p2p网络中使用udp报文,所以只介绍udp穿透。

1. NAT类型

  NAT(Network Address Translation网络地址转换),是指在IP包通过路由设备时,修改其IP地址信息的技术。一般应用是,通过将内网地址转换为公网地址,从而实现多台主机使用一个IP地址访问互联网,在很多网络环境中,均可见到。这项技术的好处我们暂且不谈,对我们来说它的“坏处”是显而易见的,因为中间存在了NAT,给我们的p2p网络中主机之间的通信造成了不小的麻烦。下面开始先简单了解一下NAT的类型。(这里只做简单介绍,针对“一对多”的NAT映射。更加详细、严谨的说明,请看Wikipedia和相关文档 - RFC xxxx。)

  一般来说,可以把它分为“对称型NAT”和“非对称型NAT(也叫锥形NAT)”。所谓“对称”,是指内部地址与不同的外部地址进行通信的时候,NAT为会话绑定不同的IP和端口。

  对于NAT可分为“不限型”、“IP受限型”和“IP-端口受限型”:

  • 不限:内网主机Peer通过NAT访问外网Peer1:port1建立了会话,NAT为其分配了ip:port地址,则任何外网主机均可通过ip:port访问内网主机Peer
  • IP受限:内网主机Peer通过NAT与外网Peer1:port1建立了会话,NAT为其分配了ip:port地址,则只有Peer1可以通过ip:port访问内网主机Peer
  • IP-Port受限:内网主机Peer通过NAT与外网Peer1:port1建立了会话,NAT为其分配了ip:port地址,则只有Peer1,且从port1发出的会话,可以通过ip:port访问内网主机Peer

     

  正确的判断NAT类型,在p2p网络中的NAT穿透中,是很重要的。NAT类型的判断,是由Stun Server来实现,据我所知,有现成的,也有开源项目,这里将不做介绍~

2. NAT 打洞

  通过以上NAT的特点可知,为了能访问位于受限NAT后面的内网主机Peer,必须让该内网主机先主动向自己发送会话。但是,如何通知内网主机来做这件事呢?这就需要借助NAT Server来实现。NAT Server需要保持可以随时向Peer发送命令的能力,首先就是NAT Server必须位于公网(-_-!),Peer定时向NAT Server发送心跳包。由之前的分析可知,NAT Server可以无障碍的向Peer发送各种指令。如果你对发送心跳包的间隔拿捏不定,不妨设置为10秒

  下面是NAT Server的基本流程

       

  1) 外网主机向NAT Server发送打洞请求

  2) NAT Server向Peer发送打洞命令

  3) Peer向外网主机发送连接报文

  4) NAT为外网主机打开了访问内网Peer的权限,打洞完成。

3. 其他

  根据以上的打洞技术,可以在多种NAT情况下实现穿透,但对于部分情况,例如,两个客户端都处于受限型NAT后面,而其中又至少有一个处于对称型NAT后面,这种技术就无能为力了,此时可以采用“地址-端口预测”的方法(据说迅雷使用了这项技术,据说而已),所谓“端口预测”,是猜测NAT给内网主机分配地址和端口的算法,比如这篇文章的第一幅图里,ip1:port1和ip2:port2,ip1和ip2,port1和port2很可能在数值上相差不远,比如可能是61.22.3.1:13304, 61.22.3.1:13305,这时,通过多发几个端口,就有可能实现打通。实在不行,就只能通过服务器中转了。下面罗列一下在各种NAT情况之下,实现Peer和Peer1之间互联的方法:

  我们把情况假设在p2p网络中,Peer1向Peer索取数据

  

文章版权所有,如需转载,请注明作者和出处,谢谢~

目录
相关文章
|
9月前
|
算法 C#
《c# 实现p2p文件分享与传输系统》 二、 设计 - 续(NAT穿透)
《c# 实现p2p文件分享与传输系统》 二、 设计 - 续(NAT穿透)
85 0
|
9月前
|
算法 C#
《c# 实现p2p文件分享与传输系统》 二、 设计
《c# 实现p2p文件分享与传输系统》 二、 设计
77 0
|
9月前
|
C# C++ 网络架构
《c# 实现p2p文件分享与传输系统》 一、 模型
《c# 实现p2p文件分享与传输系统》 一、 模型
196 0
|
安全 Java 关系型数据库
域渗透之外网打点到三层内网(二)
域渗透之外网打点到三层内网
158 0
域渗透之外网打点到三层内网(二)
|
数据格式 UED 网络架构
一对一直播系统源码,影响数据传输的网络七层结构
一对一直播系统源码,影响数据传输的网络七层结构
局域网电话系统的优点
许多网络技术权威都认为用局域网电话系统去替代传统的PBX电话系统不仅能节省费用,而且能支持更多的新应用。另外,局域网电话系统所使用的分组交换技术在建网、管理和配置等方面都比PBX系统所使用的电路交换技术具有更大的优越性。这使得公司的网络管理者在计划建造或扩建公司的电话系统时,应该考虑一下是否应该把公司的电话系统建成为局域网电话系统。下面分别介绍一下使用局域网电话系统的几点主要优势。
|
网络协议 算法 数据库
运营商动态路由的神器 :IS-IS 协议
IS-IS 是一种高度可扩展的路由协议,广泛用于大型服务提供商网络骨干网,不是我们用不到,而是我们接触不到,本文瑞哥大篇幅讲解了IS-IS的基本理论、配置还有和OSPF的比较,希望文章对您有帮助!
294 0
运营商动态路由的神器 :IS-IS 协议
|
机器学习/深度学习 网络协议 网络架构
局域网设备与公网服务之间如何交互数据?
局域网设备与公网服务之间如何交互数据?
164 0
局域网设备与公网服务之间如何交互数据?
|
网络协议 网络架构 索引
P2P之UDP穿透NAT的原理与实现 - 增强篇
为了方便操作,推荐你使用一个远程登陆软件,可以直接在一台机器上操作所有的相关的计算机,这样很方便,一个人就可以完成所有的工作了。呵呵,本人就是这么完成的。欢迎有兴趣和经验的朋友来信批评指正,共同进步。
3146 0