STUN协议和VoIP

更新时间:2022-08-15

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请求和响应是如何工作的:
stun_voip
阶段1:计算机A通过网关192.168.1.1向网络外部的STUN服务器发送STUN请求,使用源端口5060侦听64.25.58.65。
阶段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的网络正常工作,因为每次内部主机尝试连接到外部主机时,对称NAT都会创建新的地址和端口映射,因此STUN不是这种情况的良好解决方案。在下一篇文章中,我们将看到来自VoIP设备的STUN请求的示例捕获,并将解释它如何帮助解决VoIP环境中的连接建立问题。

STUN使在NAT后面运行的SIP实体能够发现其公共IP以及在其连接到的网关上运行的NAT类型。它还使SIP实体能够发现外部SIP实体可以连接到哪些端口,以建立连接。由于SIP使用UDP作为传输协议,而UDP不是面向连接的协议,因此根据传输协议,无法轻松建立2个SIP实体之间的连接,这就是为什么STUN在基于SIP的VoIP环境中广泛使用的原因。下面我们将看到基于SIP的VoIP电话的捕获,该电话尝试注册到在其网络外部运行的IPPBX,以及基于SIP的VoIP电话是否使用STUN协议会发生什么情况。
STUN传输图示
在不使用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呼叫方面起着非常重要的作用。

下一篇

开源SIP服务器你了解多少

通信系统集成

开源SIP服务器你了解多少

SIP服务器是促进基于互联网的电话的重要工具。它将您公司的IPPBX连接到互联网电话服务提供商(ITSP)。SIP开源服务器允许您以低成本创建自己的服务器,这与许多商业替代方案不同。 ...

相关内容

SDP对SIP是支撑是主导?还是相互协同?

SDP对SIP是支撑是主导?还是相互协同?

在探讨SIP协议时,我们不得不提到其重要的配套协议——S......

最新动态

2025-01-24

SMPP协议中的核心概念,您真的理解吗?

SMPP协议中的核心概念,您真的理解吗?

SMPP协议(Short Message Peer-to-Peer Protoc......

最新动态

2025-01-21

SIP协议音柱能兼容哪些遵循SIP协议的设备?

SIP协议音柱能兼容哪些遵循SIP协议的设备?

SIP协议是一种 应用层控制协议 ,主要用于建立、修改和终止多媒体会话,如Int......

最新动态

2025-01-16