¿Cuál es la diferencia entre flujos y datagramas en la programación de red?

Respuestas:

304

Hace mucho tiempo leí una gran analogía para explicar la diferencia entre los dos. No recuerdo dónde lo leí, así que desafortunadamente no puedo dar crédito al autor por la idea, pero de todos modos también he agregado mucho de mi propio conocimiento a la analogía central. Entonces aquí va:

Una toma de corriente es como una llamada telefónica: un lado realiza la llamada, el otro responde, se saludan (SYN / ACK en TCP) y luego intercambian información. Una vez que haya terminado, se despide (FIN / ACK en TCP). Si un lado no escucha un adiós, generalmente llamará al otro porque este es un evento inesperado; por lo general, el cliente se volverá a conectar al servidor. Existe una garantía de que los datos no llegarán en un orden diferente al que usted envió, y hay una garantía razonable de que los datos no se dañarán.

Un socket de datagrama es como pasar una nota en clase. Considere el caso en el que no está directamente al lado de la persona a la que le pasa la nota; la nota viajará de persona a persona. Es posible que no llegue a su destino, y puede ser modificado para cuando llegue allí. Si pasa dos notas a la misma persona, es posible que lleguen en un orden que no tenía intención, ya que la ruta que toman las notas a través del aula puede no ser la misma, una persona puede no pasar una nota tan rápido como otra, etc. .

Por lo tanto, utiliza un socket de flujo cuando es importante tener información en orden e intacta. Los protocolos de transferencia de archivos son un buen ejemplo aquí. ¡No querrás descargar algún archivo con su contenido aleatoriamente mezclado y dañado!

Usaría un socket de datagrama cuando el pedido sea menos importante que la entrega oportuna (piense en los protocolos de juego o VoIP), cuando no desee una mayor sobrecarga de una transmisión (es por eso que DNS es principalmente un protocolo de datagrama, para que los servidores puedan responder a muchas, muchas solicitudes a la vez muy rápidamente), o cuando no le importa demasiado si los datos llegan a su destino.

Para ampliar el caso de VoIP / juego, dichos protocolos incluyen su propio mecanismo de pedido de datos. Pero si un paquete se daña o se pierde, no desea esperar en el protocolo de transmisión (generalmente TCP) para emitir una solicitud de reenvío; debe recuperarse rápidamente. El TCP puede tardar hasta varios minutos en recuperarse, y para protocolos en tiempo real como juegos o VoIP, ¡incluso tres segundos pueden ser inaceptables! El uso de un protocolo de datagrama como UDP permite que el software se recupere de tal evento extremadamente rápido, simplemente ignorando los datos perdidos o volviendo a solicitarlos antes de lo que lo haría TCP.

VoIP es un buen candidato para simplemente ignorar los datos perdidos: una de las partes solo escucharía una brecha breve, similar a lo que sucede cuando se habla con alguien por teléfono celular cuando tienen una recepción deficiente. Los protocolos de juego son a menudo un poco más complejos, pero las acciones tomadas generalmente serán ignorar los datos faltantes (si los datos recibidos posteriormente reemplazan a los datos perdidos), volver a solicitar los datos faltantes o solicitar una actualización de estado completa para asegúrese de que el estado del cliente esté sincronizado con el del servidor.

cdhowie
fuente
3
Simplemente excelente para incluir los detalles de SYNACK.
LazerSharks
2
Este ejemplo, o uno muy similar, es de la interfaz de programación de Linux. La edición de 2010 contiene estos ejemplos en las páginas 1155 y 1159.
Josh
30

Toma de corriente:

  • Canal dedicado y de extremo a extremo entre el servidor y el cliente.
  • Use el protocolo TCP para la transmisión de datos.
  • Fiable y sin pérdidas.
  • Datos enviados / recibidos en el mismo orden.
  • Mucho tiempo para recuperar datos perdidos / equivocados

Enchufe de datagrama:

  • Canal no dedicado y de extremo a extremo entre el servidor y el cliente.
  • Use UDP para la transmisión de datos.
  • No es 100% confiable y puede perder datos.
  • Los datos enviados / recibidos pueden no ser los mismos.
  • No me importa o la recuperación rápida de datos perdidos / equivocados.
Alejandro Blasco
fuente
¿No se envían los datos en el mismo orden (no solo "similar")? es decir. no tendría sentido construir un mecanismo de pedido de paquetes en un socket de flujo
Matthew D. Scholefield
Los paquetes en una comunicación de flujo se envían y reciben en un orden "similar" en el sentido de que NO se garantiza que los paquetes mismos se entreguen al host receptor en orden, pero TCP resuelve las discrepancias, reorganiza los paquetes a medida que llegan y solicita cualquier cosa. eso parece haberse perdido en el camino.
Alejandro Blasco
Eso tiene sentido. Tal vez solo elimine eso como una diferencia y póngalo debajo (ya que si lo entiendo correctamente, cuando me refiero solo al orden en que se envían los paquetes, en ambos casos el orden en que se envían / ​​reciben los datos puede no ser lo mismo).
Matthew D. Scholefield
@Rick Más precisamente, los sockets se conocen como puntos de extremo a extremo porque los protocolos de transporte son responsables de entregar mensajes a uno o múltiples puntos finales de la red.
Alejandro Blasco
0

Si se trata de la programación de red, creo que comenzar desde sockets sería un buen comienzo.
socket = ip + port
hay tres tipos de
flujo de sockets (TCP, pedido y entrega garantizados, sin duplicación, sin límites de longitud o carácter para datos,
datagrama orientado a conexión, confiable, concurrencia) (UDP, basado en paquetes, sin conexión, datagrama límite de tamaño, los datos pueden perderse o duplicarse, orden no garantizada, no confiable) sin
procesar (acceso directo a los protocolos de capa inferior IP, ICMP)
No veo ninguna regla estricta para el tipo de protocolo de transporte en cuanto a qué socket debe usar qué protocolo de transporte y la fiabilidad no debe confundirse porque UDP es confiable en caso de que ambos extremos estén activos.
La confiabilidad se refiere más a la confiabilidad de la entrega ya que hay verificaciones de números de secuencia usando TCP como protocolo de transporte que no existen en UDP. Es mejor usar un analizador de protocolos de red como wireshark tcpdump, etc. para ver qué está haciendo exactamente su software; tipo de verificación o teoría de fusión en el papel con su trabajo en acción.

hakkican
fuente