问题描述:基于微软RDP协议,使用开源rdp库与微软skpye软件进行基于tcp的p2p通信,因为rdp协议传输原始图片数据较大,调用公司内部ice p2p通信接口处会致使失败。windows
错误思路:一开始是怀疑开源库的问题,致使发送的图像数据格式不对,致使发送失败,怀疑是rdp协商的过程不一致,可是一开始协商是成功的,使用windows远程桌面也能够正常访问rpd server。因而仔细看了库的代码,比对了流程,进行了简单测试,排除掉了。其实一开始,我就怀疑咱们的ice模块发送有问题,可是心想,公司ice模块毕竟使用了那么长时间,仍是有保障的。最后才知道公司大多数都是使用的udp的p2p通信。后来,我怀疑发送数据过快,会致使tcp协议缓冲区满的状况,因而调节了发送速率,对端能够正常收到数据,抓包看rtp数据包也是正常的,可是这种处理方式显然是错误的。因而和ice开发的同事讨论,原来发送失败,有返回错误码,由于是对接公司的其余模块,发送模块是以前就有的, 我以前也没有考虑到,这个真是欠缺的,其实最先就该检测返回失败的错误码,发送过快,确实致使tcp协议栈的缓冲区满掉了,而后接口返回失败,有一个重发机制,我须要重发数据包,最后我也进行重发了,可是仍是不行。 最后比对,在接口调用出把要发送的数据包保存成文件,而后再经过ice发送到网络,同时进行tcp抓包,将发送的原始数据和抓包的数据比对了一下,定位到了问题的所在,每次重发的时候都会致使对端报错,而后重发的包以前的一个包,和原始数据对不上号,果真,是咱们的ice模块的重发机制有bug,至此,问题定位到了,能够甩锅了,开个玩笑,^_^缓存
正确思路:发送失败,看接口反馈信息,而后再去检查数据的格式,最后再去看数据内容问题,协议问题。网络
涉及关键知识点:tcp协议栈缓存区大小的控制 应用层重发逻辑的设计 接口调用规范的设计tcp