当前位置: 首页 > 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;只找到说不能删除太久远的旧日志…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...