微信通话wireshark分析
在微信等实时通讯应用中,视频通话的实现一般会采用点对点(peer-to-peer, P2P)通信,但并不总是直接设备间通信。具体通信方式取决于网络环境、NAT(网络地址转换)类型、网络拓扑结构以及应用实现。
- 点对点通信(P2P):在理想情况下,如果双方都可以直接建立连接,那么视频通话会采用P2P模式。这种模式下,音视频数据直接在两台设备之间传输,延迟较低,传输效率高。通常需要使用STUN(Session Traversal Utilities for NAT)协议来穿越NAT,发现彼此的公共IP地址和端口。
- 中继服务器通信:在某些网络环境下,如严格的NAT或防火墙配置阻止了直接连接,P2P通信可能无法建立。这时,应用会使用中继服务器(TURN,Traversal Using Relays around NAT)来转发音视频数据。TURN服务器充当中间代理,接受来自一台设备的音视频数据,并将其转发给另一台设备。
- 混合模式:应用通常会尝试首先使用P2P通信,如果失败则回退到使用中继服务器。这种方式结合了P2P的低延迟和中继服务器的稳定性。
虽然微信通话的具体的实现细节是微信的商业秘密,但可以根据一般的实时通讯技术推测微信通话可能采用的技术为WebRTC技术:
- 建立连接:使用信令服务器(例如通过WebSocket或其他协议)来协调和建立通话连接,交换必要的元数据和连接信息。
- NAT穿越:使用STUN服务器来发现和共享设备的公共IP和端口,尝试建立直接的P2P连接。
- 使用中继服务器:如果P2P连接失败,回退到TURN服务器进行中继通信,确保通话可以正常进行。
通过wireshark抓包软件,查看微信在进行音视频通信时所使用的各层协议
应用层
信令协议:
WebSocket:用于建立和管理实时连接,传输信令数据(如通话邀请、ICE候选、SDP信息等)。
SIP(Session Initiation Protocol):用于建立、修改和终止会话,常用于VoIP。
媒体传输协议:
RTP(Real-time Transport Protocol):用于传输音视频数据,支持实时性要求高的应用。
RTCP(RTP Control Protocol):与RTP配合使用,提供传输统计和控制信息。
NAT穿越协议:
STUN(Session Traversal Utilities for NAT):用于发现设备的公共IP地址和端口,帮助建立P2P连接。
TURN(Traversal Using Relays around NAT):用于中继数据,通过中继服务器传输音视频数据,解决NAT穿越问题。
传输层
UDP(User Datagram Protocol):
RTP/UDP:RTP通常基于UDP传输,提供低延迟的实时传输。
STUN/UDP:STUN协议通常也基于UDP传输。
TCP(Transmission Control Protocol):
WebSocket/TCP:WebSocket协议基于TCP,提供全双工通信通道。
HTTP/TCP:用于初始信令和连接建立(例如通过HTTP进行WebRTC信令交换)。
网络层
IP(Internet Protocol):
IPv4:传统的IP协议版本。
IPv6:新一代IP协议,提供更大的地址空间和一些改进的功能。
数据链路层和物理层
数据链路层和物理层:这些层使用的协议和技术根据底层网络(如以太网、Wi-Fi、LTE等)而不同,负责将数据帧传输到网络介质上。
应用层:
+-------------------------------+
| 信令协议(WebSocket) |
| 媒体传输协议(RTP/RTCP) |
| NAT穿越协议(STUN/TURN) |
+-------------------------------+
传输层:
+-------------------------------+
| UDP/TCP |
+-------------------------------+
网络层:
+-------------------------------+
| IP |
+-------------------------------+
数据链路层和物理层:
+-------------------------------+
| 以太网/Wi-Fi/LTE等 |
+-------------------------------+
而微信在发送普通消息时各层使用的协议:
+-------------------------------------------------+
| 应用层 |
| - 微信私有协议 |
+-------------------------------------------------+
| 传输层 |
| - TCP (Transmission Control Protocol) |
+-------------------------------------------------+
| 网络层 |
| - IP (Internet Protocol) |
+-------------------------------------------------+
| 数据链路层 |
| - 以太网 (Ethernet) 或 Wi-Fi (IEEE 802.11) |
+-------------------------------------------------+
| 物理层 |
| - 电缆, 光纤, 无线电波 |
+-------------------------------------------------+
从上面可以看到,微信可以同时使用TCP协议来传输普通消息以及音视频通话时的控制信令;
传统QoS分类器的分类方法
+-----------------------------+
| 数据包到达路由器 |
+-----------------------------+
|
v
+-----------------------------+
| QoS分类器检查协议字段 |
| 源IP、目的IP、端口号等 |
+-----------------------------+
|
v
+-----------------------------+
| 分类到不同类别 |
| (视频通话、高优先级) |
| (文本信息、低优先级) |
+-----------------------------+
|
v
+-----------------------------+
| 应用QoS策略 |
| (优先级排队、带宽限制) |
+-----------------------------+
|
v
+-----------------------------+
| 数据包继续传输 |
+-----------------------------+
在很多情况下,传统的QoS分类方法通过五元组方法来区分不同的传输层协议(如TCP和UDP),然后将数据包放入相应的队列中。这种方法对于简单的流量分类和管理是有效的。然而,随着网络流量的复杂性增加和现代应用的多样化,传统方法在某些情况下可能不足以提供精确的流量管理和分类。
例如:
- 对于一个应用来说,可能会同时使用TCP协议传输多种不同类型的数据,例如微信视频通话中的控制信令和其他数据。五元组无法区分这些不同用途的TCP流量,因为它们可能共享相同的五元组特征。而对于QoS管理而言,区分音视频通话信令和其他数据具有非常重要的意义:
- 信令数据:通常需要高优先级,因为信令数据是控制和管理通信的关键数据,确保其可靠传输和低延迟对整个通信过程至关重要。例如,视频通话的呼叫建立、挂断、会话控制等信令数据必须优先处理,以确保通信的稳定和可用性。
- 媒体数据:通常需要中高优先级。实时音视频数据(如视频通话中的视频和音频流)要求低延迟和高吞吐量,以确保良好的用户体验。虽然这些数据对少量丢包的容忍度较高,但需要快速传输以避免延迟和卡顿。
- 普通数据:通常可以设置为低优先级。普通数据(如电子邮件、文件下载、网页浏览等)对延迟和少量丢包的容忍度较高,这些数据传输的及时性要求不如信令数据和媒体数据高,因此可以分配较低的优先级。
- 现代应用程序广泛使用加密协议(如HTTPS),使得五元组无法提供有关具体应用类型或数据内容的足够信息。五元组只能识别到传输层,而无法进一步区分加密流量中的具体内容。
总结
因此我们需要更新颖的方法来实现对于业务流量的切分;