WebRTC调试上篇:定位问题和调试工具

调试 WebRTC 可能是一项艰巨的任务。有很多部分都处于运行状态,每一个部分都可能出现问题。如果你不够细心,可能会浪费数周的时间来查看错误的模块。当你最终找到出错的部分时,你还需要学习一些知识才能理解问题的根源。

WebRTC调试上篇:定位问题和调试工具

本章将带你学习 WebRTC 的调试。它将向你展示如何分析并定位相关问题。确定问题后,我们将快速介绍一下流行的调试工具。

分解问题

开始调试时,你需要先分解问题的源头。从以下题目开始:

信令故障

网络故障

使用 netcat 测试你的 STUN 服务器:

  1. 准备 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。
  2. 发送请求并等待 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 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论