WebRTC-STUN协议详解

news2024/11/24 3:52:35

1、STUN协议概述

STUN(Session Traversal Utilities for NAT)NAT会话穿透工具,STUN是一个Client/Server协议,支持请求/响应类型、指示类型两种类型。STUN作为ICE(Interactive Connectivity Establishment,交互式连接建立)解决方案的一种工具使用,STUN协议本身没有穿透等能力,只是为穿透提供反射地址,穿透不成功时,需要使用TURN协议。

1.1 请求/响应类型(request/response)

由客户端给服务器发送请求,并等待服务端返回响应,用于确定一个NAT给客户端分配的具体绑定。客户端通过事务ID将请求响应连接起来。

1.2 指示类型(indication transaction)

由服务器或者客户端发送指示,另一方不产生响应,用于保持绑定的激活状态。

2、STUN交互过程

2.1 交互过程

(1)在WebRTC中,STUN客户端内置在浏览器用户代理中,在会话建立之前,先发送stun测试报文,以便浏览器确定其是否位于NAT之后并发现映射地址和端口。

(2)当STUN服务器收到STUN Binding请求时,它会记录Binding请求来自哪个IP地址和端口号,此地址和端口号随后将以STUN Binding响应的形式返回客户端。(通过XOR-MAPPED-ADDRESS属性)。

(3)客户端将响应中发来的IP地址和端口与其发送的IP地址和端口进行比较,以此来判断客户端和服务器之间有没有NAT,若不同,则说明至少有一个NAT,客户端能够识别由最外层的NAT分配的IP地址和端口。存在多个NAT时,STUN只能识别最外层NAT的相关信息。

(4)STUN服务器将源传输地址复制到STUN Binding响应中XOR-MAPPED-ADDRESS属性中,并将绑定响应发送回STUN客户端。当这个数据包通过NAT返回时,NAT将修改IP报头中的目的传输地址,但是STUN响应主体中XOR-MAPPED-ADDRESS属性中的传输地址将保持不变。通过这种方式,客户端可以了解最外面的NAT相对于STUN服务器分配的反射传输地址。

2.2 保活机制

在ICE中,STUN协议用于连通性检查和ICE保活,客户端需要按固定间隔以指示形式发送STUN Binding请求,防止NAT映射超时,指示型请求可使NAT重置其UDP定时器,发送间隔短于NAT UDP定时器设置,就可以保持NAT映射。

2.3 身份验证机制

2.3.1 短期身份验证

短期身份验证采用用户名/密码方式,此机制适用于单个会话。ICE使用此方法对每组连接检查应用不同的身份验证。短期身份验证机制假设在STUN事务之前,客户端和服务器已经使用了其他协议来交换了证书,以username和password形式。这个证书是有时间限制的。在WebRTC中通过SDP进行相关信息的交互。

2.3.2长期身份验证

长期身份验证采用质询/响应机制,允许使用长期凭据。长期身份验证机制依赖于一个长期证书,username和password在客户端和服务器中是共用的。这个证书从它提供给用户开始将一直是有效的,直到该用户不再是该系统的用户。

3、STUN报文格式详解

3.1 STUN包头格式

最高两位:为0,在STUN协议与其他协议端口复用时,用于区分STUN和其他数据包,如RTP数据包。

STUN Message Type(16bits):消息类型。定义消息类型如下:

Message Type后14bits可进一步分解为如下结构:

 

(1)C1-C0两位表示类编码
0b00:request
0b01:indication
0b10:success response
0b11:error response
(2)M11-M0表示方法
STUN目前定义了一个绑定方法,Binding方法可以用于请求/响应类型和指示类型。method=0b000000000001 (Binding)
  
Message Length:(16bits),消息长度,不包含STUN Header的20个字节。所有的STUN属性都是20字节对齐的。

Magic Cookie:(32bits),固定值0x2112A442,用于反射地址的异或(XOR)运算。

Transaction ID:(96bits),事务ID标识符,请求对应的响应具有相同的标识符。

3.2 STUN属性

STUN 消息头后跟着多个属性,每个属性都采用 TLV 编码,type 为 16 位的类型、lenght 为 16 位的长度、value 为属性值。每个 STUN 属性必须是 4 字节对齐。lenght 字段的值只表示 TLV 中 V(Value) 的长度,既不包括 T(Type) 和 L(length),又不包括 padding 填充数据的长度。具体如下所示:


STUN 请求和响应都包含消息属性。消息属性分为强制理解属性和可选理解属性,具体如下所示: 

在ICE中,包含STUN用到的几个属性,具体如下所示:

 

MAPPED-ADDRESS:NAT客户端的反射地址,具体如下所示: 

Family:IP类型,0x01-IPV4、0x02-IPV6
Port:端口
Address:IP地址

XOR-MAPPED-ADDRESS:与MAPPED-ADDRESS属性基本相同,区别在于反射地址经过一次异或(XOR)处理,异或运算是其自身的逆运算,客户端经过一次异或运算获得真实的反射地址。解决ALG篡改地址和端口的问题。

USERNAME:用户名,用于消息完整性,在webrtc中的规则为 “对端的ice-ufrag:自己的ice-ufrag”,其中ice-ufrag已通过提议/应答的SDP信息进行交互。

MESSAGE-INTEGRITY:STUN 消息的 HMAC-SHA1 值,长度 20 字节,用于消息完整性认证。详细的计算方式后续进行举例说明。

FINGERPRINT:指纹认证,此属性可以出现在所有的 STUN 消息中,该属性用于区分 STUN 数据包与其他协议的包。属性的值为采用 CRC32 方式计算 STUN 消息直到但不包括FINGERPRINT 属性的的结果,并与 32 位的值 0x5354554e 异或。

ERROR-CODE:属性用于error response报文中。其中包含了300-699表示的错误码,以及一个UTF-8格式的文字出错信息(Reason phrase)。

REALM:此属性可能出现在请求和响应中。在请求中表示长期资格将在认证中使用。当在错误响应中出现表示服务器希望客户使用长期资格来进行认证。

NONCE:出现在请求和响应消息中的一段字符串。

UNKNOWN-ATTRIBUTES:此属性只在错误代码为420的的错误响应中出现。

SOFTWARE:此属性用于代理发送消息时包含版本的描述。它用于客户端和服务器。它的值包括制造商和版本号。该属性对于协议的运行没有任何影响,仅为诊断和调试目的提供服务。SOFTWARE属性是个可变长度的,采用UTF-8编码的小于128个字符的序列号

ALTERNATE-SERVER:属性表示 STUN 客户可以尝试的不同的 STUN 服务器地址。属性格式与 MAPPED-ADDRESS 相同。

在Binding请求中通常需要包含一些特殊的属性,以在ICE进行连接性检查的时候提供必要信息,详细的属性如下所示:

PRIORITY 和 USE-CANDIDATE:终端必须在其request中包含PRIORITY属性,指明其优先级,优先级由公式计算而得。如果有需要也可以给出特别指定的候选(即USE-CANDIDATE属性)。

ICE-CONTROLLED和ICE-CONTROLLING: ICE流程中定义了两种角色:controlling和controlled。不同的角色在candidate pair优先级的计算,pair nominate的决策上有所不同。一般流程下,会话的双发各自的角色选择是与会话协商的流程相关的。offerer是controlling,answerer是controlled。

ICE-CONTROLLED或者是ICE-CONTROLLING,这两个属性都会携带一个Tie breaker这样的字段,其中包含 一个本机产生的随机值。收到该bind request的一方会检查这两个字段,如果和当前本机的role冲突,则检查本机的tie breaker值和消息中携带的tie breaker值进行判定本机合适的role。判定的方法为Tie breaker值大的一方为controlling。如果判定本端变更角色,这直接修改;如果判定对端变更角色,则对此bind request发送487错误响应,收到此错误响应的一方变更角色即可。

4、STUN报文示例

4.1 Binding Request

4.1.1 USENAME
USENAME 组成格式为对端ice-ufrag:自己ice-ufrag,其中对端ice-ufrag为webrtc中的answer sdp,其中属性a=ice-ufrag:2g25ql32,自己ice-ufrag为offer sdp,其中属性a=ice-ufrag:cVN4。

STUN属性采用4字节对齐,不足的用00填充。

4.1.2 ICE-CONTROLLING

Tie breaker:64bits的随机值,用于解决角色冲突。

4.1.3 PRIORITY

4.1.4 MESSAGE-INTEGRITY 

输入:FINGERPRINT属性之前的STUN数据
00 01 00 50 21 12 a4 42 67 33 45 6e 4a 4b 48 56
32 43 32 7a 00 06 00 0d 32 67 32 35 71 6c 33 32
3a 63 56 4e 34 00 00 00 c0 57 00 04 00 00 03 e7
80 2a 00 08 3e e8 21 cb d9 f4 4a d7 00 24 00 04
6e 00 1e ff 00 08 00 14 ba 64 89 fa 5b 93 71 c4
d6 3d bf 20 8c a1 b2 ac 25 8b bd 75

CRC-32运算:获得以下输出
输出:0x5B6D336D

XOR运算:0x5B6D336D XOR 0x5354554E
输出:0x 08 39 66 23即FINGERPRINT的值。


4.2.1 XOR-MAPPED-ADDRESS

 

Port:与Magic cookie的网络字节序前16位进行异或
0xc1a6 = 57524 XOR 0x2112
IP:与Magic cookie进行异或运算
0x8d06a50b = (172.20.1.73)XOR 0x2112a442


 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/685424.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【需求实现】输入多少就输出多少的拟合任务如何实现(一):数据集分割

神经网络中输入多少数据就输出多少数据的情况如何实现 导读数据集长什么样?怎么分割数据集?时间窗口分析模板我知道你很急,但你先别急 换个思路 导读 在实习的过程中遇到了这样一种需求:给定一条序列,并另外给定一条期…

使用ffmpeg将rtsp流转流实现h5端播放

主要实现rtsp转tcp协议视频流播放 ffmpeg下载安装(公认业界视频处理大佬) a、官网地址:www.ffmpeg.org/ b、gitHub:github.com/FFmpeg/FFmp… c、推荐下载地址:ffmpeg.zeranoe.com/builds/ (选择如下图) 2.配置ffmpeg…

期末复习【计算机系统结构】

期末复习【计算机系统结构】 前言推荐押题公式 期末复习重点第1章 计算机体系结构的基本概念1.3 定量分析技术1.3.1计算机系统设计的定量原理 第2章 计算机指令集结构第3章 流水线技术3.2 流水线的性能指标3.2.1 吞吐率3.2.2 加速比3.2.3 效率3.2.4 流水线性能分析举例 3.3 流水…

miniconda的安装

1. conda 是一个开源的包、环境管理器,可以用于在同一个机器上安装不同版本的软件包及其依赖,并能够在不同的环境之间切换。 miniconda官网下载 miniconda清华镜像下载 找到自己想要安装的版本,我这里选择的是Miniconda3-4.7.12.1-Linux-x…

OUC编译原理实验报告 实验4:验证Yacc的使用/实验e4:从语言SUM到栈式计算机STACK的机器语言的翻译

编译原理实验报告 实验4:验证Yacc的使用 实验e4:从语言SUM到栈式计算机STACK的机器语言的翻译 中国海洋大学编译原理实验2023春 仅供同学参考思路 请勿直接抄袭 否则可能喜提0分 目录 文章目录 编译原理实验报告目录一.实验目的二.实验内容实验4实验…

多进程爬虫实战-摩托车网

前言 最近有遇到很多私信让我讲一讲多进程的爬虫,我发现大家对爬虫的框架写法和进程的理解有很多的问题和疑问,这次就带来一个小实战让大家理解多进程爬虫以及框架的写法 由于进程爬虫会对任何服务器都有一定的影响,本文仅供学习交流使用&…

【Linux后端服务器开发】C程序预处理

目录 一、源文件到可执行程序的过程 二、预定义符号 三、#define宏定义 四、条件编译 一、源文件到可执行程序的过程 预处理:去注释,宏替换,头文件展开,条件编译编译:c语言 ---> 汇编语言(语法分析…

JUC高级-0625

13. AbstractQueuedSynchronized之AQS 13.1 前置知识 公平锁和非公平锁可重入锁自旋思想LockSupport数据结构之双向链表设计模式之模板设计模式 13.2 AQS入门级别理论知识 AQS是什么? 字面意思:抽象的队列同步器,实现了通知唤醒的机制源代…

8通道250MSPS采样率16位AD采集FMC子卡-高速数据采集专家

FMC128是一款8通道250MHz采样率16位分辨率AD采集FMC子卡,符合VITA57.1规范,可以作为一个理想的IO模块耦合至FPGA前端,8通道AD将模拟信号数字化后通过高带宽的FMC连接器(HPC)连接至FPGA,从而大大降低了系统信…

电力智能运维是什么?有哪些优势?

设备检修维护是指对设备和系统进行必要的监视、维修和养护,通过日常的维护使设备保持良好的状态,确保设备安全、稳定、经济运行。由于时代的变迁,电力设备的检测维修变得也越来越智能化。采用的智能运维系统,可以更好的监控电力设…

BCSP-玄子Java开发之Java Web编程CH01_初识动态网页

BCSP-玄子Java开发之Java Web编程CH01_初识动态网页 1.1 B/S架构 B/S架构:浏览器/服务器 程序完全部署在服务器上使用浏览器访问服务器无需单独安装客户端软件 为什么要使用B/S架构 B/S与C/S比较B/S架构C/S架构软件安装浏览器需要专门的客户端应用升级维护客户…

NGINX PHP Cookie 会话中 PHPSESSID 缺少 HTTPOnly、Secure 属性解决方案

NGINX & PHP Cookie 会话中 PHPSESSID 缺少 HTTPOnly、Secure 属性解决方案 1 / 说明 基于安全的考虑,需要给cookie加上Secure和HttpOnly属性,HttpOnly比较好理解,设置HttpOnlytrue的cookie不能被js获取到,无法用document.coo…

linux系统的文件等相关操作命令

文章目录 1 查找文件(find、grep)2 查看文件内容(cat、more、less、head、tail)3 文件比较(diff)4 文本编辑器(vi、vim)5 文件压缩与解压(tar、tar.tgz、zip、rar、rar.g…

yum安装 lnmp

目录 一.nginx 的yum安装 1.关闭防火墙 2. 安装 nginx 3.安装依赖包 4.启动服务 二. 安装 mysql 5.7 (mariadb) 1.nysal的yum安装 2. 启动服务 3.在日志文件中找出root用户的初始密码 4.登录 mysql 5. 停止版本更新,稳定数据库的运行 三.php 的yum安装 1.…

rust abc(4): 定义变量并使用 mut 关键字

文章目录 1. 目的2. 不可变变量 (immutable variable)2.1 含义2.2 代码实例 3. 可变变量 (mutable variable)3.1 含义3.2 代码实例 4. 总结 1. 目的 学习 rust 语言中变量的定义方式, 包括普通变量(immutable)、可变变量(mutable…

轻量云服务器(香港)ping不通怎么解决?

​  在使用轻量云服务器(香港)时,有时候会出现ping不通的情况,这时候我们该怎么办呢? 首先,我们需要知道 ping 不通的原因。 ping 是一种基于 ICMP 协议的网络测试工具,它可以用来测试网络连接的质量和速度。如果 ping 不通&am…

英特尔进军晶圆代工,台积电“危”?

近来,半导体市场再次变得繁荣,尤其随着AI大型机模型的出现,半导体巨头们纷纷加大投资力度,以期在AI时代中积蓄新的增长。 作为AI大模型时代中最受益的厂商之一,英伟达稳居市场前沿,而AMD也加入了竞争&…

阿里发布2023年Java社招岗(正式版)面试题

每年的金三银四、金九银十都是各大公司招聘程序员的最佳时期,在这段时间内有好多程序员为面试而发愁,不知道如何才能收到好的 offer,拿到理想的薪资,实现自我的人生价值! 我想告诉大家的是,其实都不用愁的…

Web Worker是什么?怎么用?

71. Web Worker是什么?怎么用? Web Worker 是一种浏览器提供的 JavaScript 特性,它允许在后台线程中运行脚本,从而避免阻塞主线程并提高页面性能和响应速度。 1. Web Worker 的使用方法如下: 创建 Worker 对象&…

chatgpt赋能python:Python编译成库的利与弊

Python编译成库的利与弊 Python作为一种高级编程语言,具有简洁易读的语法和强大的生态系统,在数据科学、Web开发、游戏开发等领域得到广泛应用。然而,Python解释器的执行效率较低,因此为了提高Python程序的性能,常使用…