2011-10-28 11 views
13

La mayoría de las funciones de recepción de datagramas, como c's recv o read, javas DatagramPacket class o pythons SocketServer, incluyen la posibilidad de conocer la cantidad de datos recibidos.¿Los datagramas siempre se reciben por completo?

c:

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

java:

int amount = datagramSocket.getLength(); 

pitón:

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

Son estos fiable? ¿O es posible que solo se reciban partes del mensaje, debido, por ejemplo, a la fragmentación de paquetes o al retraso de la red?
En otras palabras: cuando envío un fragmento de longitud variable a través de udp y lo recibo en el otro extremo, ¿estos valores de cantidad son exactamente iguales al tamaño del fragmento original?

Edit:
ninjalj hizo un buen punto y quiero incluirlo aquí. ¿Qué sucede cuando se interrumpe la función de recepción, por ejemplo, mediante una señal? ¿Qué sucede cuando dos hilos intentan recibir simultáneamente desde el mismo zócalo?

+0

solo fyi, su código java tiene una grave ortografía incorrecta de 'Longitud' – Necrolis

Respuesta

13

Los datagramas UDP no se pueden entregar parcialmente¹; se entregan tal cual o no se entregan. Entonces sí, puede estar seguro de que el datagrama recibido fue enviado exactamente como lo ve en el extremo del receptor.

Editar para incorporar el comentario de Will, que es el mejor tipo de correcta (es decir, técnicamente):

¹They puede ser fragmentado en el nivel IP, pero la pila de red en el lado del receptor o bien volver a montar completamente una datagrama y pasarlo al proceso de escucha tal como se envió, o no reconocerá que se ha recibido ningún dato en absoluto.

+8

Los paquetes técnicamente grandes pueden estar fragmentados, pero el protocolo maneja la fragmentación y el reensamblaje y si no se puede volver a ensamblar completamente se marca como perdido, por lo que el usuario nunca lo notará – Will

+1

Will es correcto. La pila UDP en el sistema operativo se ocupa de la fragmentación, pero la fragmentación es una tarea de nivel de IP. Por lo tanto, se aplica tanto a TCP como a UDP por igual. Dicho esto, los paquetes UDP no tienen garantía de entrega. Entonces, cualquier retransmisión debe ser atendida por su programa. – nemith

+2

Sin embargo, si su memoria intermedia para recv() no es lo suficientemente grande como para contener el paquete, obtendrá datos truncados. – nos

4

Los datagramas parciales solo se permiten con UDP Lite.

Cuestiones relacionadas