无法始终如一地加入 Microsoft 团队中的会议 "Oh dear! your call has dropped."

Unable to consistently join meetings in microsoft teams "Oh dear! your call has dropped."

我花了数周时间研究可以打开团队但无法参加会议的问题。我可以与其他团队成员进行 ad-hoc 通话,但会议会在 5-10 秒内停止并显示错误消息 "Oh dear! Your call has dropped. Please try again."

我的路由器(以及来自其他供应商的其他同事的路由器)存在双重映射端口错误。

解决方案是使用以下规则设置端口转发:

团队音频:UDP 50000-50019

团队视频:UDP 50020-50039

团队共享:UDP 50040-50059

这里是对问题的详细解释:

• 根据工作和非工作呼叫的媒体日志文件,连接检查不会一直继续完成。最初在工作和非工作情况下,客户端确实会直接收到来自 MP(媒体处理器)ip 的响应,如下所示 工作

tc::icemachine::IceMachineImpl::ProcessReceive 13:41:20.835 18208 TL_INFO [19ABA2EF970]: ICEMCHN #0 ProcessReceive() PipeInfo{ UDP, Local:10.10.10.0:50006, PalBasedPipe} PipeData{IceData, Encap: Turn, {IP:}, Peer:104.209.195.0:50232, {010100342112a442b3. ..}}

不工作

tc::icemachine::IceMachineImpl::ProcessReceive 13:40:59.885 18208 TL_INFO [19ABA832A20]: ICEMCHN #0 ProcessReceive() PipeInfo{ UDP, Local:10.10.10.0:50002, PalBasedPipe} PipeData{IceData, Encap: None, {IP:}, Peer:104.209.192.0:51402 , {000100542112a4423f...}}

但是,在工作调用中,主机 ip 没有提升,它通过 3480 上的中继 IP 工作

ICEMCHN 对转储:IceCandidatePair 失败{ P:0x7efffdfefdfffbfc L:IceCandidate{F:1 Rtp:{HostUDP, {IP:10.10.10.0:50006}, base:10.10.10 .0:50006, rel:10.10.10.0:50006, bw:0, p:0x7efffdfe, pipe:UDP}, Rtcp:{Mux}} R:IceCandidate{D, F:1 Rtp:{StunUDP, {IP:104.209.195.0:50232}, base:, rel:, bw:0, p:0x7efffdfe, pipe:None}, Rtcp:{Mux} } DL:,}

ICEMCHN 配对转储:IceCandidatePair 成功{ P:0x0afff5fefdfffbfc L:IceCandidate{D, F:5 Rtp:{TurnUDP, {IP:52.114.188.0:3480, ID:{864350ac4fd269e1}} , base:10.10.10.0:50006, rel:108.168.97.0:50006, bw:0, p:0x0afff5fe, pipe:UDP}, Rtcp:{Mux}} R:IceCandidate{D, F:1 Rtp:{StunUDP, {IP:104.209.195.0:50232}, base:, rel:, bw:0, p:0x7efffdfe, pipe:None }, Rtcp:{Mux}} DL:52.114.188.0:3480,52.114.188.0:3480}

在非工作日志中,没有对主机对的响应,并且在回退路径上也失败了 TL_WARN [19ABA832A20]:ICEMCHN #0,未找到回退路径

在与产品组讨论后,我们发现 1. client向MP发送connectivity check packet用于audio modality,源端口为50006,dst端口为53176 MP接收,映射源端口为1026 2.Client向MP发送connectivity check packet for video modality,source port为50032,dst port为57270 MP接收,映射源端口为1026 3.客户端向MP发送连通性检查包用于app共享模式,源端口为50052,dst端口为59746 MP接收,映射源端口为1026

因此 NAT 对多个不同的源端口和目标端口使用相同的源端口。 随着呼叫的进行,客户端向 MP 发送更多的连接检查数据包,并且没有收到音频和视频的响应;当音频模式失败时,这就是它放弃通话的原因。不过,从 MP 日志中,我可以看出 MP 实际上正在接收这些请求,并且正在响应它们。

从 wireshark 跟踪我可以看到从客户端 IP 发送到媒体处理器 IP 的请求如下 6052 37.667639 10.10.10.110 137.116.60.197 STUN 150 绑定请求用户:nz22:7IQN Internet 协议版本 4,Src:10.10.10.110,Dst:137.116.60.197 用户数据报协议,Src 端口:50006,Dst 端口:53176

并且正在发送的响应被 NAT 转发到不同的 IP,如下所示

6065 37.733923 137.116.60.197 10.10.10.110 STUN 114 绑定成功响应 XOR-MAPPED-ADDRESS: 108.168.97.86:1026 Internet 协议版本 4,Src:137.116.60.197,Dst:10.10.10.110 用户数据报协议,源端口:53176,目标端口:50058 异或映射地址:108.168.97.86:1026

从上面的流量可以清楚地看出,从 MP 发送的流量被路由到 NAT(108.168.97.86:1026) 并修改了源端口。 NAT 没有正确维护映射,而是将端口 1026 上收到的所有数据包转发到相同的源端口,可能是 50052,这是有效的模式。 50052 可能正在接收到达 1026 的所有内容,这就是为什么我看到数据包丢失的痕迹,因为它接收的数据包实际上应该发送到 50032 或 50006。

根据我们的研究和分析,它似乎是 NAT 映射。正如在 wireshark 跟踪中看到的那样,NAT 正在将端口 1026 上收到的所有数据包转发到相同的源端口,可能是 50052,它被用于应用程序共享,在日志中我可以看到成功有效的应用程序共享模式。 问题是 NAT 没有保持路径分离。它最终使得来自所有 3 个服务器端口的流量最终进入同一个专用端口,在这种情况下为 50052。

NAT 可以选择为这些专用端口提供单独的 public 端口,或者它可以选择为这些专用端口提供相同的 public 端口,就像它在这里所做的那样。任何一种方式都是有效的。 问题是,如果您决定重用同一个 public 端口,那么您知道哪个是正确的专用端口以将流量转发到的唯一方法是跟踪流量到达的目的地从或被发送到,NAT 在这里可能没有做。团队客户端从该源端口(即 50006)做的第一件事是将分配流量发送到它的中继。这是 NAT 将看到的第一个出口媒体数据包。通常 NAT 会尝试为该流量提供与私有端口相同的 public 端口,事实上,该 NAT 似乎确实这样做了——中继在 NAT 上看到的端口与私有端口相同50006(与视频和应用程序共享相同)。 1026 直到 NAT 看到来自同一个源端口的数据包被绑定到不同的目的地 - 在本例中是 MP 时才发挥作用。因此,来自 50006 的第一个数据包,发往中继,被 NAT 分配 public 端口 50006。但是,来自同一个专用端口的数据包发往 MP(与中继不同的 ip 和端口)获得了 1026 NAT 源端口。 服务器实际上确实尝试将数据包直接发送到计算机的 IP,但该 IP 是私有 IP,因此该数据包永远不会靠近机器。服务器还尝试将数据包发送到客户端在其报价中发送的 public ip 地址。这通常发生在客户端准备好接收数据包之前,因此大多数 NAT 都会丢弃这些数据包。