stun协议笔记一(stun格式简介)「建议收藏」

stun协议笔记一(stun格式简介)「建议收藏」一、stun协议格式1、STUN报文头1)最高的2位必须置零,这可以在当STUN和其他协议复用的时候,用来区分STUN包和其他数据包。2)STUNMessageType字段定义了消息的类型(请求/成功响应/失败响应/指示)和消息的主方法。虽然我们有4个消息类别,但在STUN中只有两种类型的事务,即请求/响应类型和指示类型。响应类型分为成功和出错两种,用来帮助快速处理STUN…

大家好,又见面了,我是你们的朋友全栈君。

一、stun协议格式

1、STUN报文头

stun协议笔记一(stun格式简介)「建议收藏」

1)最高的2位必须置零,这可以在当STUN和其他协议复用的时候,用来区分STUN包和其他数据包。

2)STUN Message Type 字段定义了消息的类型(请求/成功响应/失败响应/指示)和消息的主方法。
虽然我们有4个消息类别,但在STUN中只有两种类型的事务,即请求/响应类型和指示类型。响应类型分为成功和出错两种,用来帮助快速处理STUN信息。Message Type字段又可以进一步分解为如下结构:

stun协议笔记一(stun格式简介)「建议收藏」

其中显示的位为从最高有效位M11到最低有效位M0,M11到M0表示方法的12位编码。C1和C0两位表示类的编码。

因此:MessageType=MessageClass | MessageMethod

例如对于binding方法来说,

MessageClass定义:0b00表示request,0b01表示indication,0b10表示success response,0b11表示error response

Message Method定义为0x001

所以binding的MessageType的定义如下枚举值:

stun协议笔记一(stun格式简介)「建议收藏」

stun协议笔记一(stun格式简介)「建议收藏」

每一个method都有可能对应不同的传输类别。方法和类是正交的,因此对于每种方法,对该方法的请求,成功响应,错误响应和指示都是可能的。拓展定义新方法的时候注意要指定该方法允许哪些类型的消息。

根据RFC5766定义,音视频通讯经常使用的Stun Methods定义如下:

stun协议笔记一(stun格式简介)「建议收藏」

3)Message Length 字段存储了信息的长度,以字节为单位,不包括20字节的STUN头部。由于所有的STUN属性都是都是4字节对齐(填充)的,因此这个字段最后两位应该恒等于零,这也是辨别STUN包的一个方法之一。

4)Magic Cookie 字段包含固定值0x2112A442,这是为了前向兼容RFC3489,因为在classic STUN中,这一区域是事务ID的一部分。另外选择固定数值也是为了服务器判断客户端是否能识别特定的属性。还有一个作用就是在协议多路复用时候也可以将其作为判断标志之一

5)Transaction ID 字段是个96位的标识符,用来区分不同的STUN传输事务。对于request/response传输,事务ID由客户端选择,服务器收到后以同样的事务ID返回response;对于indication则由发送方自行选择。事务ID的主要功能是把request和response联系起来,同时也在防止攻击方面有一定作用。服务端也把事务ID当作一个Key来识别不同的STUN客户端,因此必须格式化且随机在0~2^(96-1)之间。重发同样的request请求时可以重用相同的事务ID,但是客户端进行新的传输时,必须选择一个新的事务ID。

2、STUN报文属性(attributes)

在STUN报文头部之后,通常跟着0个或者多个属性,每个属性必须是TLV编码的(Type-Length-Value)。其中Type字段和Length字段都是16位,Value字段为为32位表示,如下:

stun协议笔记一(stun格式简介)「建议收藏」

  • attributes的Type定义如下:

stun协议笔记一(stun格式简介)「建议收藏」

  • webrtc的代码定义:

stun协议笔记一(stun格式简介)「建议收藏」

  • wireshark抓包示例:

stun协议笔记一(stun格式简介)「建议收藏」

stun协议笔记一(stun格式简介)「建议收藏」

下面简要介绍几个常见属性的定义:

1)MAPPED-ADDRESS

MAPPED-ADDRESS用来表示NAT客户端的反射地址。

stun协议笔记一(stun格式简介)「建议收藏」

Family为IP类型,即IPV4(0x01)或IPV6(0x02),Port为端口,Address为32位或128位的IP地址。注意Family前面的高8位必须全部置零,而且接收端必须要将其忽略掉。

 

stun协议笔记一(stun格式简介)「建议收藏」

2)XOR-MAPPED-ADDRESS

和MAPPED-ADDRESS基本相同,不同点是反射地址部分经过了一次异或(XOR)处理。

stun协议笔记一(stun格式简介)「建议收藏」

对于X-Port字段,是将NAT的映射端口以小端形式与magic cookie的高16位进行异或,再将结果转换成大端形式而得到的,X-Address也是类似。

stun协议笔记一(stun格式简介)「建议收藏」

之所以要经过这么一次转换,是因为在实践中发现很多NAT会修改payload中自身公网IP的32位数据,从而导致NAT打洞失败。

3)ERROR-CODE

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

stun协议笔记一(stun格式简介)「建议收藏」

其中返回码定义:

stun协议笔记一(stun格式简介)「建议收藏」

300:尝试代替(Try Alternate),客户端应该使用该请求联系一个代替的服务器。这个错误响应仅在请求包括一个 USERNAME属性和一个有效的MESSAGE-INTEGRITY属性时发送;否则它不会被发送,而是发送错误代码为400的错误响应;
400:错误请求(Bad Request),请求变形了,客户端在修改先前的尝试前不应该重试该请求。
401:未授权(Unauthorized),请求未包括正确的资格来继续。客户端应该采用一个合适的资格来重试该请求。
420:未知属性(Unknown Attribute),服务器收到一个STUN包包含一个强制理解的属性但是它不会理解。服务器必须将不认识的属性放在错误响应的UNKNOWN-ATTRIBUTE属性中。
438:过期Nonce(Stale Nonce),客户端使用的Nonce不再有效,应该使用响应中提供的Nonce来重试。
500:服务器错误(Server Error),服务器遇到临时错误,客户端应该再次尝试。

stun协议笔记一(stun格式简介)「建议收藏」

其余的还有:

stun协议笔记一(stun格式简介)「建议收藏」

stun协议笔记一(stun格式简介)「建议收藏」

可以翻阅rfc5389协议15小节、RFC5766定义。

参考:

RFC5389

RFC3489

RFC5766

https://www.jianshu.com/p/227bb04179c8

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160528.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 微信定位精灵服务器或网络异常,微信定位精灵系统界面无法更新怎么办

    微信定位精灵服务器或网络异常,微信定位精灵系统界面无法更新怎么办我们在前几篇微博中讲到了如何开始使用微信定位精灵,点击这里传送门,如果需要序列号,可以参考这篇文章《微信定位精灵免费序列号赠送》而我们看到很多用户在使用的过程中遇到了一些这样或者那样的问题,在这里我们专门来解决一下这些问题。微信定位精灵地图界面不更新这是一个很多用户都会遇到的问题。根据我们这边的经验,但凡是遇到微信定位精灵地图界面不更新,无非是有这么几个原因:1、手机端当前无网络、或者信号不佳;2…

    2022年5月30日
    95
  • 前端游戏巨制! CSS居然可以做3D游戏了

    前端游戏巨制! CSS居然可以做3D游戏了前言偶然接触到CSS的3D属性,就萌生了一种做3D游戏的想法.了解过css3D属性的同学应该都了解过perspective、perspective-origin、transform-st…

    2022年5月7日
    53
  • 如何高效实现地图自动拼接功能设置_拼接屏控制软件通用吗

    如何高效实现地图自动拼接功能设置_拼接屏控制软件通用吗转自:http://www.gameres.com/491653.html介绍这篇文章提供了一个诸如RPG Maker、星际争霸关卡编辑器的自动拼接功能的算法和数据结构。当地图编辑器提供了这个功能

    2022年8月1日
    5
  • HeadFirstJava

    HeadFirstJavajava执行过程的来龙去脉源代码——编译器——输出——java虚拟机扩展名为.java——扩展名为.class不要直接用类名点变量来改变属性值,一般都用get、set方法。封装的基本原则:将你

    2022年7月2日
    23
  • BitBlt参数详解[通俗易懂]

    BitBlt参数详解[通俗易懂]对BitBlt()这个函数的最后一个参数的意义一直不是太了解,只会使用SRCCOPY,最近的一个项目使用到了这个函数,但是要求要背景透明的将源绘制到目标区域上,源是背景色和字,怎么只拷贝字而把背景色透明化呢??我的解决方法是,把源的背景色绘制为白色,字为黑色,然后在BitBlt的时候最后一个参数用SRCAND,果然可以达到我要的效果,这是为什么呢?呵呵趁此机会好好看看这个参数介绍吧~~开始之前,首先要明白,绘制其实就是在给每一个像素点涂颜色,每种颜色都是由红蓝黄三要素组合而成,因此通过RGB颜色值可以

    2022年10月18日
    0
  • 最佳程序员奖_程序员必读书籍排行榜

    最佳程序员奖_程序员必读书籍排行榜优秀的程序员需要有大量的知识技能储备,读书是获取知识的一个非常重要的途径。每每读到好书,会让人茅塞顿开、醍醐灌顶。以下图书,都可以称得上好书。你会推荐哪些给更广大的程序员呢?文末附有投票,每人可投5本你心中的好书,我们将从参与投票的网友中,选出5位,送上你心中的好书(5本全送哦)~~国外图书推荐C++Prinmer图书推荐理由C++学习头牌 C++领域专家:潘爱民、孟岩作序,代表技术圈鼎力推荐! 一线C++工程师腾讯Milo、微软刘未鹏、陈梓瀚、阿里..

    2022年9月30日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号