Cómo entender SYN desde el código fuente del kernel de Linux
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...