P2P技术简介
P2P技术简介
NAT( Network Address Translation)穿越(俗称打洞)技术
前言:
p2p已经存在于我们生活的方方面面;我们通过下载在工具(比如迅雷,bitorent,各种网盘)下载,观看live视频(ppstream,pplive)都在使用p2p,有些im也是通过p2p来传递消息的;我们知道使用p2p技术的下载工具下载更快,使用p2p的live视频更流畅,而且同时使用的人越多效果越好,因为他是可能从我们“邻居”那里获取数据。
那么p2p到底是个什么样的东西呢。暂且我么可以这样理解为:他是通过NAT穿越来建立的一种网络链接,实现了私有网络对私有网络(peer to peer)的互通。既然p2p链接是通过NAT穿越来建立,那么NAT穿越又是怎么回事呢?且看下文分解。
一、NAT 简介
- 为了解决ipv4地址的紧缺(约为43亿)问题而出现了NAT
- NAT将网络划分为内部网络和外部网络
- 内部网络使用私有ip地址
- 私有地址段包括以下三个:
- 10.0.0.0-10.255.255.255; 172.16.0.0-172.31.255.255;192.168.0.0-192.168.255.255
- 私有地址段,仅能在内部使用,不能作为全球路由地址
- 内网所有主机共用一个外网地址
- 内网中的主机通过将地址转换为外网地址才可以访问外网
二、NAT的特点
- 网络被分为私网和公网两个部分,NAT网关设置在私网到公网的路由出口位置,双向流量必须都要经过NAT网关;
- 网络访问只能先由私网侧发起,公网侧无法主动访问私网主机
- NAT网关在两个访问方向上完成两次地址的转换或翻译,出方向做源地址替换,入方向做目的地址替换;
- NAT网关的存在对通信双方是保持透明的;
- NAT网关为了实现双向翻译的功能,需要维护一张关联表,把会话的信息保存下来。
在这里第二条是重点,正是因为NAT规定了“网络访问只能先由私网侧发起,公网侧无法主动访问私网主机”,才引出了我们的主题:NAT穿越,我们就是要通过NAT穿越来实现“公网侧主动访问私网主机”。
三、地址转换表的建立与删除
- NAT中内外网地址转换表的形式如下:
(内网)ip:port <----->(外网)ipw:portw
…… <-----> ……
- 建立:内网的ip:port首次访问外网时,建立映射关系
Udp:使用sendto发出第一个包时,建立映射关系
Tcp:发生在connect过程中(三次握手的第一个包(syn)发出时)
- 删除:
Udp链接长时间静默时,删除映射关系
Tcp链接还会通过监测其关闭事件(FIN)来删除映射关系
四、NAT的类型
锥型:
地址转换关系的建立条件:首次访问外网的时候
锥型NAT按照地址转换关系可被使用的条件可细分三种:
完全锥型(full cone)
地址转换关系,可以被任意外网地址(ip:port)使用
受限锥型(restrict cone)
地址转换关系,只可以被特定外网ip使用,(之前向此ip发送数据)
端口受限锥型(port restrict cone)
地址转换关系,只可以被特定外网ip:port使用,(之前向此ip:port发送数据)
对称型:
地址转换关系的建立条件:首次访问外网的时候, 或者再次访问不同的外网地址(ip:port)时
下面,通过一张图来再次分析一下各种NAT类型

在这张图中左侧是内网 右侧是外网,中间一个NAT,NAT中有一个地址转换表,地址转换表的左侧是内网地址,右侧是对应的外网地址
完全锥形的地址转换关系,可以被任何的外网地址W(x,y)使用,这里W(x,y)只要知道W(u,v),只有就可以通过这个地址内网的L(a,b)发送数据
受限锥形的地址转换关系,增加了一个可以被使用的条件,就是特的ip,在这里只有ip为1,还有ip为2的外网地址使用,可以通过W(u,v)向内网L(a,b)发送数据
端口受限锥形的地址转换关系,可以被使用的条件更加严格,就是特定的ip:port,在这里只有ip和port都满足这个条件的外网W(1:1),W(2:2)才可以通过W(u:v)向内网L(a,b)发送数据
对称型的地址转换关系更加严格,它的地址转换关系和目的外网地址一一对应,为访问W(1:1)建立的转换关系,只可以用来与外网W(1:1)通信,为访问W(2:2)建立的地址转换关系,只用来与外网W(2:2)通信,这就是为什么对称型NAT不能穿越的原因
五、如何穿越各种NAT
- 完全锥型
穿越者仅需要知道被穿越者的公网地址(ip:port),就可以通过此公网地址实现穿越
- 受限锥型
被穿越者必须向穿越者公网ip发送数据,穿越者才能通过被穿越者的公网地址实现穿越
- 端口受限锥型
被穿越者必须向穿越者公网ip:port发送数据,穿越者才能通过被穿越者的公网地址实现穿越
- 对称型
目前没有较好的办法实现穿越,但是可以通过中继的方式实现数据中转
一招就够了
- 双方同时向对方的公网地址发送试探数据
- 如果对方是受限型或者端口受限型NAT,此试探数据丢失
- 双发再次向对方的公网地址发送试探数据,
- 如果排除网络丢包,此时三种锥型NAT均已穿越成功
打洞相关协议
STUN: Session Traversal Utilities for NAT (STUN)
https://tools.ietf.org/html/rfc5389
TURN: Traversal Using Relays around NAT (TURN)
https://tools.ietf.org/html/rfc5766
ICE: Interactive Connectivity Establishment (ICE)
https://tools.ietf.org/html/rfc5245
开源实现(client)
- libjingle 由google公司开发, 现在已经被合入了webrtc项目
- pjnath http://www.pjsip.org/pjnath/docs/html/
- libnice https://nice.freedesktop.org/wiki/ 被用于janus-gateway
- libre http://www.creytiv.com/re.html
开源实现(server)
rfc5766-turn-server webrtc推荐使用的
https://github.com/coturn/rfc5766-turn-server
Coturn rfc5766-turn-server 的新版本
https://github.com/coturn/coturn
P2P技术简介的更多相关文章
- P2P技术简介(包括BT软件的分析)(转)
这是一篇别人发表的论文,里面很全面的解释了P2P技术的实现,以及BT网络中应用P2P技术所设计的原理,并列举BT软件的一些专业名词的定义.由于论文发表的比较早,2005年时还没有DHT技术. (链接: ...
- 转载:P2P技术原理及应用(2)
转载allen303allen的空间 在Gnutella网络中存在以下问题: 冗余消息多,对带宽的消耗存在一定的浪费.Gnutella网络协议采用泛洪式(Flooding)消息传播机制,这种消息传播机 ...
- Java Servlet 技术简介
Java Servlet 技术简介 Java 开发人员兼培训师 Roy Miller 将我们现有的 servlet 介绍资料修改成了这篇易于学习的实用教程.Roy 将介绍并解释 servlet 是什么 ...
- 【转】Android 防破解技术简介
http://www.cnblogs.com/likeandroid/p/4888808.html Android 防破解技术简介 这几年随着互联网的不断发展,Android App 也越来越多!但是 ...
- InfiniBand技术简介
InfiniBand技术简介 转载请在文首保留原文出处:EMC中文支持论坛https://community.emc.com/go/chinese 介绍 随着CPU和通讯处理速度的 ...
- Windows NT 技术简介
Windows NT 技术简介 NT:New Technoly(新技术,因比DOS.WIN9X采用了很多新技术而得名) Windows NT基本介绍 WindowsNT是Microsoft推出的面向工 ...
- CSS border三角、圆角图形生成技术简介
http://www.zhangxinxu.com/wordpress/?p=794 一.前言 利用CSS的border属性可以生成一些图形,例如三角或是圆角.纯粹的CSS2的内容,没有兼容性的问题, ...
- P2P技术如何将实时视频直播带宽降低75%?
本文内容来自学霸君资深架构师袁荣喜的技术分享. 1.前言 实时视频直播经过去年的千播大战后已经成为互联网应用的标配技术,但直播平台的成本却一直居高不下,各个平台除了挖主播.挖网红以外,其背后高额的带宽 ...
- FC总线技术简介
FC是由美国标准化委员会(ANSI)的X3T11小组于1988年提出的高速串行传输总线,解决了并行总线SCSI遇到的技术瓶颈,并在同一大的协议平台框架下可以映射更多FC-4上层协议.FC具备通道和网络 ...
随机推荐
- textarea只允许上下调节尺寸
对于extarea,因为如果不做限制的话,它是可以自由调节尺寸的,对于这一点我相信用户是非常喜欢的,因为每个人都有自己认为合适的尺寸,但是对于前端来说就比较头疼了,因为随意调节宽高,就会破坏整体布局, ...
- 2015四川省acm B题
Carries frog has n integers a1,a2,-,an, and she wants to add them pairwise. Unfortunately, frog is s ...
- Ubuntu搭建Hadoop的踩坑之旅(一)
本文将介绍如何使用虚拟机一步步从安装Ubuntu到搭建Hadoop伪分布式集群. 本文主要参考:在VMware下安装Ubuntu并部署Hadoop1.2.1分布式环境 - CSDN博客 一.所需的环境 ...
- websocket 和 ansible配合Tomcat实时日志给前端展示
业务流程图如下 效果图展示 1.django安装websocket模块 pip install dwebsocket 2.shell脚本 用来传递不同的行号输出不同的内容; 第一个参数为0的时候,默认 ...
- H3C三层交换机配置IP
1.直接在物理端口上设置IP地址. int f1/0/1 port link-mode route #链路模式采用路由 ip add 192.168.10.1 24 ospf network0type ...
- MS SQL 事务日志管理小结
本文是对SQL Server事务日志的总结,文章有一些内容和知识来源于官方文档或一些技术博客,本文对引用部分的出处都有标注. 事务日志介绍 在SQL Server中,事务日志是数据库的重要组件,如 ...
- 阿里舆情︱舆情热词分析架构简述(Demo学习)
本节来源于阿里云栖社区,同时正在开发一个舆情平台,其中他们发布了一篇他们所做的分析流程,感觉可以作为案例来学习.文章来源:觉民cloud/云栖社区 平台试用链接:https://prophet.dat ...
- HI3531网络tftp、nfs加载
ifconfig eth0 hw ether 00:00:23:34:45:66; ifconfig eth0 192.168.1.10 netmask 255.255.255.0; route a ...
- HI3531编译helloworld,执行错误
若在嵌入式系统中执行某文件出现如下错误: -/bin/sh: XXX: not found 一般是因为缺少库文件,解决方法有2: 1,文件系统的busybox编译时使用动态编译方式 2,或编译该文件的 ...
- JavaScript过滤特殊字符
JavaScript过滤特殊字符 1.设计实例 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...