《c# 实现p2p文件分享与传输系统》 二、 设计 - 续(NAT穿透)
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索取数据

文章版权所有,如需转载,请注明作者和出处,谢谢~
《c# 实现p2p文件分享与传输系统》 二、 设计 - 续(NAT穿透)的更多相关文章
- 《c# 实现p2p文件分享与传输系统》 二、 设计
c#实现P2P文件分享与传输系统 二.设计 在上一篇文章中,介绍了P2P网络的常用模型,并确定了EasyP2P系统的框架,本文将就此设计完成它的主要结构和运作流程. 1. 首先是Tracker Ser ...
- 《c# 实现p2p文件分享与传输系统》 一、 模型
c#实现P2P文件分享与传输系统 一.模型 P2P的概念大家都不陌生,也就是所谓的“点对点传输”,即不直接通过服务器,在两台或多台客户端之间传输数据,实现信息交流和资源共享.P2P技术已经发展了很多年 ...
- llinux 目录结构 及Linux文件分享
llinux 基础命令 及个人Linux文件分享 一, root用户名 @ 分隔符 kingle 主机名 ~当前所在目录 # root权限 $ 没分配权限用户 二, 书写格式:空格 [命令参数] 空格 ...
- AngularJs的UI组件ui-Bootstrap分享(十二)——Rating
Rating是一个用于打分或排名的控件.看一个最简单的例子: <!DOCTYPE html> <html ng-app="ui.bootstrap.demo" x ...
- NAT穿透进行P2P文件传输
实现一个简单的p2p文件传输,主要解决NAT穿透问题,使用tcp协议传输. NAT背景介绍 简介 NAT(Network Address Translation ,网络地址转换) 是一种广泛应用的解决 ...
- 树莓派实践部分——P2P文件下载机torrent之Raspberry Pi管理
树莓派实践--P2P文件下载机torrent之Raspberry Pi管理 一.树莓派配置文件共享软件deluge 在进行实践之前,先通过命令sudo apt-get update 和sudo apt ...
- [转]文件IO详解(二)---文件描述符(fd)和inode号的关系
原文:https://www.cnblogs.com/frank-yxs/p/5925563.html 文件IO详解(二)---文件描述符(fd)和inode号的关系 ---------------- ...
- android文件分享在android7.0以上版本报错的解决方案
最近在使用蓝牙进行文件分享时,出现了一个奇怪的问题.同样的代码在android5.1上可以顺利运行,但是在android7.0上就运行失败.出现如下的错误: Caused by: android.os ...
- 海量无损高音质音乐文件分享180TB(持续更新)
海量无损高音质音乐文件分享180TBWAV,flac,ape格式(持续更新),由于本人是音乐发烧爱好者,收集海量的无损音乐,已经分类好了,比较方便查找,但是本地没法存储,所有放在网盘中,并且我这边还会 ...
随机推荐
- 数据结构(Java语言)——Stack简单实现
栈是限制插入和删除仅仅能在一个位置上进行的表.该位置是表的末端,叫做栈的顶top.对栈的基本操作有进栈push和出栈pop,前者相当于插入.后者这是删除最后插入的元素. 栈有时又叫先进先出FIFO表. ...
- Qt中的对象类型转换
char * 与 const char *的转换 char *ch1="hello11"; const char *ch2="hello22"; ch2 = c ...
- Spring Cloud Zuul API服务网关之请求路由
目录 一.Zuul 介绍 二.构建Spring Cloud Zuul网关 构建网关 请求路由 请求过滤 三.路由详解 一.Zuul 介绍 通过前几篇文章的介绍,我们了解了Spring Cloud ...
- 字符串转化成十六进制输出StrToHex(Delphi版、C#版)
//注意:Delphi2010以下版本默认的字符编码是ANSI,VS2010的默认编码是UTF-8,delphi版字符串事先须经过AnsiToUtf8()转码才能跟C#版得到的十六进制字符串显示结果一 ...
- smokeping安装
一.准备工作: 1.以防止安装依赖出错,首先给系统安装第三方源:rpm -Uvh http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/RPMS/rpmforg ...
- 多媒体开发之---h264 高度和宽度获取
( School of Computer Science & Technology, Soochow University,SuZhou 215006:) Abstract: H.264 is ...
- 【BZOJ4408】[Fjoi 2016]神秘数 主席树神题
[BZOJ4408][Fjoi 2016]神秘数 Description 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13},1 = 12 = 1 ...
- MongoDB在win7上的安装(精简版)
1.下载mongdb的zip文件,解压后会发现有bin文件夹,在同层目录下建一个data目录, 2.在data目录下建一个log和db文件夹, 3.在log文件下建一个MongoDB.log 文件 4 ...
- idea创建普通java项目以及maven创建项目过程(转)
1. idea创建一个普通项目流程 http://blog.csdn.net/testcs_dn/article/details/52303941 2. idea创建maven项目流程 http:// ...
- CSS浏览器兼容性问题解决方法总结
CSS浏览器兼容解决总结如下: 1. CSS中几种浏览器对不同关键字的支持,可进行浏览器兼容性重复定义 !important 可被FireFox和IE7识别 * 可被IE6.IE7识别 _ 可被IE6 ...