根据通信双方所处网络环境不同,点对点通信可以划分成以下三类:

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 打洞技术的更多相关文章

  1. [p2p]UDP用打洞技术穿透NAT的原理与实现

    首先先介绍一些基本概念:            NAT(Network Address             Translators),网络地址转换:网络地址转换是在IP地址日益缺乏的情况下产生的, ...

  2. P2P技术基础: 关于TCP打洞技术

    4 关于TCP打洞技术 建立穿越NAT设备的p2p的 TCP 连接只比UDP复杂一点点,TCP协议的“打洞”从协议层来看是与UDP的“打洞”过程非常相似的.尽管如此,基于TCP协议的打洞至今为止还没有 ...

  3. UDP 构建p2p打洞过程的实现原理(持续更新)

    UDP 构建p2p打洞过程的实现原理(持续更新) 发表于7个月前(2015-01-19 10:55)   阅读(433) | 评论(0) 8人收藏此文章, 我要收藏 赞0 8月22日珠海 OSC 源创 ...

  4. TCP打洞技术

    //转http://iamgyg.blog.163.com/blog/static/3822325720118202419740/ 建立穿越NAT设备的p2p的TCP连接仅仅比UDP复杂一点点,TCP ...

  5. p2p 打洞专场(转)

    就像1000个人眼中有1000个哈姆雷特一样,每个人眼中的区块链也是不一样的!作为技术人员眼中的区块链就是将各种技术的融合,包括密码学,p2p网络,分布式共识机制以及博弈论等.我们今天就来讨论一下区块 ...

  6. NAT详解:基本原理、穿越技术(P2P打洞)、端口老化等

    这是一篇介绍NAT技术要点的精华文章,来自华3通信官方资料库,文中对NAT技术原理的介绍很全面也很权威,对网络应用的应用层开发人员而言有很高的参考价值. 学习交流 移动端即时通讯学习交流: 21589 ...

  7. 低延时的P2P HLS直播技术实践

    本文根据4月21日OSC源创会·武汉站的现场分享为蓝本,重新整理.以下是演讲内容: 近几年,随着直播.短视频等视频领域对带宽要求的提升以及CDN行业竞争的加剧,很多CDN公司开始往P2P-CDN方向发 ...

  8. 【Todo】UDP P2P打洞原理

    参考以下两篇文章: https://my.oschina.net/ososchina/blog/369206 http://m.blog.csdn.net/article/details?id=666 ...

  9. P2P技术详解(二):P2P中的NAT穿越(打洞)方案详解

    1.内容概述 P2P即点对点通信,或称为对等联网,与传统的服务器客户端模式(如下图"P2P结构模型"所示)有着明显的区别,在即时通讯方案中应用广泛(比如IM应用中的实时音视频通信. ...

随机推荐

  1. H5图片上传插件

    基于zepto,支持多文件上传,进度和图片预览,用于手机端. (function ($) { $.extend($, { fileUpload: function (options) { var pa ...

  2. Hibernate全套增删改查+分页

    1.创建一个web工程 2.导入jar包 3.创建Student表 4.创建实体类 package com.entity; public class Student { private Integer ...

  3. 【BZOJ-4386】Wycieczki DP + 矩阵乘法

    4386: [POI2015]Wycieczki Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 197  Solved: 49[Submit][Sta ...

  4. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q73-Q76)

    Question 73You create a Web Part that calls a function named longCall.You discover that longCall tak ...

  5. 如何利用gatling创建一个性能测试例

    [原创博文,转载请声明出处] 基于上一篇博文介绍如何源码编译创建自己的gatling可执行工具,今天介绍一下如何基于gatling做性能测试! 由于gatling的测试例脚本是基于scala写的,所以 ...

  6. Unable to execute dex: method ID not in [0, 0xffff]: 65536

    http://ingramchen.io/blog/2014/09/prevention-of-android-dex-64k-method-size-limit.html

  7. extern int a[] VS extern int *a

    array VS pointer 参考: 1.Extern using pointer instead of array array is not pointer 2.extern array que ...

  8. nutch 1.7 修改代码后如何编译发布,并集群采集攻略

    nutch 1.3之后,分布式的可执行文件与单机可执行文件进行了分离 接上篇,nutch 1.7 导入 eclipse 本篇所要解决的问题:nutch下载下来经过简单的配置即可进行采集,但有时候我们需 ...

  9. hdu 1232 畅通project

    题目: 链接:点击打开链接 算法: 赤裸裸的并查集. 代码: #include<iostream> #include<cstdio> #include<cstring&g ...

  10. SQL SERVER大话存储结构(6)_数据库数据文件

            数据库文件有两大类:数据文件跟日志文件,每一个数据库至少各有一个数据文件或者日志文件,数据文件用来存储数据,日志文件用来存储数据库的事务修改情况,可用于恢复数据库使用.     这里分 ...