Python UDP套接字错过了数据包

时间:2014-04-30 19:50:18

标签: python sockets udp

我正在使用用于FTP的UDP实现客户端 - 服务器通信。首先,我不需要告诉我UDP是不可靠的,我知道。我的方法是:客户端请求一个文件,服务器用带有序列号的udp数据包爆炸客户端,然后说“你错过了什么?”,重新发送它们。在本地网络上,丢包是< 1%。我对套接字编程很新,所以我不熟悉所有套接字选项(谷歌上大多数例子都是针对tcp的。)

我的问题是我的客户收到这些数据的原因。

PACKET_SIZE = 9216
mysocket.sendto('GO!', server_addr)
while True:
    resp = mysocket.recv(PACKET_SIZE)
    worker_thread.enqeue_packet(resp)

但是当它返回到.recv()时,它错过了一些udp数据包(我已经确认使用wireshark发送)。我可以通过使服务器发送稍微慢一点来解决这个问题(实际上,包括日志记录语句足以让所有功能都发挥作用)。

如何确保socket.recv在处理数据包时不会遗漏任何内容?我已经尝试将数据推送到一个单独的线程,将其推入队列,但它仍然不够。

有什么想法吗? select,recv_into,setblocking?

1 个答案:

答案 0 :(得分:1)

虽然您已经知道,UDP不可靠,但您可能会错过TCP的其他优势。与您相关的是TCP具有流量控制并且如果接收器无法应对发送器速度(例如丢包)则自动缩小。因此,对于正常连接,TCP应该是数据传输的首选。对于高延迟连接(卫星链路),它在默认配置中表现得太差,因此有些人设计了自定义传输协议(主要使用UDP),而其他人只是调整现有的TCP堆栈。

我不知道你为什么要使用UDP,但是如果你想继续使用它,你应该向发送者添加某种反向信道,以告知它当前的数据包丢失,以便它可以缩小。也许您应该看看RTCP,它伴随着RTP(用于VoIP等)。