数据报是否始终完全收到?

2022-09-04 02:32:00

大多数数据报接收函数,如c的recv或read,javas DatagramPacket类或pythonsocketServer,都包括找出接收数据量的可能性。

c:

int amount = recv(sock, buf, n, MSG_WAITALL);

爪哇岛:

int amount = datagramSocket.getLength();

蟒:

class MyUDPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        amount = len (self.request[0])

这些可靠吗?或者,由于数据包碎片或网络延迟等原因,是否有可能仅接收部分消息?
换句话说:当我通过udp发送可变长度的数据块并在另一端接收它时,这些数量值是否正好等于原始块的大小?

编辑:
ninjalj提出了一个很好的观点,我想把它包括在这里。当接收功能中断时会发生什么,例如被信号中断?当两个线程同时尝试从同一套接字接收时,会发生什么情况?


答案 1

UDP 数据报无法部分传送¹;它们按原样交付或根本不交付。因此,是的,您可以确定接收到的数据报的发送方式与您在接收器端看到的完全相同。

编辑以纳入Will的评论,这是最好的正确类型(即,技术上):

¹它们可以在 IP 级别进行分段,但接收方的网络堆栈将完全重新组装数据报并将其作为发送传递给侦听进程,或者根本不确认已接收任何数据。


答案 2

部分数据报仅允许使用 UDP Lite