STUN代表通过网络地址转换器(NAT)对用户数据报协议(UDP)的简单遍历。通常,它用于几种不同的网络实现和方案,其中之一是在VoIP实现中。由于基于SIP的VoIP呼叫中使用的协议的工作方式,在NAT设备(如路由器或防火墙)后面运行的两个SIP实体之间进行呼叫(家庭和企业网络中的常见方案),用户通常会遇到几个问题,例如电话呼叫期间的单向音频或尝试注册到VoIP提供商或IPPBX时电话注册失败不驻留在同一网络上。STUN是一种协议,有助于解决此类VoIP实现中的问题。从v10开始,科能云电话系统在端口5060上充当STUN服务器。
1. STUN协议的用途
STUN协议的主要目的是使在NAT设备后面运行的设备能够发现其公共IP以及在其连接到的网关上运行的NAT类型。它还使网关后面连接的设备能够发现网关本身(NAT)完成的端口转换;即,其他设备可以使用哪个端口从网络外部连接到它。请注意,网关和路由器并不总是进行端口转换。这取决于它们正在运行的NAT类型及其配置方式。例如,完整的锥形NAT配置不会转换端口。STUN还可用于刷新NAT绑定;作为使用受限锥体NAT或端口受限锥体NAT时的保持活动机制。通过此类NAT配置传递流量时,内部地址和端口将映射到特定的外部地址和端口。但是,如果在特定时间(取决于设备的配置)后未使用此类地址转换,则会删除此类地址映射。因此,当内部设备尝试使用相同的内部IP和端口再次连接到外部实体(可能是以前连接到的同一实体)时,路由器仍将分配不同的地址映射,即与先前分配的IP和端口不同的IP和端口。
2. STUN协议
STUN是一种服务器-客户端协议。STUN服务器通常在TCP和UDP上运行,并在端口3478上进行侦听。客户端通常通过特定的IP和端口(3478)联系STUN服务器,但服务器可以提示客户端对备用IP地址和端口号执行测试,因为这样的端口和IP是任意的。3. STUN请求和响应方案
在下图中,我们可以看到典型的STUN请求和响应是如何工作的:
阶段2:网关(192.168.1.1)将请求转发到STUN服务器(64.25.58.65),并将端口5060更改为端口15060。
阶段3:STUN服务器(64.25.58.65)通过公共IP为212.128.56.125的网关将响应发送回计算机A,指定请求是从IP212.128.56.125和端口15060接收的
当计算机A建立会话时,例如与外部实体进行基于SIP的VoIP呼叫;它可以通知外部实体在IP212.128.56.125和端口15060上将响应发送回它。如上所述,STUN协议在帮助在配置有NAT的网络网关后面运行的两个设备建立UDP连接方面起着非常重要的作用。
STUN使在NAT后面运行的SIP实体能够发现其公共IP以及在其连接到的网关上运行的NAT类型。它还使SIP实体能够发现外部SIP实体可以连接到哪些端口,以建立连接。由于SIP使用UDP作为传输协议,而UDP不是面向连接的协议,因此根据传输协议,无法轻松建立2个SIP实体之间的连接,这就是为什么STUN在基于SIP的VoIP环境中广泛使用的原因。下面我们将看到基于SIP的VoIP电话的捕获,该电话尝试注册到在其网络外部运行的IPPBX,以及基于SIP的VoIP电话是否使用STUN协议会发生什么情况。STUN也有其缺点;它不能与使用对称NAT的网络正常工作,因为每次内部主机尝试连接到外部主机时,对称NAT都会创建新的地址和端口映射,因此STUN不是这种情况的良好解决方案。在下一篇文章中,我们将看到来自VoIP设备的STUN请求的示例捕获,并将解释它如何帮助解决VoIP环境中的连接建立问题。

在不使用STUN协议的情况下发送SIP消息
以下是SIP注册消息的捕获;在NAT后面运行的基于SIP的VoIP电话,该电话尝试注册为分机101,其IPPBX(侦听主机名voipproducts.org)在其网络外部运行,而无需使用STUN协议。
REGISTERsip:voipproducts.orgSIP/2.0
Via:SIP/2.0/UDP192.168.2.14:7214;branch=z9hG4bK-d8754z;rport
Max-Forwards:70
Contact::<sip:101@192.168.2.14:7214;rinstance=0639bae5043c66ac>
To:"account1"<sip:101@voipproducts.org>
From:"account1"<sip:101@voipproducts.org>;tag=0a75d76e
Call-ID:OTcxMDU5MGNhNTAxNzgzYjZkODVkY2I3MmE3NDhlNzQ.
CSeq:1REGISTER
Expires:3600
Content-Length:0
Fromtheabovewecanseethat:
Contact:<sip:101@192.168.2.14:7214;rinstance=0639bae5043c66ac>
在“联系人”字段中,我们可以看到基于SIP的VoIP电话正在指定自己的专用IP地址(192.168.2.14)和端口7214。因此,它请求其网络外部的远程IPPBX尝试通过将SIP消息发送回IP地址192.168.2.14和端口7214来建立连接。在这种情况下,IPPBX将尝试建立连接,但由于这是一个专用IP地址,因此它在互联网上不可路由,因此IPPBX尝试发送的响应通常由路由器或互联网网关丢弃。由于数据包被丢弃,因此无法建立连接。
STUN分辨率说明
如果基于SIP的VoIP电话启用了STUN解析并指定了STUN服务器,则VoIP电话会向STUN服务器发送STUN解析请求,并等待STUN服务器回复。此类请求通常在VoIP电话启动期间或在尝试与外部SIP实体通信之前完成。以下是典型STUN服务器响应的捕获:
MessageType:BindingResponse(0x0101)
MessageLength:0x0044
MessageTransactionID:E753D76EA857A24DA38A229F7576E18E
Attribute:MAPPED-ADDRESS
AttributeType:MAPPED-ADDRESS(0x0001)
AttributeLength:8
ProtocolFamily:IPv4(0x0001)
Port:6023
IP:78.158.143.115(78.158.143.115)
Attribute:SOURCE-ADDRESS
AttributeType:SOURCE-ADDRESS(0x0004)
AttributeLength:8
ProtocolFamily:IPv4(0x0001)
Port:3478
IP:10.252.131.113(10.252.131.113)
Attribute:CHANGED-ADDRESS
AttributeType:CHANGED-ADDRESS(0x0005)
AttributeLength:8
ProtocolFamily:IPv4(0x0001)
Port:3479
IP:75.101.138.128(75.101.138.128)
从上面我们可以看出:
MessageType:BindingResponse(0x0101)
MessageLength:0x0044
MessageTransactionID:E753D76EA857A24DA38A229F7576E18E
Messagetype:Thisfieldstatesthemessagetype;intheaboveexamplewecanseethatthisisaBindingresponsetotheBindingrequestsenttotheSTUNserverbytheVoIPphone.
MessageLength:Thisfieldstatesthemessagelengthinbytes.
MessageTransaction:ThisisauniqueidentifierusedforeachSTUNmessagebinding/responsesession.Foreachnewtransaction,anewuniqueidentifieriscreated.
Attribute:MAPPED-ADDRESS
AttributeType:MAPPED-ADDRESS(0x0001)
AttributeLength:8
ProtocolFamily:IPv4(0x0001)
Port:6023
IP:78.158.143.115(78.158.143.115)
上述属性称为“映射地址”;其目的是指示服务器在从基于SIP的VoIP电话发送的绑定请求中看到的源IP(来自上面的示例;78.158.143.115)和源端口(来自上面的示例;6023)。
Attribute:SOURCE-ADDRESS
AttributeType:SOURCE-ADDRESS(0x0004)
AttributeLength:8
ProtocolFamily:IPv4(0x0001)
Port:3478
IP:10.252.131.113(10.252.131.113)
上述属性称为“源地址”;其目的是指示是否正在使用两次NAT配置。从上面我们可以看到使用了两次NAT配置,因为VoIP电话的IP地址是192.168.2.14,接收绑定请求的公共IP是78.158.143.115,与STUN服务器联系的最后一个点接收STUN请求的IP地址是10.252.131.113。
AttributeType:CHANGED-ADDRESS(0x0005)
AttributeLength:8
ProtocolFamily:IPv4(0x0001)
Port:3479
IP:75.101.138.128(75.101.138.128)
上述属性称为“已更改地址”;其目的是指示如果客户端在“CHANGE-REQUEST”属性中请求“更改IP”和“更改端口”,则从中发送响应的IP地址和端口。
使用STUN协议发送SIP消息
以下是SIP注册消息的捕获;基于SIP的VoIP电话在NAT后面运行,尝试注册为分机101,并使用STUN协议在其网络外部运行的IPPBX(侦听主机名voipproducts.org)。
REGISTERsip:voipproducts.orgSIP/2.0
Via:SIP/2.0/UDP192.168.2.14:7214;branch=z9hG4bK-d8754z;rport
Max-Forwards:70
Contact:<sip:101@78.158.143.115:8676;rinstance=c82d2f5b1918e5cf>
To:"account1"<sip:101@voipproducts.org.com>
From:"account1"<sip:101@voipproducts.org>;tag=484b4e36
Call-ID:YWI3Y2I3ODIzOWIxYWI5NDQwMzA5ZTYxMTAzOTM4Y2I.
CSeq:1REGISTER
Expires:3600
Content-Length:0
Fromtheabovewecanseethat:
Via:SIP/2.0/UDP192.168.2.14:7214
VoIP客户端仍在侦听相同的内部IP地址(192.168.2.14)和相同的端口(7214)。
联系人:<留言:101@78.158.143.115:8676;rinstance=c82d2f5b1918e5cf>
在注册SIP消息的“联系人”字段中,VoIP电话将其自己的IP地址(192.168.1.14)替换为外部IP地址(78.158.143.115)和外部端口(8676),该地址是通过在尝试向外部IPPBX注册之前通过进行STUN解析发现的。由于STUN分辨率,现在IPPBX可以通过将SIP响应发送到端口8676上的IP地址78.158.143.115来与VoIP电话建立连接,该端口映射到NAT设备上的IP地址192.168.2.14和端口7214。
如上所述,由于基于SIP的VoIP呼叫中使用的大多数协议通常使用UDP作为传输协议,这是一种无连接协议,因此STUN在帮助在NAT后面运行的SIP实体建立基于SIP的VoIP呼叫方面起着非常重要的作用。