STUN client初试 (续)

原创 2011年02月16日 00:32:00


在完成了最基本STUN客户端功能(发送Binding request,接收Binding response)之后,做了一些测试.
之前一直纠结在 端口号为何 返回的 与其它软件的返回结果 有出入. 当中.
于是疑心四起,在怀疑了NAT修改,字节顺序 之后,不停地调试....
然后发现我用0x1111去& 某个值, 而事实是 ,我应该用 0xffff . ( 囧0z)
但之后所做的种种测试,让我 决定再写一篇 用来备忘 STUN协议应该注意的很多重要细节。
同时也希望能帮助更多 还没接触过该协议的人,我相信我的这些记录能帮助他们少走弯路.
首先说说我为什么怀疑NAT修改, 这就引出了一个替代RFC3489 的STUN协议 : rfc5389.
rfc5389 在第一页就以Session Traversal Utilities for NAT的缩写 重名名了 老的RFC3489 STUN 缩写,
老实说我严重怀疑这篇的起草人在凑名字 -- 他们希望 rfc5389代替RFC3489 所有东西.包括 STUN 缩写.
呵呵,当然是开玩笑.其实rfc5389 之所以从新定义STUN 缩写,主要是STUN 不再是p2p的完全解决方案。
正如描述:
 
而rfc5389 中描述的所谓的magic cookie (rfc3489bis-03中被加入)还有 XOR-MAPPED-ADDRESS Attribute(rfc3489bis-01中被加入)
即为了防止 某些手段较狠的NAT 对MAPPED-ADDRESS 的修改 .它的主要机制:
 
(通过把MAPPED-ADDRESS 用异或运算 的 映射方式 映射为XOR-MAPPED-ADDRESS 从而逃过 网关修改)
(注意异或运算是其自身的逆运算,所以我们再异或一下就可以得出真实的MAPPED-ADDRESS了)


早在rfc3489bis-01中就用这样一句话作为引入XOR-MAPPED-ADDRESS 的解释:
 
幸亏我 调试半天 得到的原因不是 NAT对报文的修改.不过我们 应该知道 存在这样的情况。 那么在 MAPPED-ADDRESS不对时
有助于注意到这个极有可能被忽略的原因.(所以塞翁失马焉只祸福 , 感谢我的0x1111)

其次,我不得不提醒所有刚开始着手客户端协议的童鞋:网上铺天盖地的STUN 名字其实 背后隐藏着 是 它有很多版本的事实 .
以后提到STUN 我们需要说明它所指的版本.
要命的是,现在网上能找到的很多公开STUN服务器地址,他们apply的STUN版本还很多是rfc3489bis-02 版的,
也就是说,rfc5389 早在08年就出来,‘问世’ 有3 年了 ,很多STUN服务器 还使用 2005 年的rfc3489bis-02.(或许这就是对标准的反应速度)
更要命的是,
期间的每一版本(我并没有全看 且 看得不很仔细) 发生了很多重要变化
(从整个名字的更换 和 对其本质定义彻头彻尾的改变就可以见一斑) ,有些重要的定义 刚出现
就被下一版所否定(如我后面将举到的 rfc3489bis-02中对0x8020的定义),而客户端需要理解attribute. 这就造成了很多对该属性的无所适从.
甚至怀疑返回的结果,和STUN服务器的正确性. 所以明白一些重要的细节 及 他们在各个版本中的区别 对于STUN 客户端开发者来说,个人认为十分重要.
现在就举rfc3489bis-01中的例子,我对8个公开STUN服务器做了测试:
 
可以发现只有 stun.iptel.org 和 stun.ideasip.com 没有返回 0x8020的attribute ,可以看出他们仍用着rfc3489bis-02的协议。
怎么证明呢??
因为仅仅独有rfc3489bis-02 对其定义了. 而且定义还出现失误,因为rfc3489bis-03立即对其进行了纠正:
 
所以我们要了解 这些服务器所使用的协议,就算他们没有用最新的协议.也可以推断出他遵循的版本.
从而对其返回结果作出正确的反应.
此外stun.iptel.org 和 stun.ideasip.com 返回的结果 中带有0x5 和 0x4这两个attribute .
所以也可以推断出他们使用的 版本 在rfc3489bis-04 之前 .因为rfc3489bis-04中描述与上一版的区别:
 
好,下一步就准备 对 MAPPED-ADDRESS 进行一些打洞试验了 ,我真的渴望取得成功的那一天 .
也希望这些细节对 他人有用, 这样就真没白写了.
By ga6840

 

WinStun 测试工具

  • 2014年05月31日 21:34
  • 1.83MB
  • 下载

免费的STUN服务器

当SIP终端在使用私有IP地址时,可能需要配置STUN服务器。 公开的免费STUN服务器有: stunserver.org stun.xten.com stun.fwdnet.net stun.wi...
  • MoSee
  • MoSee
  • 2017-08-23 01:00:18
  • 2146

高性能stun服务器搭建

项目中使用WebRtc,需要使用stun服务器,网上倒是有仁人志士共享了许多免费可用的stun服务地址,但是不知道稳定性如何, 所以提前预研了一下; 使用Stuntman搭建,地址:http://ww...
  • zhenzhen2014
  • zhenzhen2014
  • 2015-05-20 15:23:57
  • 5671

P2P在NAT和STUN

概述 本文主要讨论关于P2P通信的一些常见问题和解决方案。主要内容包含:P2P通信与网络设备的关系、不同的网络设备特征对P2P产生的影响、网络地址转换(NAT)的类型、NAT类型的检测方法、...
  • A1989A132
  • A1989A132
  • 2013-12-05 13:34:52
  • 6458

stun 客户端和服务器

  • 2016年03月11日 10:02
  • 2.26MB
  • 下载

STUN详解

STUN是一个简单的客户端 - 服务器协议。客户端发送一个请求到一台服务器,而服务器返回一个响应。 有两种类型的请求: 绑定请求(通过UDP发送)和共享密钥请求(发送TLS (通过TCP)) 。 ...
  • lp525110627
  • lp525110627
  • 2016-11-26 16:11:01
  • 1967

关于stun学习笔记1

STUN的全称是Simple Traversalof UDP Through Network Address translators,即UDP对NAT的简单穿越方式。应用程序(即STUN CLIENT...
  • cybertan
  • cybertan
  • 2010-03-23 09:46:00
  • 2047

P2P通信标准协议(一)之STUN

前一段时间在P2P通信原理与实现中介绍了P2P打洞的基本原理和方法,我们可以根据其原理为自己的网络程序设计一套通信规则, 当然如果这套程序只有自己在使用是没什么问题的。可是在现实生活中,我们的程序往...
  • Runningzyx
  • Runningzyx
  • 2016-11-16 11:04:59
  • 1814

webrtc客户端与TURN和信令服务器通讯流程图

WebRTC是HTML5支持的重要特性之一,有了它,不再需要借助音视频相关的客户端,直接通过浏览器的Web页面就可以实现音视频对聊功能。而且WebRTC项目是开源的,我们可以借助WebRTC源码快速构...
  • xyblog
  • xyblog
  • 2016-01-14 09:41:22
  • 7101
收藏助手
不良信息举报
您举报文章:STUN client初试 (续)
举报原因:
原因补充:

(最多只允许输入30个字)