Pregunta

Digamos que mi programa envía 1000 bytes a través de la red (UDP). ¿Se garantiza que el receptor recibirá los 1000 bytes en un " lote " ;? O tal vez necesite realizar varias lecturas " " " ¿Hasta que reciba el mensaje completo? si esto es cierto, ¿cómo puedo asegurarme de que el orden de los paquetes para el mismo mensaje no se confunda " (en orden), o tal vez el protocolo lo garantiza?
Editar : es decir, ¿es posible que mi mensaje se divida en varios paquetes? (¿Qué pasa si trato de enviar un mensaje de 10000 mb, qué sucede entonces?)

¿Fue útil?

Solución

Lo conseguirás todo o nada.

Pero no hay ninguna garantía particular de que recibirá paquetes exactamente una vez en el orden en que fueron transmitidos; la pérdida de paquetes, el reordenamiento y (menos a menudo) la duplicación son posibles.

Hay un tamaño máximo de trama (de 65,507 bytes), los paquetes de envío de tamaños más grandes devolverán un error.

Debe proporcionar suficiente búfer para recibir todo el marco en una 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.

Otros consejos

El receptor recibirá el paquete completo en una llamada. La longitud del paquete es limitada, incluso en teoría :

  

Longitud       Un campo de 16 bits que especifica la longitud en bytes de todo el   datagrama: encabezado y datos. El mínimo   longitud es de 8 bytes ya que esa es la   Longitud del encabezado. El tamaño del campo   establece un límite teórico de 65.535   bytes (encabezado de 8 bytes + 65527 bytes de   datos) para un datagrama UDP. los   Límite práctico para la longitud de los datos.   lo que es impuesto por el subyacente   El protocolo IPv4 tiene 65,507 bytes.

Sin embargo, el límite real es mucho más bajo, por lo general es seguro asumir 512 bytes. Consulte ¿Cuál es el tamaño de paquete UDP seguro más grande en Internet .

Los datos enviados mediante UDP se agrupan en paquetes , por lo que si envía x cantidad de bytes y luego, si el receptor recibe el paquete, recibirá x cantidad de bytes.

Sin embargo, es posible que sus paquetes ni siquiera lleguen o que lleguen fuera de orden.

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 una forma de paso de bloqueo, donde cada vez que se envía un paquete, el remitente debe esperar para recibir un ACK antes de enviarlo nuevamente. Si no se recibe un ACK después de un tiempo de espera especificado, el paquete debe reenviarse. De esta manera, se asegura de que los paquetes se reciban en el orden correcto. (Para obtener más información, consulte el RFC para el protocolo TFTP , que utiliza esta estrategia .)

Finalmente, si es posible, es posible que desee considerar el uso de TCP en su lugar.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top