Red de conocimiento informático - Conocimiento informático - Cómo entender SYN desde el código fuente del kernel de Linux

Cómo entender SYN desde el código fuente del kernel de Linux

El estado SYN_RECV, como sugiere el nombre, es el estado que debe establecerse al recibir un paquete SYN. Con respecto al estado SYN_RECV, algunos libros de texto me engañaron en el pasado. Tengo entendido que el servidor debe establecer este estado después de recibir el paquete SYN. No he pensado detenidamente en el estado del socket. Recientemente miré la implementación del protocolo de enlace de tres vías en el kernel de Linux y luego pensé detenidamente en este problema. socket en lugar de monitorear el estado del socket.

Por lo general, los paquetes SYN solo se utilizan en el protocolo de enlace de tres vías TCP. El proceso común del protocolo de enlace de tres vías TCP (por supuesto, hay conexiones simultáneas,

semiconexiones, etc.) es el siguiente:

Paquete SYN del cliente---. -gt; servidor

2. Cliente lt;--paquete SYN/servidor de paquetes ACK

3. Paquete ACK del cliente----gt;servidor

Según el diagrama de estado de TCP, corresponde a los siguientes cuatro cambios de estado

a El cliente completa el envío y el estado cambia a SYN_SEND;

b. envía un paquete de confirmación y un paquete SYN, y el estado cambia. Para SYN_RECV

c, el cliente envía un paquete de confirmación y el estado cambia a ESTABLECIDO

d. cambia a ESTABLECIDO

En el kernel de Linux, el estado anterior corresponde a En TCP_SYN_SEND, TCP_SYN_RECV, TCP_ESTABLISHED.

El estado SYN_RECV se describe en RFC793 de la siguiente manera:

SYN-RECEIVED: indica que se está esperando la confirmación de la conexión después de recibir y enviar la

solicitud de conexión

Solicitar confirmación.

Como se puede ver en lo anterior, este estado se establece cuando el extremo local espera una respuesta del otro extremo después de recibir y enviar una solicitud de conexión. Por lo tanto, en esencia, el proceso de conexión es un proceso de ida y vuelta de solicitudes y respuestas de ambas partes, lo que debería denominarse un protocolo de enlace de cuatro vías. Sin embargo, las aplicaciones comunes se realizan en modo c/s, mientras que Linux, incluida la mayoría, se ejecuta. sistemas, utiliza server La respuesta y la solicitud del final se encapsulan en un paquete.

Pero en el kernel de Linux, crea el socket de conexión y lo inicializa al estado TCP_SYN_RECV después de que el socket de escucha recibe el paquete ACK del cliente. La relación de llamada a la función es la siguiente:

tcp_v4_rcv--gt; tcp_v4_hnd_req--gt; tcp_v4_hnd_req--gt; q- -gt;tcp_check_req--gt;

tcp_v4_syn_recv_sock--gt;tcp_create_openreq_child...