| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> P2P打洞过程详解 -> 正文阅读 |
|
[网络协议]P2P打洞过程详解 |
NAT(Network Address Translation),网络地址转换协议。NAT是1994年提出的,当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但现在又想和因特网上的主机通信时,就可以使用NAT技术。 比如说内网ip地址192.168.1.155与外网ip地址150.158.106.96是无法直接通信,如果想要让这两个ip能够直接通信,就需要用到NAT技术将ip地址192.168.1.155先转换成公网ip地址和端口之后就可以进行通信了。 NAT的出现主要是因为IP4地址耗尽,理论上当全球IP6全面普及使用之后,NAT是可以退出历史舞台的。可见NAT的本质就是让一群机器公用同一个IP,这样就暂时解决了IP短缺的问题。 NAT的出现还有一个出于网络安全的原因,外网的主机要想攻击内网的主机,必须要经过防火墙,经过NAT转换才能找到内网的主机。
当一个内网设备要访问外网时,路由器为这个内网ip分配一个外网ip完全供这个设备使用,通常需要路由器有多个外网ip。
当一个内网设备要访问外网时,根据源地址,源端口,目的地址,目的端口的不同映射成外网ip下不同的端口进行会话。所以只要(源地址,源端口,目的地址,目的端口)其中的一个不同,会话的端口就会改变,所以无法穿透。
当一个内网设备要访问外网时,根据源地址,源端口的不同映射成外网ip下不同的端口进行会话。
当一个内网设备要访问外网时,根据源地址,源端口的不同映射成外网ip下不同的端口进行会话。但路由器只接受目的端口返回的udp数据。
当一个内网设备要访问外网时,根据源地址,源端口的不同映射成外网ip下不同的端口进行会话。但路由器只接受目的端口且目的ip返回的udp数据。 以上3,4,5类路由器只要源地址和源端口相同,无论访问外网哪一个地址,映射成的端口都相同,这是这3种类型能穿墙的原因。
通过使用STUN服务器检测设备所处网络的NAT类型,STUN服务器需要两个公网IP。 我们假定client是要检测的设备,server是STUN服务器,并假设server的两公网SOCKET的IP地址和端口号分别是IP1:port和IP2:port。 步骤1: client向server IP1:port发送请求,server使用IP1:port将收到请求的源IP和port(即设备的公网IP地址和端口号)回复给client,如果得到的公网IP和设备自身的IP一样,则判定设备自身处在公网,无NAT,检测结束,否则进行下一步。 步骤2: client向server IP1:port发送请求,server使用IP2:port来回复,如果设备能收到回复,则判定client的NAT为完全锥形(Full Cone NAT),检测结束,否则进行下一步。 步骤3: client向server IP2:port发送请求,server使用IP2:port将收到的源IP和port回复给client,client判断此port和步骤1得到的port是否一样,如果不一样,则为对称型(Symmetric NAT),检测结束; 如果一样,则为限制型(Restricted Cone NAT),这时候需要进一步检查是地址限制型NAT还是端口限制型NAT。 步骤4: client向server IP2:port发送请求,要求server使用该IP的另一个端口来回复,server使用IP2:port2回复请求,如果client能收到回复,则判断为地址限制型(Address Restricted Cone) NAT,否则为端口限制型(Port Restricted Cone) NAT
外S1,外S2为假设在外部的两个辅助穿墙的server PC1为子网1下想要连接PS1的client PS1,为子网2下的,提供数据的server
持有了PS1用于注册的名称(假设为“manager”)、外部的IP、外部的port、以及server 分配给PS1的session(由于udp不是长链接,所以,需要一个session区分对端是否断线重连)。由S1,S2持续向PS1发送心跳保活。
S1上有PC1 的三个外网ip+port,一个用于通讯,另外两个用于和PS1打洞
PS:整个逻辑下来,PS1 和 PC1的socket中可能残存有未处理的心跳包(用于打洞用的数据)p faststream交流群:643201623 网址:首页 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 10:29:00- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |