调试 WebRTC 可能是一项艰巨的任务。有很多部分都处于运行状态,每一个部分都可能出现问题。如果你不够细心,可能会浪费数周的时间来查看错误的模块。当你最终找到出错的部分时,你还需要学习一些知识才能理解问题的根源。
本章将带你学习 WebRTC 的调试。它将向你展示如何分析并定位相关问题。确定问题后,我们将快速介绍一下流行的调试工具。
分解问题
开始调试时,你需要先分解问题的源头。从以下题目开始:
信令故障
网络故障
使用 netcat 测试你的 STUN 服务器:
- 准备 20 字节的绑定请求数据包:
echo -ne "\x00\x01\x00\x00\x21\x12\xA4\x42TESTTESTTEST" | hexdump -C 00000000 00 01 00 00 21 12 a4 42 54 45 53 54 54 45 53 54 |....!..BTESTTEST| 00000010 54 45 53 54 |TEST| 00000014
解释:00 01
是消息类型。00 00
是数据段的长度。21 12 a4 42
是 magic cookie。54 45 53 54 54 45 53 54 54 45 53 54
(解码成 ASCII 就是TESTTESTTEST
) 是 12 字节的 transaction ID。
- 发送请求并等待 32 字节的响应:
stunserver=stun1.l.google.com;stunport=19302;listenport=20000;echo -ne "\x00\x01\x00\x00\x21\x12\xA4\x42TESTTESTTEST" | nc -u -p $listenport $stunserver $stunport -w 1 | hexdump -C 00000000 01 01 00 0c 21 12 a4 42 54 45 53 54 54 45 53 54 |....!..BTESTTEST| 00000010 54 45 53 54 00 20 00 08 00 01 6f 32 7f 36 de 89 |TEST. ....o2.6..| 00000020
解释:01 01
是消息类型。00 0c
是数据段的长度,解码后是十进制的 12。21 12 a4 42
是 magic cookie。54 45 53 54 54 45 53 54 54 45 53 54
(解码成 ASCII 就是TESTTESTTEST
)是 12 字节的 transaction ID。00 20 00 08 00 01 6f 32 7f 36 de 89
是 12 字节的数据,解释:00 20
是类型:XOR-MAPPED-ADDRESS
。00 08
是 value 段的长度,以十进制解码就是 8。00 01 6f 32 7f 36 de 89
是数据值,解释:00 01
是地址类型(IPv4)。6f 32
是经过 XOR 映射的端口。7f 36 de 89
是经过 XOR 映射的 IP 地址。
解码 XOR 映射的部分很麻烦,但是我们可以通过提供设置为 00 00 00 00
的(无效)伪 magic cookie 来诱骗 stun 服务器执行伪 XOR 映射:
stunserver=stun1.l.google.com;stunport=19302;listenport=20000;echo -ne "\x00\x01\x00\x00\x00\x00\x00\x00TESTTESTTEST" | nc -u -p $listenport $stunserver $stunport -w 1 | hexdump -C
00000000 01 01 00 0c 00 00 00 00 54 45 53 54 54 45 53 54 |........TESTTEST|
00000010 54 45 53 54 00 01 00 08 00 01 4e 20 5e 24 7a cb |TEST......N ^$z.|
00000020
对伪 magic cookie 的 XOR 运算是幂等的,因此响应中的端口和地址将是清楚的。这并非在所有情况下都有效,因为某些路由器会操纵传递的数据包,伪装 IP 地址。如果我们查看返回的数据值(最后八个字节):
00 01 4e 20 5e 24 7a cb
是数据值,解释:00 01
是地址类型(IPv4)。4e 20
是映射的端口,解码成十进制就是 20000。5e 24 7a cb
是 IP 地址,解码成点分十进制表示法就是94.36.122.203
。
用到的工具
netcat (nc)
netcat 是用于使用 TCP 或 UDP 读取和写入网络连接的命令行网络实用程序。通常它可以用 nc
命令来调用。
tcpdump
tcpdump是一个命令行数据网络数据包分析器。
常用命令:
- 捕获与端口 19302 之间的 UDP 数据包,并打印数据包内容的十六进制转储:
sudo tcpdump 'udp port 19302' -xx
- 与上一条相同,但将数据包保存在 PCAP(数据包捕获)文件中以供以后检查
sudo tcpdump 'udp port 19302' -w stun.pcap
可以使用 wireshark GUI 打开 PCAP 文件:wireshark stun.pcap
wireshark
wireshark 是一个使用广泛的网络协议分析器
webrtc-internals
Chrome 内置了一个 WebRTC 指标数据页面 chrome://webrtc-internals 。
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。