Red de conocimiento informático - Material del sitio web - Cómo determinar si un paquete TCP se envía correctamente

Cómo determinar si un paquete TCP se envía correctamente

1. Interfaz de envío TCP: send()

Las interfaces para que TCP envíe datos incluyen enviar, escribir y enviar mensaje. Estas funciones tienen una entrada unificada en el kernel del sistema, a saber, sock_sendmsg(). Dado que

TCP es una transmisión confiable, es fácil malinterpretar la interfaz de envío de TCP, como sn = send(...);

Se cree erróneamente que el valor de sn significa que se han enviado Sn bytes de datos al extremo receptor. De hecho, este no es el caso.

Sabemos que el envío y la recepción de TCP tienen buffers correspondientes en el kernel (linux):

struct sock{

...

struct sk_buff_headceived_queue; //Cola de datagramas recibida

struct sk_buff_head write_queue; //Cola de datagramas a enviar

...

}

Para el extremo de envío, el espacio de usuario llama a send(data) y otras interfaces de envío para enviar los datos, y el kernel copiará los datos al búfer correspondiente al socket en el espacio del kernel, es decir, sock.write_queue . El valor de retorno de la función send() solo representa el número de bytes copiados con éxito en esta llamada send() (la cola del buffer de calcetín correspondiente al espacio de usuario->espacio del kernel). La recepción específica de los extremos emisor y receptor se completa mediante el protocolo TCP. Aunque TCP es una transmisión confiable, la premisa es que las redes del extremo emisor y el extremo receptor están conectadas; de lo contrario, lo comprenderá. De esta manera, los usuarios que llaman a send () para enviar, si quieren determinar si el receptor aceptó los datos con éxito, deben confiar en otros métodos para realizar la consulta.

2. Bloqueo y no bloqueo de Send()

Como se mencionó anteriormente, sn=send(data) es responsable de copiar los datos al espacio del kernel y se completa el envío específico. por tcp. (Esto incluye control de flujo, etc.). Bloqueado y sin bloqueo son solo durante el período durante el cual los datos se copian del espacio vacío al búfer de envío en el espacio del kernel.

1. Si el espacio restante del búfer de envío es mayor que el número de bytes de datos que se enviarán, los datos se pueden copiar con éxito al búfer del núcleo para fines de bloqueo y no bloqueo, y el sn devuelto es igual al número de datos que se enviarán. Número de bytes.

2. Si el espacio restante del búfer de envío es menor que el número de bytes de datos a enviar,

a. Entonces el modo de bloqueo se bloqueará, espere a que se libere. espacio del búfer del kernel y luego continúe enviando los datos Copiar al búfer del kernel hasta que se copien todos. Devuelve rn, que es la cantidad de datos.

b. Modo sin bloqueo, regresa inmediatamente cuando se llena el búfer de envío del kernel. rn es igual a la cantidad de datos que se han copiado en el búfer de envío.

3. ¿Cómo determinar si los datos se han recibido correctamente?

1. El extremo receptor responde con información de respuesta.

Este método es relativamente tosco, pero también más práctico.

2. Calcula la cantidad de datos enviados por el calcetín del extremo emisor