p2p 打洞技术
根据通信双方所处网络环境不同,点对点通信可以划分成以下三类:
i> 公网:公网
ii>公网:内网
iii>内网:内网
前两种容易实现,我们这里主要讨论第三种。
这其中会涉及到NAT和NAPT的概念,请大家预先浏览一下:https://en.wikipedia.org/wiki/Network_address_translation(NAT)。NAT目前主要依托于路由器实现:
其中cone NAT中分三种,它们在内外网ip:port的映射机制也不同:
内网 ip_i:port_i <--> NAT ip_o:port_o (相同的 内网 ip_i:port_i 无论访问哪个外部网址,在映射的生命周期内 NAT ip_o:port_o 不会改变)
Full: 所有发送到ip_o:port_o的消息都会转发到ip_i:port_i上
Restricted: 只有ip_i:port_i 访问过的 addr(不限制端口{host:any}),其发送到ip_o:port_o的消息才会转发到ip_i:port_i上
Port Restricted:只有ip_i:port_i 访问过的 addr(限制端口{host: port_o}),其发送到ip_o:port_o的消息才会转发到ip_i:port_i上
Sysmmetric NAT则与以上都不同:
每次内网ip_i:port_i 访问不同的addr(host不同或port不同,都算是不同地址)时,会映射到不同的 NAT ip_o:port_o
以上四种 NAPT 类型在p2p情况下(A and B)有 10 种组合方式,根据发起方不同可以扩展到 16种情况,这十六种情况中并不是每一种情况都能打洞成功的。现有网上的资料显示,内网:内网 情况下打洞都是需要打洞服务器进行引导的,打洞又分UDP和TCP两种情况,我们大致说一下打洞的流程:
假设 A 和 B 双方都是 cone 模式, 在 服务器 S 的引导下进行 TCP打洞
(1)A 和 B 向 S 通过 UDP 发送消息(S 可以从 UDP 消息提取出其公网 IP)
(2)A (ip_a_i, port_a_i) 向 S 建立 TCP 链接,发送与B 通讯的请求,同时 监听 (ip_a_i, port_a_i)
(3)S 提取出 A tcp 链接的公网地址(ip_a_o, port_a_o), 通过UDP协议向 B 发送(ip_a_o, port_a_o)
(4)B 向 (ip_a_o, port_a_o)发起TCP链接请求,如果失败则执行第5步,如果成功则到此为止
(5)B 保持内网地址(ip_b_i,port_b_i)不变向 S 发起TCP链接请求,通知其已经向A发送了链接请求,并监听(ip_b_i,port_b_i)
(6)S 提取出 B的tcp链接公网(ip_b_o, port_b_o), 通过UDP 将(ip_b_o, port_b_o)发送给A
(7) A 通过(ip_a_i, port_a_i)向 B发起链接请求
其中Sysmmetric :Sysmmetric 和 Sysmmetric:Port Restricted 这两种组合是没办法打洞的:
我们假设A是 Sysmmetric \ B 是 Port Restricted
《1》当 A 向 S 发起tcp链接的时候 假设形成 NAT 映射(192.168.1.4:8080 <--> 61.22.37.16:33956)
《2》S 将 61.22.37.16:33956 转发给 B ,B 向该地址发起链接请求
《3》B的路由器的路由表中会添加 61.22.37.16:33956 这个地址,如果A再次通过该地址来向B发起通信就可以完成通信
然而,当A向B发起访问的时候会形成一个新的 NAT 映射关系,产生一个新的公网地址,所以B不会接受其访问。反之如果A是 Port Restricted\ B是 Sysmmetric 也无法完成打洞,大家可以自己思考一下为什么。
p2p 打洞技术的更多相关文章
- [p2p]UDP用打洞技术穿透NAT的原理与实现
首先先介绍一些基本概念: NAT(Network Address Translators),网络地址转换:网络地址转换是在IP地址日益缺乏的情况下产生的, ...
- P2P技术基础: 关于TCP打洞技术
4 关于TCP打洞技术 建立穿越NAT设备的p2p的 TCP 连接只比UDP复杂一点点,TCP协议的“打洞”从协议层来看是与UDP的“打洞”过程非常相似的.尽管如此,基于TCP协议的打洞至今为止还没有 ...
- UDP 构建p2p打洞过程的实现原理(持续更新)
UDP 构建p2p打洞过程的实现原理(持续更新) 发表于7个月前(2015-01-19 10:55) 阅读(433) | 评论(0) 8人收藏此文章, 我要收藏 赞0 8月22日珠海 OSC 源创 ...
- TCP打洞技术
//转http://iamgyg.blog.163.com/blog/static/3822325720118202419740/ 建立穿越NAT设备的p2p的TCP连接仅仅比UDP复杂一点点,TCP ...
- p2p 打洞专场(转)
就像1000个人眼中有1000个哈姆雷特一样,每个人眼中的区块链也是不一样的!作为技术人员眼中的区块链就是将各种技术的融合,包括密码学,p2p网络,分布式共识机制以及博弈论等.我们今天就来讨论一下区块 ...
- NAT详解:基本原理、穿越技术(P2P打洞)、端口老化等
这是一篇介绍NAT技术要点的精华文章,来自华3通信官方资料库,文中对NAT技术原理的介绍很全面也很权威,对网络应用的应用层开发人员而言有很高的参考价值. 学习交流 移动端即时通讯学习交流: 21589 ...
- 低延时的P2P HLS直播技术实践
本文根据4月21日OSC源创会·武汉站的现场分享为蓝本,重新整理.以下是演讲内容: 近几年,随着直播.短视频等视频领域对带宽要求的提升以及CDN行业竞争的加剧,很多CDN公司开始往P2P-CDN方向发 ...
- 【Todo】UDP P2P打洞原理
参考以下两篇文章: https://my.oschina.net/ososchina/blog/369206 http://m.blog.csdn.net/article/details?id=666 ...
- P2P技术详解(二):P2P中的NAT穿越(打洞)方案详解
1.内容概述 P2P即点对点通信,或称为对等联网,与传统的服务器客户端模式(如下图"P2P结构模型"所示)有着明显的区别,在即时通讯方案中应用广泛(比如IM应用中的实时音视频通信. ...
随机推荐
- loadrunner录制脚本(一) ----录制脚本打不开浏览器
loadrunner安装参考百度上的,或者有已经准备好的安装文档. 安装好了之后,用 HP Virtual Generator 录制脚本. 在上述操作中,需要选择火狐浏览器的exe文件驱动.也可以选择 ...
- iOS 读书笔记-国际化
吐槽一下:国际化-我想说学习的这个project好痛苦. 也许是百度的原因,总是不能找到自己想要东西. 找到的内容不是不具体就是时间有点久了.让我这种小白非常头痛. 以下记录一下整个过程. 国际化是什 ...
- AB串
题目: 给定n个A和2n个B.用这些字符拼成一个字符串.要求这个串的全部前缀和后缀B的个数始终不少于A. (一个字符串的前缀是仅仅从开头到某个位置为止的子串,后缀是仅仅从某个位置到结尾的子串). 输入 ...
- 自学Zabbix3.9.1-模板Templates-创建
自学Zabbix3.9.1-模板Templates-创建 1. 模板介绍 模板是一组可以方便地应用于多个主机的实体. 实体可能是: 项目 触发器 图 应用程序 屏幕(因为Zabbix 2.0) 低层次 ...
- 开源组件NanUI一周年 - 使用HTML/CSS/JS来构建.Net Winform应用程序界面
NanUI是什么 NanUI基于ChromiumFX项目进行开发,它能让你在你的Winform应用程序中使用HTML5/CSS3/Javascript等网页技术来呈现用户界面(类似Electron). ...
- cron任务解释
cron本来是在linux下的一个定时任务执行工具,现在很多语言都支持cron,本文参考https://en.wikipedia.org/wiki/Cron,解释一下cron配置. 概述 cron配置 ...
- plugins/python/uwsgi_python.h:2:20: fatal error: Python.h: No such file or directory
装一台新服务器环境的时候,装uwsgi报错: plugins/python/uwsgi_python.h:2:20: fatal error: Python.h: No such file or di ...
- [array] leetcode - 35. Search Insert Position - Easy
leetcode - 35. Search Insert Position - Easy descrition Given a sorted array and a target value, ret ...
- react native仿微信性别选择-自定义弹出框
简述 要实现微信性别选择需要使用两部分的技术: 第一.是自定义弹出框: 第二.单选框控件使用: 效果 实现 一.配置弹出框 弹出框用的是:react-native-popup-dialog(Git地址 ...
- bzoj 2302: [HAOI2011]Problem c
Description 给n个人安排座位,先给每个人一个1~n的编号,设第i个人的编号为ai(不同人的编号可以相同),接着从第一个人开始,大家依次入座,第i个人来了以后尝试坐到ai,如果ai被占据了, ...