¿Qué significa LAST_ACK como valor de estado en netstat?

15

Si un servidor de Windows tiene varios miles de puertos abiertos en LAST_ACKestado (como lo muestra netstat), ¿qué podría significar esto? ¿Es porque un punto final está esperando que el otro responda?

Nick Bolton
fuente

Respuestas:

10

El estado de last_ack (si recuerdo mi pila TCP correctamente) es el estado en el que recibió su mensaje FIN para cerrar la conexión de su vecino, pero aún necesita vaciar y apagar su conexión. Envías el FIN final tú mismo y esperas un ACK.

Por lo general, colgar en last_ack significa que su aplicación mantiene un socket abierto incluso cuando el otro extremo ha terminado de enviar datos. Esto puede suceder por múltiples razones. Puede haber un firewall u otro equilibrador de carga que pierda el último ACK del cliente y lo deje atascado en el estado last_ack. Si las conexiones no se agotan después de unos minutos (más o menos 10), probablemente tenga un error.

Eche un vistazo al diagrama de estado en http://tangentsoft.net/wskfaq/articles/debugging-tcp.html

pehrs
fuente
44
Incorrecto. Estás describiendo CLOSE_WAIT.
user207421
4

LAST_ACK es el último estado justo antes de cerrar la conexión TCP.

Imo
fuente
1
Gracias, ¿qué puede hacer que un puerto se bloquee en este estado?
Nick Bolton
¿Es este un servidor web IIS (u otro servicio) en el que está viendo esto, o en su propia aplicación?
Imo
La aplicación implementa el cliente XML-RPC "Cook Computing" (de Asp.Net, ejecutado a través de IIS), y está hablando con un servidor Java XML-RPC.
Nick Bolton
1
Son las etapas finales de la conversación TCP con el cliente. Su software busca cerrar () la sesión TCP y envía un LAST_ACK al cliente. El cliente debe enviar un acuse de recibo de que se recibió LAST_ACK. Estoy de acuerdo con los demás en que el cliente (tal vez el firewall) puede no haberlo reconocido o el paquete puede haberse perdido ... estos son los dos casos más probables.
Imo
1
No 'envía un LAST_ACK al cliente'. Envía un FIN y actualmente está esperando un ACK, ya que recibió un FIN y envió un ACK. Es el último estado después de cerrar la conexión.
user207421
2

LAST_ACK significa que su final recibió un FIN del par, envió un ACK, envió un FIN y está esperando el ACK final del par. En este punto, la aplicación no puede hacer nada más: el socket está cerrado. La aplicación incluso puede haber salido. De aquí en adelante, depende de TCP reenviar el FIN hasta que obtenga el ACK final o el tiempo de espera para hacerlo. No puedes hacer mucho como administrador, excepto investigar la red.

usuario207421
fuente
0

Creo que @lmo tiene razón al decir que es "el último estado justo antes de cerrar la conexión TCP", pero además de esto, según mi lectura de la página de Wikipedia, vale la pena señalar que esto no es parte de " Mecanismo de cierre activo "que (según tengo entendido) es el final de la mayoría de las conexiones que se comportan bien, sino más bien parte de la secuencia de" cierre pasivo ", que presumiblemente está asociada con el suceso de cosas malas.

(FWIW, soy idiomas, no redes. Me complacería recibir aclaraciones de una persona de redes).

John Clements
fuente
No tiene razón al decir eso, y no hay nada malo en un cierre pasivo. Solo significa que el compañero cerró antes que tú.
user207421