Base de red: TCP (3): paquete de inmersión de TCP

1. El origen y la solución de la inmersión de paquetes TCP

De forma predeterminada, la conexión TCP iniciará el algoritmo de transmisión retardada (algoritmo de Nagle), los almacenará en búfer antes de enviar los datos; si se envían varios datos en poco tiempo, se almacenarán en búfer juntos para una transmisión (tamaño del búfer, consulte socket.bufferSize ), por lo que puede reducir el rendimiento del consumo de E / S.

Si se trata de transferir archivos, entonces no hay necesidad de lidiar con el problema del ensacado en absoluto, solo arma un paquete. Pero si se trata de múltiples piezas de información o datos para otros fines, entonces el paquete debe procesarse.

Puede consultar un ejemplo que se ha difundido ampliamente. Envíe dos llamadas consecutivas para enviar datos1 y datos2 en ambos extremos. Hay varias situaciones comunes en el extremo receptor:

  • R: Reciba primero data1, luego data2.

  • B: Primero reciba parte de los datos de data1 y luego reciba la parte restante de los datos de data1 y todos los datos de data2.

  • C: Primero recibió todos los datos de data1 y algunos datos de data2, y luego recibió los datos restantes de data2.

  • D: Todos los datos de data1 y data2 se han recibido a la vez.

Entre ellos, B, C y D son nuestras condiciones de inmersión comunes. Para el problema de la inmersión, las soluciones comunes son:

  1. Permita un tiempo de espera antes de enviar varias veces : solo espere un momento para el próximo envío, que es adecuado para escenarios donde la frecuencia de interacción es particularmente baja. La desventaja también es obvia: para escenas más frecuentes, la eficiencia de transmisión es demasiado baja, pero casi no hay necesidad de lidiar con ella.

  2. Desactivar el algoritmo de Nagle : Desactive el algoritmo de Nagle. En Node.js, puede desactivar el algoritmo de Nagle a través del método socket.setNodelay (), para que cada envío se envíe directamente sin almacenamiento en búfer. Este método es más adecuado para escenarios donde los datos enviados cada vez son relativamente grandes (pero no tan grandes como el archivo) y la frecuencia no es particularmente alta. Si la cantidad de datos enviados cada vez es relativamente pequeña y la frecuencia es particularmente alta, apagar Nagle es puramente artes marciales contraproducentes. Además, este método no es adecuado para las malas condiciones de la red, porque el algoritmo de Nagle realiza la fusión de paquetes en el lado del servidor, pero si la condición de la red del cliente no es buena en un corto período de tiempo o la capa de aplicación no puede transferir el Datos TCP a tiempo por algunas razones Recv (función recv: tanto el cliente como la aplicación del servidor usan la función recv para recibir datos desde el otro extremo de la conexión TCP), lo que provocará que varios paquetes se almacenen en búfer en el lado del cliente para contaminar los paquetes. (Si está en una sala de comunicación interna estable, entonces esta probabilidad es relativamente pequeña y puede ignorarse)

  3. Embalaje / desembalaje : El embalaje / desembalaje es una solución común en la industria. Es decir, antes de enviar cada paquete de datos, coloque algunos datos característicos antes / después y luego divida cada paquete de datos de acuerdo con los datos característicos cuando se reciben los datos.

2. ¿Por qué UDP no se adhiere a los paquetes?

  1. El protocolo TCP es un protocolo orientado a la transmisión y UDP es un protocolo orientado a mensajes. El segmento UDP es una pieza de información y la aplicación debe extraer datos en unidades de mensajes, no en cualquier byte de datos a la vez.

  2. UDP tiene un límite de mensaje protegido y hay un encabezado de mensaje (dirección de origen del mensaje, puerto, etc.) en cada paquete UDP, de modo que sea fácil para el receptor distinguir y procesar. El protocolo de transmisión trata los datos como un mensaje independiente para su transmisión en Internet, y el receptor solo puede recibir mensajes independientes. El extremo receptor solo puede recibir un paquete de datos enviado por el extremo emisor a la vez. Si el tamaño de los datos recibidos es menor que el tamaño de los datos enviados por el extremo emisor a la vez, se perderá una parte de los datos, que es decir, el extremo receptor no lo recibirá dos veces.

Supongo que te gusta

Origin blog.csdn.net/imagine_tion/article/details/110920993
Recomendado
Clasificación