一、整体概述
RTCStatsReport的candidate-pair/remote-candidate/local-candidate这三组参数配合,用来获取当前链接的IP地址信息。下图示例参数就是由这三组参数配合获取的。
二、具体实现
这三组参数是通过candidate-pair->id找到对应的映射关系。如下图所示:
candidate-pair里面的localCandidateId和remoteCandidateId对应remote-candidate和local-candidate的ID。根据这个,我们就能找到本端和远端的详细网络地址信息。
三、参数详解
1、candidate-pair
参数名 | 参数含义 | 备注说明 |
transportId | 远端和本端候选项ID组合 | |
localCandidateId | local-candidate的ID | |
remoteCandidateId | remote-candidate的ID | |
state | ICE探测状态 | 参见IceCandidatePairState定义 |
priority | 优先级 | |
nominated | 是否提名 | |
writable | 是否可以发包 | |
readable | 是否可以收报 | |
bytesSent | 发送报文字节数 | |
bytesReceived | 接收报文字节数 | |
totalRoundTripTime | 总环路延时时长 | |
currentRoundTripTime | 当前RTT环路延时时长 | |
availableOutgoingBitrate | 发送报文带宽 | |
availableIncomingBitrate | 接收报文带宽 | |
requestsReceived | 发送stun ping响应字节数 | |
requestsSent | 发送stun ping请求次数 | |
responsesReceived | 接收stun ping响应字节数 | |
responsesSent | 接收stun ping响应次数 |
在实际运行中,RTCStatsReport可能生成多条candidate-pair,至于我们到底选中的是哪条ICE路径,需要根据state、writable、readable、bytesSent、bytesReceived、availableOutgoingBitrate来判断。
其中最重要的是availableOutgoingBitrate字段。state、writable、readable表示探测状态,当我们有N个coturn服务器的时候,有可能多条路径都可以探测成功。bytesSent、bytesReceived表示已经发送接收报文个数,但是当有更优路径切换的时候,旧的路径这个值也可能不为0。而只有availableOutgoingBitrate是在当前选中路径下才有的字段。参见RTCStatsCollector::ProduceIceCandidateAndPairStats_n函数实现:
四、关于远端和本端IP地址信息
介绍IP地址之前,首先介绍一下coturn中继的工作原理。A端与外界通讯有三种方式:
1)局域网直连。可以使用168.168.5.34:55055与本局域网其他IP地址通讯。
2)公网通讯,并且可以NAT打洞出去,可以直接使用112.112.130.120:26409与外界进行通讯。
3)公网通讯,但不能NAT打洞出去的,需要使用中继128.10.150.101:55077与外界通讯。
RTCStatsReport之candidate-pair/remote-candidate/local-candidate配合显示的IP地址是,在本次通讯中,您可以通过哪种方式联系到我。CandidateType也是我通过什么方式与外界通讯。
可能是host的168.168.5.34:55055,可能是prflx的112.112.130.120:26409,也有可能是relay的128.10.150.101:55077
示例一:A需要中继,B可以直连情况
站在A侧,他的本端IP地址和端口号是中继地址128.10.150.101:55077,因为在外看来只有这个IP和端口,才能找到A。A的远端IP地址和端口号是B外网映射地址112.112.130.150:13409。A侧显示的CandidateType为relay。因为A是通过中继进出的。
站在B侧,他的本端IP地址和端口号是自己的公网IP112.112.130.150:13409。他的远端IP地址和端口号是128.10.150.101:55077。B侧显示的CandidateType为prflx。因为B是通过直连打洞方式进出的。
示例二:A、B都走中继。
这是coturn级联时,数据流走向图。
站在A侧,他的本端IP地址和端口号是中继地址128.10.150.101:55077。他的远端IP地址和端口号也是中继地址128.10.160.120:55088。A侧显示的CandidateType为relay。A侧数据是通过中继进出的。
站在B侧,他的本端IP地址和端口号是中继地址128.10.160.120:55088。他的远端IP地址和端口号也是中继地址128.10.150.101:55077。B侧显示的CandidateType为relay。B侧数据也是通过中继进出的。