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

【Nginx】Nginx的安装配置
环境说明系统:Centos 7一、编译安装Nginx官网下载地址nginx: download#安装依赖 [rootnginx nginx-1.22.1]# yum install gcc pcre pcre-devel zlib zlib-devel -y #从官网下载Nginx安装包,并进行解压、编译、安装 [rootnginx ~]# wget https://nginx.or…...
数学小课堂:统计时有效地筛选数据
文章目录引言I 被爆冷门的原因II 统计时有效地筛选数据2.1 统计数据的常见问题2.2 大数据的特征2.3 有效筛选数据的原则引言 在博弈论中很多结果有发生的概率,而概率这件事只是估计出来的,并不准确。因此,一旦加入博弈的选手多了之后&#x…...
MySQL安装优化
hello,大家好,我是小鱼 本文主要通过针对 MySQL Server(mysqld)相关实现机制的分析,得到一些相应的优化建议。主要 涉及 MySQL 的安装以及相关参数设置的优化,但不包括 mysqld 之外的比如存储引擎相关的参…...
RocketMQ系列开篇
RocketMQ系列开篇 今天开始学习RocketMQ相关系列源码。我会带着自己的目的去学习源码。所以不会像一般的技术博客一样,写一个完整的流程,介绍每一步干了啥。而是提出一个问题,然后去看代码里面是怎么实现的。说明一下,本次系列我…...

logback无法删除太久远的日志文件?logback删除日志文件源码分析
logback无法删除太久远的日志文件?logback删除日志文件源码分析 最近发现logback配置滚动日志,但是本地日志文件甚至还有2年前的日志文件,服务器是却是正常的! 网上搜索了一波没有发现,只找到说不能删除太久远的旧日志…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...

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