最近有两个朋友在部署Lync的企业语音的时候都遇到了类似的问题,表象是通过Edge登录上来之后,客户端打电话都会出现接不通的问题。我们今天就来分析一下如何来搞定这种问题。
故事还是从OCS时×××始吧
上面这幅图OCS的语音整合图来自于Technet,大家应该都很熟悉。说实话以前我很是不理解我用绿色框圈住地方,在经过一些部署和抓包分析后来我才知道,原来它就表示在经过了SIP信令协商协商之后,客户端就直接把媒体流直接发送给中介服务器。媒体流也就绕过了前端服务器。所以在OCS的时代,如果需要在分支部署网关的话,我们也需要在分支部署一台中介服务器,为什么?假如分支的用户打个电话,他们的媒体流都要跑到总部的前端上转一圈然后再送给分支的网关,企业的那点WAN怎么会耐得住。所以如果分支的用户数量在一定规模之上的话,在分支部署一台中介服务器也就是必须的了。这个也属于一种Bypass功能,而现在在Lync里面,微软做得更好了,还可以bypass中介服务器,我们可以在分支只部署网关就可以,在经过媒体协商之后,客户端可以直接把音频流直接发送给网关。真是很给力,不过呢需要使用认证过的网关才行。
这样的模式有没有问题呢?
还是有的,那就是当用户从Edge上登录过来的时候。用户登录Edge之后,它所发出的信息会先到Edge服务器上,然后Edge服务器再发给中介服务器。一般企业也就在总部部署Edge服务器,那就意味着用户的媒体流肯定要从总部的Edge发到中介服务器,然后中介服务器在发送给网关,这就意味着没有办法做Bypass了。同时也说明边缘服务器和中介服务器还是有着某种关系的,如果没有处理好这种关系,可能呼叫就会出问题。
说道这里,我们先来看看上面提到的朋友遇到问题是什么样子的?
客户端通过Edge登录之后,如果发起PSTN呼叫的话,首先显示Calling,然后变为Connecting call,最后就显示Call failed due to network issues。这说明呼叫建立的信令都是正常的,但是问题发生在系统尝试建立媒体流的时候。
如何来解决呢?
在前端输入如下命令看看中介服务器的配置
Get-CsService –MediationServer
我们看到EdgeServer那里是空着,我们使用如下的命令把Edge服务器的值补上
Set-CsMediationServer -Identity "MediationServer:Lync_pool_name" -EdgeServer Your_edge_server_internal_address
输入完毕,再打一个电话测试一下,就一切正常了。
原因呢,如果我们在边缘或者中介上抓包,可能就会看到这样的Ms-client-diagnostics: 52031; reason="Call terminated on media connectivity failure" 的错误提示。在仔细研究研究你会发现原来中介服务器要去尝试连接一个外部地址,它不知道我们有边缘服务器?确实不知道,因为edgeserver那里是空的么。我们后来在中介服务器上配置那个参数就是告诉它,我们有Edge服务器的。
这也说明在部署企业语音的时候,处理好中介和Edge的关系还是比较重要的。如过你在部署中遇到了同样的问题,不妨试试这个方法。