记一次TCP重发接口调用的问题

时间:2021-08-10 15:33:23

问题描述:基于微软RDP协议,使用开源rdp库与微软skpye软件进行基于tcp的p2p通讯,由于rdp协议传输原始图片数据较大,调用公司内部ice p2p通讯接口处会导致失败。

错误思路:一开始是怀疑开源库的问题,导致发送的图像数据格式不对,导致发送失败,怀疑是rdp协商的过程不一致,但是一开始协商是成功的,使用windows远程桌面也可以正常访问rpd server。于是仔细看了库的代码,比对了流程,进行了简单测试,排除掉了。其实一开始,我就怀疑我们的ice模块发送有问题,但是心想,公司ice模块毕竟使用了那么长时间,还是有保障的。最后才知道公司大多数都是使用的udp的p2p通讯。后来,我怀疑发送数据过快,会导致tcp协议缓冲区满的情况,于是调节了发送速率,对端可以正常收到数据,抓包看rtp数据包也是正常的,但是这种处理方式显然是错误的。于是和ice开发的同事讨论,原来发送失败,有返回错误码,因为是对接公司的其他模块,发送模块是之前就有的, 我之前也没有考虑到,这个真是欠缺的,其实最早就该检测返回失败的错误码,发送过快,确实导致tcp协议栈的缓冲区满掉了,然后接口返回失败,有一个重发机制,我需要重发数据包,最后我也进行重发了,但是还是不行。 最后比对,在接口调用出把要发送的数据包保存成文件,然后再通过ice发送到网络,同时进行tcp抓包,将发送的原始数据和抓包的数据比对了一下,定位到了问题的所在,每次重发的时候都会导致对端报错,然后重发的包之前的一个包,和原始数据对不上号,果然,是我们的ice模块的重发机制有bug,至此,问题定位到了,可以甩锅了,开个玩笑,^_^

正确思路:发送失败,看接口反馈信息,然后再去检查数据的格式,最后再去看数据内容问题,协议问题。

涉及关键知识点:tcp协议栈缓存区大小的控制  应用层重发逻辑的设计  接口调用规范的设计