Primero estudié el especialista en comunicaciones. Después de graduarse, mis compañeros de clase se separaron de sus sueños y viajaron entre sitios de construcción de todos los tamaños. Jaja, es broma, también hay algunas personas increíbles que ingresaron a un cierto instituto de investigación, ¿eh? Su padre no es el director, por lo que no debería estar demasiado oscuro por dentro. Recuerdo que había un curso de muy alto nivel llamado Computer Network (probablemente este nombre). Hay un concepto sobre el apretón de manos, y ahora revíselo.
Echemos un vistazo al esquema primero:
TCP está orientado a la conexión. No importa en qué dirección la otra parte envíe datos, se debe establecer una conexión entre las dos partes. En el protocolo TCP/IP, el protocolo TCP proporciona servicios de conexión confiables, y la conexión se inicializa a través de tres apretones de manos. El propósito del apretón de manos de tres vías es sincronizar el número de serie y el número de confirmación de ambas partes y la información del tamaño de la ventana TCP de intercambio.
1. Primer apretón de manos: establecer una conexión. El cliente envía un segmento de mensajes de solicitud de conexión, establece la posición SYN en 1 y el número de secuencia es x; Luego, el cliente ingresa al estado SYN_SEND y espera a que el servidor lo confirme;
2. Segundo apretón de manos: el servidor recibe el segmento de mensajes SYN. Cuando el servidor recibe el segmento de mensajes SYN del cliente, debe confirmar el segmento de mensajes SYN y establecer el número de reconocimiento en X+1 (número de secuencia+1); Al mismo tiempo, también necesita enviar la información de la solicitud SYN, establecer la posición SYN en 1 y el número de secuencia a Y; El servidor coloca toda la información anterior en un segmento de paquetes (es decir, el segmento de mensajes SYN+ACK) y la envía al cliente. En este momento, el servidor ingresa al estado syn_recv;
3. El tercer apretón de manos: el cliente recibe el segmento de paquetes SYN+ACK del servidor. Luego establezca el número de reconocimiento en Y+1 y envíe un segmento de mensajes ACK al servidor. Después de enviar el segmento de mensajes, tanto el cliente como el servidor ingresan al estado establecido y completan el apretón de manos TCP Tres veces.
Después de completar tres apretones de manos, el cliente y el servidor pueden comenzar a transmitir datos. Lo anterior es la introducción general al tres veces apretón de manos de TCP.
¿Qué pasa con esas cuatro olas?
Después de que el cliente y el servidor establecen una conexión TCP a través de tres apretones de manos, cuando se completa la transmisión de datos, la conexión TCP debe desconectarse. Luego hay un misterioso "cuatro olas" aquí para la desconexión de TCP.
1. La primera ola: host 1 (se puede usar como cliente o como servidor), configure el número de secuencia y el número de reconocimiento, y envíe un segmento de mensajes FIN al host 2; En este momento, el host 1 ingresa al estado FIN_WAIT_1; Esto significa que el host 1 no tiene datos que se enviarán al host 2;
2. La segunda ola: el host 2 recibió el segmento de mensajes FIN enviado por el host 1, y devolvió un segmento de mensajes ACK al host 1. El número de reconocimiento es el número de secuencia más 1; El host 1 ingresa al estado FIN_WAIT_2; El host 2 le dice al host 1 que no tengo datos para enviar, para que pueda cerrar la conexión;
3. La tercera ola: el host 2 envía un segmento de mensajes FIN para alojar 1, solicitando cerrar la conexión, y al mismo tiempo, el host 2 ingresa al estado Close_Wait;
4. La cuarta ola: el host 1 recibe el segmento de mensajes de fin de aleta enviado por el host 2, envía el segmento de mensajes ACK al host 2, y luego el host 1 ingresa al estado Time_Wait; Después de que el host 2 recibe el segmento de mensajes ACK del host 1, cierra la conexión; En este momento, el host 1 todavía no recibe una respuesta después de esperar 2MSL, demuestra que el lado del servidor se ha cerrado normalmente, por lo que está bien, el host 1 también puede cerrar la conexión.
En este punto, las cuatro olas de TCP se completaron felizmente. Cuando vea esto, tendrá muchas preguntas en su mente, mucho no lo entiende, y se siente desordenado; Está bien, sigamos resumiendo.
¿Por qué necesitas estrechar la mano tres veces?
El llamado apretón de manos de tres vías significa establecer una conexión TCP, lo que significa que al establecer una conexión TCP, el cliente y el servidor deben enviar un total de 3 paquetes para confirmar el establecimiento de la conexión. En la programación de socket, este proceso es activado por el cliente que ejecuta Connect.
Desde que resumimos los tres apretones de manos de TCP, ¿por qué tenemos que hacer tres veces? ¿Por qué creemos que podemos completarlo en dos veces? Entonces, ¿por qué TCP tiene que hacer tres conexiones? Esto es lo que dijo Xie Xiren en la "red informática":
Para evitar que el segmento de solicitud de conexión fallido se transmitiera repentinamente al servidor, se produce un error.
En el libro, se da un ejemplo como sigue:
La generación de "segmento de solicitud de conexión fallido" es en tal caso: el primer segmento de solicitud de conexión enviado por el cliente no se pierde.
En cambio, permanece en un determinado nodo de red durante mucho tiempo, lo que resulta en retrasos hasta cierto tiempo después de que se libere la conexión antes de llegar al servidor. Esto fue originalmente un
Hace mucho tiempo fallido en el segmento de mensajes. Sin embargo, después de que el servidor recibió este segmento de mensajes de solicitud de conexión no válido, pensó erróneamente que era nuevo enviado nuevamente por el cliente
solicitud de conexión. Por lo tanto, el segmento de reconocimiento se envió al cliente y acordó establecer la conexión. Suponiendo que no se adopte "tres veces apretón de manos", entonces solo servidor
Emitir una confirmación y se establece la nueva conexión. Dado que el cliente no ha emitido una solicitud para establecer una conexión, la confirmación del servidor no será ignorada.
Tampoco se enviarán datos al servidor. Pero el servidor pensó que la nueva conexión de transporte se había establecido y estaba esperando que el cliente envíara datos. entonces,
Muchos de los recursos del servidor se desperdician. Se puede evitar que el fenómeno anterior ocurra utilizando el "tres veces apretón de manos". Por ejemplo, la situación justo ahora,
El cliente no emitirá reconocimiento al reconocimiento del servidor. Dado que el servidor no puede recibir la confirmación, sabe que el cliente no requiere que se establezca la conexión. "
Esto es muy claro, lo que evita que el servidor espera y desperdicie recursos.
¿Por qué tienes que saludar cuatro veces?
¿Por qué agitas cuatro veces?
El llamado WaveHand de cuatro vías es finalizar la conexión TCP, lo que significa que cuando se desconecta una conexión TCP, el cliente y el servidor deben enviar un total de 4 paquetes para confirmar la desconexión de la conexión. En la programación de socket, este proceso es activado por el cliente o el servidor que ejecuta cierre.
El protocolo TCP es un protocolo de comunicación de la capa de transporte basado en la corriente de byte orientado a la conexión. TCP es el modo dúplex completo, lo que significa que cuando el host 1 envía un segmento de aleta, solo significa que el host 1 no tiene datos para enviar. El host 1 le dice al host 2 que se han enviado sus datos; Sin embargo, en este momento, el host 1 aún puede aceptar datos del host 2; Cuando el host 2 devuelve el segmento ACK, significa que ya sabe que el host 1 no tiene datos que enviar, pero el host 2 aún puede enviar datos al host 1; Cuando el host 2 también envía un segmento de aleta, significa que el host 2 no tiene datos para enviar, y le dirá al host 1 que no tengo datos que se envíen, y luego entre sí interrumpirán esta conexión TCP. Si desea comprender correctamente el principio de cuatro ondas, debe comprender los cambios en el estado durante las cuatro olas.
FIN_WAIT_1: Este estado debe explicarse con cuidado. De hecho, el verdadero significado de los estados FIN_WAIT_1 y FIN_WAIT_2 son esperar el mensaje FIN de la otra parte. La diferencia entre estos dos estados es: el estado FIN_WAIT_1 es en realidad cuando Socket está en el estado establecido, quiere cerrar activamente la conexión y enviar un mensaje FIN a la otra parte. En este momento, el socket ingresa al estado FIN_WAIT_1. Cuando la otra parte responde al mensaje ACK, ingresa al estado FIN_WAIT_2. Por supuesto, en circunstancias normales reales, no importa en qué se encuentre la otra parte, el mensaje ACK debe responder de inmediato al mensaje ACK. Por lo tanto, el estado FIN_WAIT_1 es generalmente difícil de ver, y el estado FIN_WAIT_2 a menudo se puede ver con NetStat. (Fiesta activa)
FIN_WAIT_2: Este estado se ha explicado en detalle arriba. De hecho, el socket en el estado FIN_WAIT_2 significa semi-conexión, es decir, una parte requiere una conexión cercana, pero también le dice a la otra parte que tengo algunos datos que se transmiten (información ACK) por el momento, y luego cierre la conexión más adelante. (Fiesta activa)
Close_wait: El significado de este estado es realmente esperar para cerrar. ¿Cómo entender? Cuando la otra parte cierra un socket y se envía un mensaje de aleta a usted mismo, su sistema sin duda responderá a un mensaje ACK a la otra parte, y luego ingresará al estado Close_Wait. A continuación, lo que realmente debe considerar es verificar si aún tiene datos para enviar a la otra parte. Si no es así, puede cerrar el socket y enviar mensajes de aleta a la otra parte, es decir, cierre la conexión. Entonces, cuando estás en el estado de Close_Wait, lo que debes hacer es esperar a que cierre la conexión. (Lado pasivo)
Last_ack: Este estado es relativamente fácil de entender. Cierra pasivamente el mensaje ACK de la otra parte después de enviar el mensaje FIN. Después de recibir el mensaje ACK, puede ingresar el estado disponible de Cerrado. (Lado pasivo)
Time_wait: significa que se ha recibido el mensaje FIN de la otra parte y se ha enviado el mensaje ACK. Solo espere a que 2MSL regrese al estado disponible de Cerrado. Si está en el estado de FinWait1, al recibir un mensaje con la otra parte con el indicador FIN y el indicador ACK, puede ingresar directamente al estado de Time_Wait sin pasar por el estado FIN_WAIT_2. (Fiesta activa)
Cerrado: indica que la conexión se interrumpe.
Resumir
Lo anterior es todo el contenido de este artículo sobre el principio y el análisis de procesos de tres apretones de manos y cuatro apretones de manos en el protocolo TCP/IP. Espero que sea útil para todos. Si hay alguna deficiencia, deje un mensaje y espere sus valiosas opiniones.