Advertisement

stun 协议

阅读量:

stun存在的意义就是进行nat穿越。
上述这句话是对于stun客户端来说的。
对于客户端来说,客户端首先要发送一个stun消息给到stun服务,stun服务收到这个消息,将发送这个消息的客户端ip地址和端口带回来(过nat为外网,不过为内网地址)。此时客户端即知道自己的外网地址了,当客户端与另外一端进行通讯的时候,通过candiate的交换,就可以将自己的外网地址告诉对方,当对方拿到这个外网地址,就可以进行nat穿越了。

stun对于流媒体服务端的作用是在客户端发送stun请求时候带来用户名和密码,用户名和密码实际是交换sdp信息的时候客户端从服务器得到的。客户端stun请求带上用户名和密码实际上表明此客户端之前进行过sdp信息交换的,是一个合法用户。只有你是合法用户,服务器才允许进行后续的数据收发,否则服务直接断开连接。

客户端主要使用stun进行p2p通讯,而服务端主要用来验证身份。

stun是典型的客户端服务器模式,客户端发送请求,服务端进行响应。

stun协议规范:RFC3489 RFC5389。

stun报文:
包括20字节的stun header。
body中可以有0个或者多个Attribute。
在这里插入图片描述
通过magic cookie就可以确定是否是stun消息。
请求和回复消息通过transaction id来确认,回复要和请求的此id一致,请求端才能知道回复哪条请求。请求与响应事物id是相同的。
message len长度不包括数据头的长度,只是纯数据的长度。
stun mesaage type:
stun头前两位必须是00,以区分复用同一端口时stun协议。
2位用于分类,即c0和c1。
12位用于定义请求/指示。
在这里插入图片描述
16进制的0b00表示一个请求。因为c1是1,c0是
0。
0b01表示一个指示。
0b10表示请求成功的响应。
0b11表示请求失败的响应。c0c1是11表示回复。
在这里插入图片描述
上图c1c0为00,10,11,为消息类型。

大小端:
大端是数据的高字节保存在内存的低地址中。
小端是数据的高字节保存在内存的高地址中。

网络字节序:采用大端的排序方式。
在这里插入图片描述
低字节存在高地址。大端和网络字节序保持一致。
在这里插入图片描述
magic cookie为0x2112a442,看到这个消息即为stun消息。
老的stun协议是128bit,16字节都是transaction id,没有magic cookie。

stun message body如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最为关注的两个消息是0x0006和0x0007这两个属性。因为流媒体服务器与客户端进行连接的时候,实际客户端是通过sdp消息获取服务端给客户端分配的用户名和密码。当客户端进行验证的时候,客户端会发一个stun 请求过来,stun请求中会把这个用户名和密码带上来,服务端会进行验证。
在这里插入图片描述
其中m是必须,n/a是可带可不带,o是可选。
例如第一个属性mapped-adsress,binding req,可带可不带,因为stun服务端会返回这个属性(所以binding rsp中该属性为必须的),客户端的请求里无所谓。

全部评论 (0)

还没有任何评论哟~