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穿透)的更多相关文章

  1. 《c# 实现p2p文件分享与传输系统》 二、 设计

    c#实现P2P文件分享与传输系统 二.设计 在上一篇文章中,介绍了P2P网络的常用模型,并确定了EasyP2P系统的框架,本文将就此设计完成它的主要结构和运作流程. 1. 首先是Tracker Ser ...

  2. 《c# 实现p2p文件分享与传输系统》 一、 模型

    c#实现P2P文件分享与传输系统 一.模型 P2P的概念大家都不陌生,也就是所谓的“点对点传输”,即不直接通过服务器,在两台或多台客户端之间传输数据,实现信息交流和资源共享.P2P技术已经发展了很多年 ...

  3. llinux 目录结构 及Linux文件分享

    llinux 基础命令 及个人Linux文件分享 一, root用户名 @ 分隔符 kingle 主机名 ~当前所在目录 # root权限 $ 没分配权限用户 二, 书写格式:空格 [命令参数] 空格 ...

  4. AngularJs的UI组件ui-Bootstrap分享(十二)——Rating

    Rating是一个用于打分或排名的控件.看一个最简单的例子: <!DOCTYPE html> <html ng-app="ui.bootstrap.demo" x ...

  5. NAT穿透进行P2P文件传输

    实现一个简单的p2p文件传输,主要解决NAT穿透问题,使用tcp协议传输. NAT背景介绍 简介 NAT(Network Address Translation ,网络地址转换) 是一种广泛应用的解决 ...

  6. 树莓派实践部分——P2P文件下载机torrent之Raspberry Pi管理

    树莓派实践--P2P文件下载机torrent之Raspberry Pi管理 一.树莓派配置文件共享软件deluge 在进行实践之前,先通过命令sudo apt-get update 和sudo apt ...

  7. [转]文件IO详解(二)---文件描述符(fd)和inode号的关系

    原文:https://www.cnblogs.com/frank-yxs/p/5925563.html 文件IO详解(二)---文件描述符(fd)和inode号的关系 ---------------- ...

  8. android文件分享在android7.0以上版本报错的解决方案

    最近在使用蓝牙进行文件分享时,出现了一个奇怪的问题.同样的代码在android5.1上可以顺利运行,但是在android7.0上就运行失败.出现如下的错误: Caused by: android.os ...

  9. 海量无损高音质音乐文件分享180TB(持续更新)

    海量无损高音质音乐文件分享180TBWAV,flac,ape格式(持续更新),由于本人是音乐发烧爱好者,收集海量的无损音乐,已经分类好了,比较方便查找,但是本地没法存储,所有放在网盘中,并且我这边还会 ...

随机推荐

  1. php的特殊功能-----不是和其他语言比较

    1.header(); 他不只是重定向,和更改字符集 而是发送表头,如 header('HTTP/1.1 404 Not Found   gfdgd'); 可以发送信息给浏览器,让浏览器显示404错误 ...

  2. Zabbix-20160817-高危SQL注入漏洞

    漏洞概述: zabbix是一个开源的企业级性能监控解决方案.近日,zabbix的jsrpc的profileIdx2参数存在insert方式的SQL注入漏洞,攻击者无需授权登陆即可登陆zabbix管理系 ...

  3. hibernate出现 org.hibernate.PropertyNotFoundException: field [departmen] not found on cn.itcast.hibernate.domain.Employee1错误

    hibernate出现 org.hibernate.PropertyNotFoundException: field [departmen] not found on cn.itcast.hibern ...

  4. 安卓ADT离线安装

    http://jingyan.baidu.com/article/3aed632e66858770108091bf.html

  5. 03 redis之string类型命令解析

    Redis字符串类型的操作 set key value [ex 秒数] / [px 毫秒数] [nx] /[xx] 如: set a 1 ex 10 , 10秒有效 Set a 1 px 9000 , ...

  6. MySQL CREATE TRIGGER (1)

    CREATE TRIGGER语法 CREATE TRIGGER trigger_name trigger_time trigger_event    ON tbl_name FOR EACH ROW ...

  7. String知识点

  8. CMMI过程改进反例

     近期一直在看CMMI的资料,越看认为越有意思.今天看到过程改进的时候,突然想起来之前所在的公司发生的过程改进相关的事儿来. 公司通过CMMI3级认证之后.PMO部门经理(公司还有质量管理部门经理 ...

  9. java基础之容器、集合、集合常用方法

    一.容器(Collection):数组是一种容器,集合也是一种容器 java编程中,装其他各种各样的对象(引用类型)的一种东西,叫容器 注意: 1.数组的长度是固定的 2.集合:长度不固定, 可以随时 ...

  10. 【docker】kubernetes集群一键部署包

    背景说明: 随着docker使用的逐步深入,docker的管理变得越来越麻烦,单纯的通过docker命令行的方式进行管理已经不能满足需求,同时也存在效率低下的问题.所以急需一个docker集群管理工具 ...