【问题标题】:Socket UDP Python Server Looses Packets套接字 UDP Python 服务器丢失数据包
【发布时间】:2020-06-23 05:02:52
【问题描述】:

我正在使用 Python,但将 UDP Socket 作为服务器存在问题。我从客户端发送数据包,但数据太大而无法在一个数据包(几个 MBytes)中发送,因此我将数据分段为 65K 的数据包(IP 将其分段为 1500 字节数据包(MTU)并在服务器中重新组合它们)。我在 Wiresharks 中看到了数据包,所以传输没有问题。

传输代码是:

while(end == False):

        if total_length - count >= MTU:
            length_send = self._socket.sendto(msgbuff[count:count + MTU],(IP,PORT))
        else:
            length_send = self._socket.sendto(msgbuff[count:],(IP,PORT))

        count += length_send
        if count == total_length:
            end = True

问题出在前台。我使用同步标头来了解数据的开始位置(例如,一些固定字节为 0xB451B451)。在某些运行中,服务器运行良好并找到同步标头,并且能够恢复所有数据包。

但是,在其他运行中,套接字仅接收块数据的最后一个数据包。例如:块数据为 100K,第一个数据包为 65K,第二个数据包为 35K。套接字总是返回 35K 的数据包。

服务器的代码是:

while not synchronized_flag:
        msg, __ = self._socket.recvfrom(MTU)
        seq_sync = msg[0:length(SYNQ_HEADER)]
        if seq_sync == SYNQ_HEADER:
            synchronized_flag = True

total_length = getLength(msg)
bytes_read = 0
while bytes_read < total_length:
            msg_aux, _ = self._socket.recvfrom(MTU)
            msg.extend(msg_aux)
            bytes_read += len(msg_aux)

感谢您的支持。

另外我必须说我不能使用 TCP,因为我需要我能得到的最高速度。

【问题讨论】:

  • 是的。 UDP 是有损的。
  • TCP 实际上可以为您提供您能够获得的最高速度,一旦您考虑了丢包和拥塞控制等问题的处理。请记住,TCP 是为可靠的数据传输而设计的,它的设计者面临着您现在发现的所有相同问题。如果您想坚持使用 UDP,您可能会发现自己随着时间的推移创建了自己的类似 TCP 的协议;除非您自己开发的版本没有经过充分测试或可靠。

标签: python sockets networking udp


【解决方案1】:

请记住,UDP 不是reliable protocol,因此通常用于视频流等应用程序,但如果每个数据包都需要正确接收,则不是。

您必须做出决定,是要建立可靠的连接(以更多开销和较低速度为代价)还是以最小开销(以可能丢失数据包为代价)的连接。

【讨论】:

    猜你喜欢
    • 2014-11-11
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 2015-12-02
    • 2016-03-26
    相关资源
    最近更新 更多