首先,我知道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套接字时应该如何进行类似的操作?
答案 0 :(得分:4)
如果要确保客户端收到所有数据,请使用TCP。 UDP不适用于需要确保数据完整性的情况。只有在丢弃数据包可接受时才使用UDP。
现在,您可以通过在UDP数据包中添加序列号来检查客户端是否收到了所有数据。然后,您的客户端可以检查每个传入的数据包的序列号,并将其与它看到的最后一个序列号进行比较。如果current_packet_sequence_num != last_packet_sequence_num + 1
,那么您可以假设您的客户端未收到所有数据。