使用 Wireshark 揭示 VoIP 问题
供应商会让你相信,你需要花费数千美元购买协议分析器软件来排除 Voice over IP (VoIP) 网络的故障。毕竟,如果数据包延迟、丢失或乱序,语音质量会受到影响。幸运的是,Wireshark 是一款开源软件包,它可以完成这些工具的所有功能,甚至更多。
Wireshark,以前称为 Ethereal,是一款网络协议分析器。它的工作是监听网络流量,以有意义的格式显示它,然后帮助你找到问题。VoIP 涉及一套复杂的协议,Wireshark 可以解码这些协议并将它们相互关联。例如,建立呼叫的过程与语音流量本身使用的协议不同。Wireshark 使用来自呼叫建立的信息来更好地理解语音流。有了这些数据,您就可以隔离 VoIP 问题的根源。
要找到 VoIP 问题的根源,您必须能够跟踪从开始到结束的呼叫流程,并确保发生正确的事件。这需要理解底层协议和一些电话概念。幸运的是,Wireshark 提供了一些优秀的工具来帮助解释数据。本文的其余部分将重点介绍如何使用 Wireshark 的工具来解决三个常见的 VoIP 问题。
第一个例子是一个无法工作的电话——每次拨号时,电话都会空闲,并且听筒中听不到任何铃声。这里使用 Wireshark 来查看电话和 PBX 之间的流量。
以 root 身份启动 Wireshark,然后选择“捕获”→“选项”以打开“捕获选项”对话框,如图 1 所示。确保正在使用正确的接口;否则,您将看不到流量。在本例中,我正在 PBX 的唯一接口 eth0 上捕获流量。
在捕获之前,您可以选择指定捕获过滤器来限制您需要处理的数据包数量。由于信令流量 (SIP) 和语音流量 (RTP) 都是基于 UDP 的,因此我指定 udp 作为捕获过滤器。为了方便起见,我还选中了“实时更新数据包列表”选项,以便我可以验证我是否获得了正确的流量。单击“开始”按钮开始捕获,很快上部窗格将显示几个数据包(图 2)。
图 2 显示了数据包列表。前四列显示数据包编号、时间和所涉及主机的地址。由于 Wireshark 理解 SIP,因此它能够将数据包识别为协议列中的 SIP,并在信息列中提供详细信息。
粗略检查图 2 中的信息表明,相同的三个数据包重复了四次。首先,ipphone 主机向 pbxhost 发送 SIP INVITE 消息,该消息用于打开对话。接下来,PBX 响应“407 Proxy Authentication Required”,电话以 ACK 响应,然后在数据包 6 中再次尝试。由于此过程不断重复,因此很可能电话正在尝试使用错误用户名和密码进行身份验证。
监控:一切都与位置有关
如果您要查找的某些数据包未到达运行 Wireshark 的机器的网络接口,则说明您遇到了问题。交换网络的设计目的是将流量限制为仅与通信相关的端口,以提高性能。生成树和 IP 路由只会使确定探针放置位置的问题变得复杂。
最好的办法是在涉及的机器之一上直接捕获流量。如果您无法在该机器上安装 Wireshark(它也可以在 Windows 上运行),您始终可以使用 tcpdump 在本地捕获流量,并将跟踪记录发送到另一台机器进行分析。如果这不可行,或者流量跨越多台机器,则需要从您的网络硬件寻求帮助。
大多数托管交换机都提供一项功能,可以将一个接口的所有帧镜像到另一个接口。因此,您可以将 Wireshark 工作站插入具有 Internet 连接的交换机端口,将来自 Internet 路由器的所有流量镜像到您的工作站,并且您将能够分析所有 Internet 流量。思科称之为交换端口分析器或 SPAN,惠普称之为监控端口,而 3Com 称之为漫游分析端口。
要镜像哪个端口取决于您的网络,但通常,连接到其他交换机或路由器的端口是一个不错的选择。这也是捕获过滤器有助于减少您必须处理的背景噪声的地方。
第一个示例利用 Wireshark 对单个数据包的高级解释来帮助突出显示一个简单的问题。下一个示例需要对 VoIP 呼叫进行更全面的查看。在这里,Wireshark 用于查看 SIP 呼叫建立,然后识别关键数据包。在本例中,一部电话正在经历单向音频。拨出的电话会响铃并被接听,但只有一方听到音频。会话的捕获方式与上一个示例相同,产生了 140 个帧。这太多了,无法在没有帮助的情况下查看,因此使用了一些 Wireshark 的高级分析工具。
加载捕获后,选择“统计”→“VoIP 呼叫”。Wireshark 分析捕获中是否有任何与 VoIP 相关的数据包,并在屏幕上提供摘要。单击呼叫(如果显示多个呼叫,请按住 Ctrl 键选择其他呼叫),然后单击“图形”按钮。您将看到 SIP 呼叫的摘要,如图 3 所示。
“图形分析”对话框显示了各方发送的 SIP 消息。图 3 中的第一个消息是 INVITE 消息,这是建立呼叫的第一步。在本例中,IP 电话正在请求 PBX 向 sip:613@fwd.pulver.com 的 SIP 地址拨打电话,这是一个由 Free World Dialup 提供的用于测试 SIP 呼叫的回声服务。对此的响应是身份验证请求,该请求已得到确认。电话再次尝试,PBX 给出了“正在尝试”的状态。然后,PBX 继续通过联系 fwd.pulver.com 来 INVITE 远程端点。在正确建立呼叫之前,还会交换更多消息。
手头的问题是单向音频。实际上,“图形分析”窗口显示 IP 电话已将实时协议 (RTP) 语音数据发送到 Internet 上的 SIP 端点,但它未显示反向流。要确定为何未发送回音频,需要更深入地读取 SIP 数据包。
SIP 的工作之一是在两个端点之间建立 RTP 流。它通过会话描述协议 (SDP) 来完成此操作,SDP 携带有关编解码器、IP 地址和端口号的信息,这些信息对于 VoIP 工作是必需的。请注意,说 SDP 的端点不必是相互通话的端点!在图 3 中,pbxhost 和 fwd.pulver.com 正在通过 Internet 进行协商,但它们各自指定了不同的端点来终止语音呼叫。RTP 流是单向的,因此全双工会话需要在每个方向上建立单独的 RTP 流,使用两个单独的 SDP 消息。
考虑到这一点,找出从 pbxhost 发送到 fwd.pulver.com 的 SDP 信息似乎是明智的。此 SDP 消息将包含远程端点用于与本地 IP 电话通话的 IP 地址、UDP 端口和编解码器。SDP 消息在“图形分析”窗口中标记为 SDP,以帮助您发现它们。此数据包在图 3 中的偏移量为 0.490。当您在“图形分析”窗口中单击消息时,主 Wireshark 窗口的数据包列表窗格中会突出显示相应的数据包。
除了在数据包列表窗格中提供数据包摘要外,Wireshark 还在数据包详细信息窗格中解码当前选定数据包中包含的协议。解码针对每个层进行分隔,例如以太网、IP、UDP 和 SIP。您可以通过单击窗口左侧的箭头来深入研究这些字段。图 4 显示了上面来自包含一些相关字段的 SDP 消息。
SDP 消息中的每一行都描述了要创建的会话的特定属性,并遵循简单的 attribute=value 格式,其中 attribute 是单个字母,value 是文本字符串。Wireshark 利用其对协议的理解来添加一些额外的文本,例如属性的描述。对于 VoIP 会话,重要的属性是
a—属性,例如编解码器和静音抑制。
c—连接信息,包括期望 RTP 流的 IP 地址。
m—媒体描述,包括 RTP 端点将监听的端口号。
从连接信息 (c) 行中,您可以确定发送的主机是 192.168.1.151。m 属性指定 RTP 流预计在端口 34008 上。查看属性,提供了 PCM u-law 和 a-law 编解码器,以及压缩的 GSM 格式和通过电话事件媒体格式的触摸音。此产品的问题在于 IP 地址 192.168.1.151 是一个私有地址,无法从 Internet 访问。当远程主机尝试向 192.168.1.151 发送数据包时,数据包将丢失,因为 Internet 上不存在此类路由。
为了完整起见,会话另一侧的 SDP 信息位于时间 7.554。在确认提供后,两部电话开始向较早 SDP 消息中指定的地址和端口发送语音数据包。由于 pbxhost 向 fwd.pulver.com 提供了无效地址,因此永远看不到语音呼叫的另一半。
这说明了通过 NAT 网关使用 VoIP 时的常见问题。该问题可以通过多种方式解决,具体取决于一个人的需求,但那是另一篇文章的内容了!
到目前为止,故障排除的重点是 VoIP 的呼叫信令方面。一旦端点开始发送 RTP 流,就可以在音频中听到网络质量的影响。
影响 VoIP 的网络条件是延迟、抖动和数据包丢失。延迟是数据包从 A 点传输到 B 点所花费的时间。抖动是一系列数据包延迟的变化。丢失是从 A 点发送但从未到达 B 点的数据包数量。由于 VoIP 音频是通过实时 UDP 发送的,因此如果排在它前面的数据包已被播放,则乱序到达的数据包必须被丢弃。
对于最后一个示例,我拨打了一个电话并捕获了包括呼叫建立在内的会话。Wireshark 使用 SIP 信息来获取有关 RTP 数据包流的更多详细信息,这使得可以使用 RTP 分析工具。
选择“统计”→“RTP”→“显示所有流”。Wireshark 使用解码后的数据包来提供所有音频会话的列表和一些基本统计信息,如图 5 所示。
图 5 显示了四个流,因为每个音频流都包含两个相反方向的流,并且 PBX 正在桥接两部电话之间的连接。出现问题的第一个迹象是最后一个字段,当存在与 VoIP 相关的问题时,该字段会显示 X。该流的最大增量(延迟)为 84 毫秒,这很好。最大抖动也很好,为 11 毫秒(单向延迟 150 毫秒和抖动 20 毫秒是可接受的限制)。但是,遇到了近 20% 的数据包丢失,这非常惊人!
通过单击有问题的流来选择它以进行进一步分析。之后,单击“查找反向”按钮以选择会话的另一半。最后,单击“分析”以提供数据包到数据包的流查看。丢失的数据包将显示为具有错误的序列号。此屏幕如图 6 所示,还显示了有用的统计信息,例如当前带宽、延迟和抖动。
图 6 清楚地显示了一些网络问题,因为数据包丢失是不正常的。(稳定的带宽和有规律的数据包丢失是网络设备中优先级队列溢出或策略实施的有力指标。)这种丢失不会在反方向上看到,因为捕获是在会话源附近进行的。您可以使用“保存 CSV”按钮保存窗口的内容。
网络问题更难解决,因为它们需要与网络设备交互,并且可能需要与其他方交互。如果您的 VoIP 环境不使用 Internet,则可以在网络上的各个点捕获数据包,以找到引入不良条件的位置。如果呼叫通过 Internet 流动,您必须调查您与 Internet 的连接,并可能与您的运营商合作。
RTP 分析可以与专有系统一起使用,但需要进行一些额外的配置。如果 Wireshark 不理解信令,它将无法解码所有 RTP 信息。选择“编辑”→“首选项”→“协议”→“RTP”,然后选中“尝试在会话外部解码 RTP”框。分析速度会稍慢,但 Wireshark 将尝试确定每个 UDP 数据包是否属于 RTP 流,从而允许您使用 RTP 工具来查看呼叫。
我们在此处检查的最后一个功能是收听语音呼叫内容的能力。在“流分析”窗口仍然打开的情况下,选择“保存有效负载”按钮,选择 .au 文件格式,然后提供文件名。按下“确定”按钮后,语音呼叫本身将保存到您的硬盘驱动器。可以使用 XMMS、soxplay 或其他一些音频程序播放生成的文件。
VoIP 故障排除与大多数其他网络故障排除不同,因为存在单独的信令和语音协议,以及语音流量的实时性质。这三个示例展示了 Wireshark 的重要功能,这些功能专门用于分析 SIP 呼叫建立和 RTP 语音流。这些功能可以与商业产品相媲美,使您能够找到 VoIP 问题的根源。
资源
Wireshark: wireshark.org
电信术语和概念: www.oreillynet.com/pub/a/etel/2006/02/07/telecom-terms-and-concepts.html
Sean Walberg 是来自加拿大温尼伯的网络工程师,并且从事 VoIP 工作多年。您可以在 ertw.com 访问他。