2010-09-19 20 views
7

im usando 2 computadoras con una aplicación para enviar y recibir datagramas udp.
no hay control de flujo (ICMP desactivado)
frecuentemente cuando envío un archivo como datagramas udp a través de la aplicación, obtengo 2 paquetes cambiando su orden y por lo tanto - packetloss.asegurando el orden de paquetes en UDP

¿Hay alguna manera de asegurarse de que winsock y send() envíen los paquetes de la misma manera que llegaron allí?
o el sistema operativo está haciendo eso? Está desactivado y es un tipo de firewall y no hay un interruptor de hardware conectado entre las computadoras (están conectadas directamente). ¿se necesita configuración de dispositivo de red?
gracias

Respuesta

10

UDP es un protocolo liviano que, por diseño, no maneja cosas como la secuencia de paquetes. TCP es una mejor opción si desea una entrega y secuencia robusta de paquetes.

UDP generalmente está diseñado para aplicaciones donde la pérdida de paquetes es aceptable o preferible a la demora en la que TCP incurre cuando tiene que volver a solicitar paquetes. UDP por lo tanto, se utiliza comúnmente para la transmisión de medios.

Si está limitado a usar UDP, debería desarrollar un método para identificar los paquetes fuera de secuencia y volver a secuenciarlos.

+0

¿Puede explicar qué es este [UDP para pedidos] (http://www.nasdaqtrader.com/ content/technicalsupport/specifications/TradingProducts/UFO.pdf)? – Sajuuk

+0

@Sajuuk. Parece un documento pdf. Si tiene alguna pregunta, puede ser mejor hacer una nueva pregunta. – PaulG

7

UDP no garantiza que sus paquetes llegarán en orden. (Ni siquiera garantiza que lleguen sus paquetes.) Si necesita ese nivel de robustez, es mejor que lo haga con TCP. Alternativamente, podría agregar marcadores de secuencia a sus datagramas y reorganizarlos en el otro extremo, pero ¿por qué reinventar la rueda?

+0

por una razón práctica que no puedo describir estoy limitado a udp solamente. un packetloss raro una vez y luego es accaptable.es solo que 1 de 3 archivos tiene una pérdida. solo necesito encontrar una manera para que el remitente envíe los paquetes en el orden correcto, el resto no importa para mí. gracias – Davidallencoe

+1

No se trata tanto de que el remitente envíe los paquetes en el orden correcto como de que el receptor los vuelva a armar en el orden correcto. Como dije, agrega marcadores de secuencia en un nivel apropiado. – crazyscot

+0

UDP garantiza que un paquete llegará intacto o no lo hará en absoluto (es decir, tiene una suma de comprobación) y también agrega números de puerto a IP sin procesar. No garantiza la entrega o la secuencia; eso es lo que TCP agrega (básicamente gritando un paquete hasta que el otro extremo dice que ha llegado). La entrega garantizada correcta en el pedido también es suficiente para que pueda pretender que tiene una secuencia de datos (por lo tanto, TCP es un socket de transmisión, ya que comúnmente se desea). –

4
¿hay alguna manera de asegurarse de que winsock y send() envíen los paquetes de la misma manera que llegaron allí?

Se llama TCP.

Como alternativa, intente con un protocolo UDP confiable como UDT. Supongo que podría estar en una pequeña plataforma incrustada, por lo que desea un protocolo más compacto como el RUDP de Bell Lab.

0

no hay control de flujo (ICMP discapacitados)

puede implementar su propio control de flujo utilizando UDP:

  • enviar uno o más paquetes UDP
  • Esperar acuse de recibo (enviado como otro paquete UDP del receptor al remitente)
  • Repetir como arriba

Consulte Sliding window protocol para obtener más información.

[Esto sería además de tener un número de secuencia en los paquetes que se envían.]

Cuestiones relacionadas