标签:bit 效果 发送数据 png gateway 中继 没有 text fan
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 简介
二、NAT的特点
在这里第二条是重点,正是因为NAT规定了“网络访问只能先由私网侧发起,公网侧无法主动访问私网主机”,才引出了我们的主题:NAT穿越,我们就是要通过NAT穿越来实现“公网侧主动访问私网主机”。
三、地址转换表的建立与删除
(内网)ip:port <----->(外网)ipw:portw
…… <-----> ……
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发送数据,穿越者才能通过被穿越者的公网地址实现穿越
目前没有较好的办法实现穿越,但是可以通过中继的方式实现数据中转
一招就够了
打洞相关协议
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
标签:bit 效果 发送数据 png gateway 中继 没有 text fan
原文地址:http://www.cnblogs.com/wansui/p/6916190.html