2009-10-24 23 views
9

Digamos que mi programa envía 1000 bytes a través de la red (UDP). ¿Garantiza que el receptor recibirá los 1000 bytes en un "lote"? ¿O tal vez tendrá que realizar varias "lecturas" hasta que reciba el mensaje completo? si lo posterior es cierto, ¿cómo puedo garantizar que el orden de los paquetes para el mismo mensaje no se "mezcle" (en orden), o tal vez el protocolo lo garantice?
Editar: es decir, ¿es posible que mi mensaje se divida en varios paquetes? (¿Qué pasa si trato de enviar un mensaje de 10000mb, qué pasa entonces?)Recepción de paquetes en UDP

Respuesta

13

Lo obtendrá todo o nada.

Pero no hay una garantía particular de que recibirá los paquetes exactamente una vez en el orden en que se transmitieron; la pérdida de paquetes, el reordenamiento y (con menor frecuencia) la duplicación son posibles.

Hay un tamaño de fotograma máximo (de 65,507 bytes), enviar() los paquetes de tamaños mayores devolverán un error.

Debe proporcionar suficiente memoria intermedia para recibir el cuadro completo en una sola llamada.

Los paquetes UDP PUEDEN estar fragmentados en múltiples fragmentos de IP, pero el sistema operativo eliminará un paquete incompleto. Esto es, por lo tanto, transparente para la aplicación.

1

Los datos enviados usando UDP se agrupan en packets, por lo que si envía x cantidad de bytes, entonces SI el receptor recibe el paquete recibirá x cantidad de bytes.

Sin embargo, es posible que sus paquetes no lleguen o que lleguen fuera de servicio.

+0

pero ¿es posible que el programa primero vea que tiene solo 500 bytes disponibles y después de un tiempo recibirá los otros 500 bytes? –

+0

y qué pasa si el tamaño de mi mensaje es de 1 millón de bytes. ¿Qué sucede entonces? (gracias) –

+0

¡No, no lo es! – Charles

1

UDP, a diferencia de TCP, no es un protocolo confiable. No proporciona ningún mecanismo incorporado para garantizar que los paquetes lleguen en el orden correcto o incluso lleguen a todos. Dicho esto, puede escribir sus rutinas de envío/recepción en un paso de bloqueo, donde cada vez que se envía un paquete, el remitente debe esperar para recibir un ACK antes de volver a enviarlo. Si no se recibe un ACK después de un tiempo de espera especificado, el paquete debe reenviarse. De esta forma, se asegura de que los paquetes se reciban en el orden correcto. (Para obtener más información, consulte el RFC for the TFTP protocol, que utiliza esta estrategia.)

Finalmente, si es posible, puede considerar usar TCP en su lugar.

4

El receptor recibirá todo el paquete en una sola llamada. La longitud del paquete es limitada, incluso en theory:

Longitud un campo de 16 bits que especifica la longitud en bytes de toda la datagrama: cabecera y datos. La longitud mínima de es de 8 bytes, ya que esa es la longitud del encabezado. El tamaño de campo establece un límite teórico de 65,535 bytes (encabezado de 8 bytes + 65527 bytes de datos ) para un datagrama UDP. El límite práctico para la longitud de datos que se impone mediante el protocolo subyacente IPv4 es 65,507 bytes.

Sin embargo, el límite real es mucho menor, por lo general es seguro asumir 512 bytes. Ver What is the largest Safe UDP Packet Size on the Internet.

+0

Entonces, ¿qué pasará si trato de enviar 1024 bytes? ¿Recibiré un error al enviar o mi mensaje se dividirá en diferentes paquetes? (y el orden cuando se guarda entre ellos?) –

+0

El 512 es un tamaño mínimo * seguro *. 1024 puede tener éxito. O error durante el envío en el mejor de los casos. Peor aún, el paquete será eliminado por algún enrutador en el tráfico y nunca lo sabrá. No hay fragmentación y reconstrucción con UDP, para eso está TCP. –

+3

Remus: Eso está mal. La fragmentación y el reensamblaje se realizan en el nivel de IP, lo que significa que se aplica a UDP. Con UDP, verá todo el datagrama correctamente ensamblado tal como fue enviado, o nada en absoluto. TCP también agrega orden y reconocimiento/retransmisión. – caf

1

Con UDP Lite puede solicitar recibir paquetes parcialmente dañados. Esto puede ser útil para servicios de video y VoIP.

+0

con suerte, obtenemos una implementación para Windows para que pueda ser utilizada en aplicaciones de usuario final de escritorio – mbx

Cuestiones relacionadas