现象: 在一SIP客户端增加视频功能以后, 发现有些Android 终端无法接收呼叫, 但是发起呼叫没有问题.
分析过程:
首先是怀疑服务器问题, SIP UAS 没有把呼叫转发到UAC上来. 在服务器进行抓包, 发现这个呼叫的INVITE 确实有发出来,地址, 端口都没错. 但是通过分析包,发现这个包的长度由于>MTU长度 导致分包, 网络底层是通过两个frame 发出去的. 这应该不是问题, 我们的 SIP UAS 和 UAC采用TCP通讯, , 上层是不用管底下怎么分包的,.
那是什么问题导致没有收到包呢? 继续在终端抓包, 发现包确实有收到, 但是上层没有收到, socket的收消息调用仔细检查也没有发现什么问题, 问题到这里好像没法查了. 先不管其他的, 由于是出现分包的地方出现错误, 先缩小包, 把包压缩在一个MTU以下,看能不能收到. 缩小到一个MTU以下呼叫确实能收到. 初步断定和手机的系统有关, 不过Android 这么多人用的系统, 不会有这么大的bug.吧.
怀着谨慎的态度, 在网上search了一下, 有人发现了同样的bug . 基本上可以确定是系统的问题.
https://code.google.com/p/android/issues/detail?id=34727
https://code.google.com/p/android/issues/detail?id=32736
而其中一个帖子提到只要TCP 源端口和目的端口中没有使用5060端口, 就没有问题. 由于我们服务器采用的是5060端口, 重新调整服务器端口进行测试, 发现果然不存在问题. 这个问题比较邪门! 有空还要研究一下!