当前位置: 首页 > news >正文

WebRTC中的NAT穿透

NAT简介

我们知道,WebRTC会按照内网、P2P、中转的顺序来尝试连接。在大部分的情况下,实际是使用P2P或者中转的。这里P2P的场景主要使用的技术就是NAT穿透。

我们先简单了解下NAT。NAT在真实网络中是常见的,它的出现一是为了解决ipv4地址不够用的问题,二是为了网络安全考虑的。

  • 首先,让同一个内网中的多台主机共用一个公网ip,可以大大缓解ipv4向ipv6过度期间,ipv4地址不够用的问题。

  • 另外,NAT将主机隐藏在内网中,也就使得黑客想访问起来并没有那么容易了。

NAT的规范在RFC 3022中定义,其主要作用就是做网络地址转换。NAT设备(路由器)会在内网地址和外网地址之间建立起映射关系。当内网主机向外网主机发送信息时,NAT会将内网地址替换为映射的外网地址。相对应的,当外网主机向内网主机发生信息时,NAT会将外网地址替换为映射的内网地址。

因为NAT设备的存在,外网主机通常无法直接与内网主机通信。所以在建立P2P连接之前,需要做的就是NAT穿透,也就是俗称的“打洞”。

NAT类型

RFC3489和RFC5389是关于NAT穿透的协议,其中RFC3489中把NAT分成了4个类型。它们对NAT穿透的限制呈递进趋势。

完全锥型

  • 完全锥型NAT的规范是,只要内网主机A通过端口p1发出数据包,在NAT上生成了相应的映射表(这个表就是所谓的“洞”)。接收数据包的外网主机能从这个数据包的报文中得到这个映射关系。它可以将这个映射关系告诉其他外网主机,这样任意外网主机发送到这个NAT上端口p1的数据包就都会被转发到内网主机A上。
  • 完全锥型NAT的特点就是只要“打洞”成功,所有知道这个“洞”的主机都能通过它和内网主机进行通信。

IP限制锥型

  • IP限制锥型NAT的规范相比于完全锥型NAT,限制了外网来的IP。也就是说,只有从内网主机发送数据包的目的IP,发送到这个NAT上端口p1的数据包才会被转发到内网主机A上。
  • IP限制锥型NAT的特点就是“打洞成功”后,只有成功“打洞”的外网主机才能通过这个“洞”和内网主机进行通信。其他外网主机即使知道这个“洞”,发来的数据包也回被NAT丢弃。

端口限制锥型

  • 端口限制锥型NAT的规范相比于IP限制锥型NAT,除了限制外网来的IP,还要限制端口。也就是说只有从内网主机发送数据包的目的IP和端口,发送到这个NAT上端口p1的数据包才会被转发到内网主机A上。
  • 端口限制锥型NAT的特点就是,除了限制了“洞”的外网ip,还限制了“洞”的外网端口。

对称型

  • 对称型NAT的规范相比于端口限制锥型NAT,还增加了一条规则。从内网主机A上发到不同的外网主机的数据包经过NAT时,NAT都会为之分配不同的外网端口。
  • 对称型NAT的特点就是,内网主机每次发送数据包给不同的外网主机时,都会产生一个新的“洞”。

NAT类型检测

要进行NAT穿透,内网主机首先要知道自己连接的NAT的类型。在RFC3489中给出了标准的检测流程。这个过程需要2台拥有2个网卡的STUN服务器。具体流程如下图所示。

  • 主机向1号服务器的某个IP和端口发送一条请求,如果超过超时时间没有收到响应,则说明主机与服务器之间UDP不通
  • 如果收到服务端的响应,则对比本地IP和接收到的响应包中的主机的公网IP。如果这两个IP一致,则说明主机在公网上,没有NAT防护。如果不一致,则需要进一步的NAT类型检测,稍后详述。
  • 接下来,主机再次向1号服务器相同的IP和端口发送一条请求,1号服务器在收到请求后,会使用第二个网卡返回响应。如果主机收到了这个响应,则说明它在一个开放的网络上,是一台公网主机。如果主机没有收到这个响应,则说明它在对称型防火墙(可以认为与对称型NAT类似)后面。
  • 回到上面进一步的NAT类型检测流程。主机也是向1号服务器相同的IP和端口发送一条请求,1号服务器也会使用第二个网卡返回响应。如果主机收到了这个响应,则说明它在完全锥型NAT后面。
  • 如果主机没有收到这个响应,则向2号服务器发送一条请求。主机收到2号服务器的响应后,对比1号服务器返回的响应包中的主机的公网IP和2号服务器返回的响应包中的主机的公网IP,如果不一致,则说明它在一个对称型NAT的后面。如果一致,则需要进一步的检测。
  • 主机再次向1号服务器发送一条请求,1号服务器使用相同的IP(即接收请求的IP)和不同的端口返回响应。如果主机收到了这个响应,则说明它在IP限制型NAT后面,如果主机没有收到这个响应,则说明它在端口限制型NAT后面。

NAT穿透流程

在确认完主机所在网络中的NAT类型后,就可以判断是否能进行NAT穿透,以及确认NAT穿透的方法。

一般而言,完全锥型NAT以及IP限制型NAT可以与任何其他类型的NAT互通;两边都是端口限制型NAT的也可以互通;一边是端口限制型NAT,另一边是对称型NAT,或者两边都是对称型NAT的情况下想完成穿透很难,所以这种情况一般会通过TRUN协议进行数据中转。

在WebRTC中通信的双方通过ICE交换了上面获取到的一些网络信息,之后就可以尝试NAT穿透,建立P2P连接了。

假设需要建立P2P通信的双方为主机A和主机B。

  • 如果主机A在完全锥型NAT或者IP限制型NAT后,只要主机先往主机B发送一个数据,就会在该NAT上留下“洞”,即使发送的数据被对方的NAT丢弃。后续主机B发往主机A的数据也能通过主机A这边的NAT上的“洞”实现穿透了。总的来说,这种情况下,只要双方不停的发送数据包,且没有某一方的数据包被全部丢弃,就能成功穿透。
  • 如果主机A在端口限制型NAT后,而主机B也在端口限制型NAT后,只要双方互相发送数据包则和前面情况一样,可以利用NAT上的“洞”来穿透。
  • 主机A在端口限制型NAT后,主机B在对称型NAT后,或者两边都在对称型NAT后,就只能通过服务器中转来通信了。服务器中转的TURN协议在RFC5766中进行了详细的规范。

相关文章:

WebRTC中的NAT穿透

NAT简介 我们知道,WebRTC会按照内网、P2P、中转的顺序来尝试连接。在大部分的情况下,实际是使用P2P或者中转的。这里P2P的场景主要使用的技术就是NAT穿透。 我们先简单了解下NAT。NAT在真实网络中是常见的,它的出现一是为了解决ipv4地址不够…...

SpringCloud-高级篇(一)

目录: (1)初识Sentinel-雪崩问题的解决方案 (2)服务保护Sentinel和Hystrix对比 (3)Sentinel初始-安转控制台 (4)整合微服务和Sentinel 微服务高级篇 (1&…...

电脑自动重启是什么原因?详细解说

案例:电脑自动重启是什么原因? “一台用了一年的电脑,最近使用,每天都会一两次莫名其妙自动重启,看了电脑错误日志,看不懂什么意思,一直找不到答案。有没有高手知道怎么解决这个问题的。” 当…...

2023美国大学生数学建模竞赛E题思路

problem 背景: 光污染用于描述过度或不良使用人造光。我们称之为光污染的一些现象包括光侵入、过度照明和光杂波。在大城市,太阳落山后,这些现象最容易在天空中看到:然而,它们也可能发生在更偏远的地区。 光污染会改变我们对夜空…...

蓝桥杯三月刷题 第五天

文章目录💥前言😉解题报告💥数的分解🤔一、思路:😎二、代码:💥前言 上午没写,下午写了会被朋友拉出去耍,被冷风吹到了,而且被他坑了,根本没有玩骑…...

Echarts 水波图实现

开发的项目中需要实现这样一个水波图,例如下图在echarts官网中找了很久没找到,后面是在Echarts社区中找到的,实现了大部分的样式,但是还有一些数据的展示没有实现。水波图的数值展示是默认整数百分比,我的需求是需要保…...

逻辑优化基础-shannon decomposition

1. 简介 在逻辑综合中,香农分解(Shannon decomposition)是一种常用的布尔函数分解方法。它将一个布尔函数分解为两个子函数的和,其中每个子函数包含一个布尔变量的取反和非取反的部分。 具体来说,假设对于一个布尔函…...

Java中线程池的创建与使用

前言:默认线程池的弊端在线程池应用中,参考阿里巴巴java开发规范:线程池不允许使用Executors去创建,不允许使用系统默认的线程池,推荐通过ThreadPoolExecutor的方式,这样的处理方式让开发的工程师更加明确&…...

关于HashMap与OkHttp的使用

写了一个okhttp的post请求方法,添加参数很麻烦,需要封装: //post请求public static void sendOkHttpRequestPost(String address , Callback callback) {OkHttpClient client new OkHttpClient();// 创建表单参数RequestBodyRequestBody fo…...

华为OD机试 - 单词倒序(C 语言解题)【独家】

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 使用说明本期题目:单词倒序…...

搭建Samba服务器

搭建Samba服务器 文章目录搭建Samba服务器samba安装安装命令配置-ubuntu侧为samba服务器创建一个共享目录share创建使用该共享文件夹的账号修改samba服务器配置文件重启samba服务windows创建映射1.点击映射网络驱动器2.输入Ubuntu中的ip地址及其用户信息3.输入用户信息及其密码…...

Matlab进阶绘图第5期—风玫瑰图(WindRose)

风玫瑰图(Wind rose diagram)是一种特殊的极坐标堆叠图/统计直方图,其能够直观地表示某个地区一段时期内风向、风速的发生频率。 风玫瑰图在建筑规划、环保、风力发电、消防、石油站设计、海洋气候分析等领域都有重要作用,所以在一些顶级期刊中也能够看…...

【SQL开发实战技巧】系列(二十四):数仓报表场景☞通过执行计划详解”行转列”,”列转行”是如何实现的

系列文章目录 【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事 【SQL开发实战技巧】系列(二):简单单表查询 【SQL开发实战技巧】系列(三):SQL排序的那些事 【SQL开发实战技巧…...

XILINX AXI总线学习

AXI介绍什么是AXI?AXI(高级可扩展接口),是ARM AMBA的一部分;AMBA:高级微控制器总线架构;是1996年首次引入的一组微控制器总线;开放的片内互联的总线标准,能在多主机设计中实现多个控…...

2022CCPC女生赛(补题)(A,C,E,G,H,I)

迟了好久的补题&#xff0c;&#xff0c;现在真想把当时赛时的我拉出来捶一拳排序大致按照题目难度。C. 测量学思路&#xff1a;直接循环遍历判断即可&#xff0c;注意角度要和2π取个最小值。AC Code&#xff1a;#include <bits/stdc.h>typedef long long ll; const int…...

【Nginx】Nginx的安装配置

环境说明系统&#xff1a;Centos 7一、编译安装Nginx官网下载地址nginx: download#安装依赖 [rootnginx nginx-1.22.1]# yum install gcc pcre pcre-devel zlib zlib-devel -y #从官网下载Nginx安装包&#xff0c;并进行解压、编译、安装 [rootnginx ~]# wget https://nginx.or…...

数学小课堂:统计时有效地筛选数据

文章目录引言I 被爆冷门的原因II 统计时有效地筛选数据2.1 统计数据的常见问题2.2 大数据的特征2.3 有效筛选数据的原则引言 在博弈论中很多结果有发生的概率&#xff0c;而概率这件事只是估计出来的&#xff0c;并不准确。因此&#xff0c;一旦加入博弈的选手多了之后&#x…...

MySQL安装优化

hello&#xff0c;大家好&#xff0c;我是小鱼 本文主要通过针对 MySQL Server&#xff08;mysqld&#xff09;相关实现机制的分析&#xff0c;得到一些相应的优化建议。主要 涉及 MySQL 的安装以及相关参数设置的优化&#xff0c;但不包括 mysqld 之外的比如存储引擎相关的参…...

RocketMQ系列开篇

RocketMQ系列开篇 今天开始学习RocketMQ相关系列源码。我会带着自己的目的去学习源码。所以不会像一般的技术博客一样&#xff0c;写一个完整的流程&#xff0c;介绍每一步干了啥。而是提出一个问题&#xff0c;然后去看代码里面是怎么实现的。说明一下&#xff0c;本次系列我…...

logback无法删除太久远的日志文件?logback删除日志文件源码分析

logback无法删除太久远的日志文件&#xff1f;logback删除日志文件源码分析 最近发现logback配置滚动日志&#xff0c;但是本地日志文件甚至还有2年前的日志文件&#xff0c;服务器是却是正常的&#xff01; 网上搜索了一波没有发现&#xff0c;只找到说不能删除太久远的旧日志…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...