【问题标题】:How to ensure whole data was sent? sendto (udp socket) Python如何确保发送全部数据? sendto (udp 套接字) Python
【发布时间】:2017-06-19 17:44:50
【问题描述】:

首先,我知道 TCP 和 UDP 之间的区别,而且我知道,使用 UDP 时可能会丢失一些数据包。

但是,当我们假设我为 UDP 设计了一个带有一些简单 ACK 的协议时,我如何确保我发送/接收了整个数据?

例如,使用 TCP 套接字非常简单:

接收:

def recvall(sock, n): 
    i = 0
    data = ""
    while i < n:
          data += sock.recv(1)
          i += 1
    return data

然后发送:sock.sendall(msg)

在使用 UDP 套接字时应该如何做类似的事情?

【问题讨论】:

    标签: python sockets tcp udp


    【解决方案1】:

    如果您想确保您的客户端接收到所有数据,请使用 TCP。 UDP 不适用于需要确保数据完整性的情况。仅在可以接受丢弃数据包时才使用 UDP。

    话虽如此,您可以通过将序列号放入您的 UDP 数据包中来检查客户端是否收到了所有数据。然后,您的客户端可以检查每个传入数据包的序列号,并将其与它看到的最后一个序列号进行比较。如果current_packet_sequence_num != last_packet_sequence_num + 1 那么您可以假设您的客户端没有收到所有数据。

    【讨论】:

    • 根据this,选择 TCP 还是 UDP 不是关于完整性,而是关于您是 流式传输 数据或发送 消息,所以只是说如果不了解协议的性质,“使用 TCP”既简单又错误。
    • 仅仅因为没有丢包,并不意味着数据完整性得到保证。数据包可能已损坏,或被乱序接收。 TCP 会为你处理这个,UDP 不会。此外,在您的 seqnum 提案中,它允许最后一个数据包被丢弃的可能性,并且客户端不会注意到。如果 UDP 数据包损坏,它也不会执行任何操作,您可以通过查看 UDP 校验和来检查
    猜你喜欢
    • 2015-07-27
    • 2016-01-07
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多