《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索取数据

  

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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
6月前
|
监控 网络架构 负载均衡
|
6月前
【网络奇缘系列】计算机网络|数据通信方式|数据传输方式
【网络奇缘系列】计算机网络|数据通信方式|数据传输方式
92 0
|
算法 C#
《c# 实现p2p文件分享与传输系统》 二、 设计 - 续(NAT穿透)
《c# 实现p2p文件分享与传输系统》 二、 设计 - 续(NAT穿透)
123 0
|
算法 C#
《c# 实现p2p文件分享与传输系统》 二、 设计
《c# 实现p2p文件分享与传输系统》 二、 设计
107 0
|
C# C++ 网络架构
《c# 实现p2p文件分享与传输系统》 一、 模型
《c# 实现p2p文件分享与传输系统》 一、 模型
266 0
|
网络协议 网络架构 索引
P2P之UDP穿透NAT的原理与实现 - 增强篇
为了方便操作,推荐你使用一个远程登陆软件,可以直接在一台机器上操作所有的相关的计算机,这样很方便,一个人就可以完成所有的工作了。呵呵,本人就是这么完成的。欢迎有兴趣和经验的朋友来信批评指正,共同进步。
3183 0
|
数据格式 UED 网络架构
一对一直播系统源码,影响数据传输的网络七层结构
一对一直播系统源码,影响数据传输的网络七层结构
|
网络协议 安全 Shell
内网多级代理服务端工具 Stowaway
towaway是一个利用go语言编写、专为渗透测试工作者制作的多级代理工具 用户可使用此程序将外部流量通过多个节点代理至内网,突破内网访问限制,构造树状节点网络,并轻松实现管理功能 PS:谢谢大家的star,同时欢迎大家使用后提出问题&&Bug 😘。
1060 0