UDP接收缓冲区溢出导致丢包

时间:2024-04-07 22:46:56

最近实验室项目遇到了一个很有意思的小问题,在线下debug的时候,为了模拟线上环境,数据源直接从文件读取,但是线上实际数据收发频率很慢,差不多一秒几条数据,但是debug时为了节省时间每次读取文件数据发送出去的时候并没有延迟。这就导致了问题。UDP接收缓冲区溢出导致丢包

这个图就是整体架构,P从File读取的数据通过UDP发送给模型M进行预测处理等操作,模型M将预测结果发送给前端Player进行展示,结果发现P发送的数据一切正常,player展示出来的结果莫名其妙缺少很多数据点,思考后发现问题,原来P端每次读取到一条数据直接send,中间没有暂停,而M端进行预测得过程比较耗时,所以导致在预测的时候,M的内核UDP缓冲区收满了,后来的数据包被丢弃,导致后面Player显示缺少数据。这里有两个解决方法:1,P端睡眠一定时间,这也是比较常用的方法。2,修改M端套接字的接受缓冲区大小。说到这里想补充一下TCP和UDP的缓冲区知识,每个SOCKET都在内核中被映射为一个文件,每个socket对应两个缓冲区也就是收发缓冲区,UDP其实也有发送缓冲区(但是不像TCP那样,并不会缓存多个数据包),TCP是永远不会出现像上面UDP遇到的问题的,因为TCP的流量控制机制,会根据接收窗口大小严格控制发送窗口的大小。而UDP不可靠,并没有流量控制的机制,所以会导致丢包。