Ya hemos hablado en algunas ocasiones del establecimiento de una conexión TCP. También otros aspectos de TCP dentro de los artículos básicas al respecto:
Seguimos con dicho estudio básico de protocolos. En esta ocasión veremos el cierre de la conexión TCP a través de las capturas con Wireshark.
Cierre de una conexión TCP.
Vimos, en su momento, que para establecimiento de una conexión TCP se usa una negociación a 3 pasos. (thee-way handshake), sin embargo, para el cierre de la conexión se usará una negociación a 4 pasos (four-way handshake). Lo vemos de forma resumida realizando un Flow Graph en nuestra captura Wireshark:
La desconexión la puede iniciar cualquiera de los dos host involucrados en la conexión. Al ser full-fuplex la comunicación, es necesario cerrar cada uno de los dos sentidos de forma independiente.
En un cierre normal y ordenado, el host cliente es el que inicia el cierre. Existen otras dos formas báscas de finalización o cierre de conexión:
- El host remoto y no el cliente es el que inicia el cierre.
- Ambos host inician el cierre de forma simultánea.
Vamos a ver el primer caso. Es el host cliente es el que inicia el proceso de cierre de conexión.
Nos basaremos en la siguiente captura:
Se realiza de la siguiente forma:
- Paquete nº 2. El cliente no tiene más datos que transferir, envía entonces un segmento TCP con el bit FIN activado a lque le acompaña un ACK . Libera la conexión en su sentido. De esta forma se le informa al host remoto o servidor que no tiene más datos que enviar. Con el ACK se identifica de forma unívoca la conexión establecida entre los dos hosts:
Vemos los flags FIN y ACK activados. El ACK se establece en 1 de forma relativa. No continene ningún dato. Número de sequencia = 1.
- Paquete nº 3. El host remoto o servidor recibe el segmento TCP con el FIN activado y envía al host que inició el cierre (cliente) confirmación de la recepción. Es decir, envía un ACK con valor ACK recibido + 1, ACK = 2. De momento no libera, no cierra la conexión establecida. Tan solo confirma la petición iniciada por el cliente:
Vemos en la captura el ACK establecido a 2 que se envia confirmando la recepción del FIN.
- Paquete nº 4. El host servidor ya ha confirmado en el paquete 3 la rececpción del FIN por parte del cliente, ahora envía un FIN ACK al cliente ya que, como hemos dicho, la transmisión es full-duplex y también el host remoto o servidor debe cerrar su sentido de la conexión:
Vemos los flgas FIN ACK activados. Y el valor de ACK = 2. Número de sequencia = 1.
- Paquete nº 5. El host cliente recibe el FIN y y envía su correspondiente confirmación en forma de ACK activado. Aún habiendo ya cerrado su sentido de la conexión, debe confirmar la recepción del FIN. El servidor o host remoto recibe el ACK con numero de sequencia 2 y valor ACK = 2. La conexión se cierra y los recursos que se han usado en la conexión se liberan:
Podría pasar que una conexión puediera estar «medio abierta».Esto ocurre en el caso que uno de los hosts cierre la conexión pero el otro no. El host que cerró la conexión no puede enviar más datos pero el otro host si.
Sinceramente quiero agradecerte por el gran aporte intelectual que haces a la sociedad.
Es valiosisimo el trabajo que te tomas para explicar cada uno de los temas y es mas que util, por lo menos para mi.
Desde ya muchisimas gracias y ojala que sigas posteando muchas veces mas!!
Gracis Patricio por tu comentario. Así da gusto seguir con el blog.
Wooow, tengo un trabajo sobre sniffer y creeme q me has ayudado un monton con cada uno de los procesos, te lo agradezco mucho, de forma clara y pedagogica, muy bueno!
Gracias Pablo por tus comentarios y por leerme.
Buenas!
una dudilla sino te importa.
Siempre que se abre una conexion TCP hay que cerrarla despues de usarla?por ejemplo en HTTP ya sea persistente o no?????
Un saludo y gracias!!
David,
Tú mismo David puedes comprobarlo. Con Wireshark, por ejemplo, estableces un filtro de visualización, por ejemplo: ip.addr==xx.xx.xx.xx (la IP que sea del un determinado sitio web) te conectas a el mediante navegador y observa cuando el cliente (tú) envía al servidor (sitio web) un segmento con FIN+ACK, la respuest adel servidor, etc. Prueba con ditintos sitios.
Tengo una pregunta, y es por qué es necesario el cierre de la conexión en el protocolo TCP y no simplemente se dejan de enviar segmentos entre cliente y servidor, es decir, que dejen la conexion inactiva.
Excelente, tengo una exposicion, y esos temas estan confusos de comprender, bueno, hasta que lo vi aqui jajaja
Gracias!!!
Gracias Enrique, me alegro que te sirvan los artículos del blog. Saludos.
Hola Alfon, me gustaría saber si el cierre de la conexiòn es simultanio habria dos
paquetes seguidos con [FIN,ACK] y el ultimo por parte del que inició la comunicación con unicamente [ACK]. Gracias y me gustaría saber como has aprendido tanto.
Buenas, tengo una duda/pregunta que no se muy bien como resolver, estoy haciendo una práctica sobre el protocolo TCP y hay una pregunta en el cuestionario que dice que por qué en la captura que nos ha colgado el profesor no se ve el cierre de la conexión, puede ser por una conexión semi-abierta donde uno de los extremos pierde la conexión por una pérdida de alimentación por ejemplo???
Gracias!
Tengo una duda, que pasa si hay un [PSH,ACK]. Que me está informando eso? Muchas gracias
trabajo en telecomunicaciones y estos analisis me parecen muy valiosos. gracias