Что означает LAST_ACK как значение состояния в netstat?

15

Если сервер Windows имеет несколько тысяч открытых портов LAST_ACK(как показывает netstat), что это может означать? Это потому, что одна конечная точка ожидает ответа другой?

Ник Болтон
источник

Ответы:

10

Состояние last_ack (если я правильно помню мой стек TCP) - это состояние, когда вы получили сообщение FIN, чтобы закрыть соединение от вашего соседа, но вам все равно нужно сбросить и закрыть соединение. Вы отправляете финальный FIN самостоятельно и ждете подтверждения.

Обычно зависание в last_ack означает, что ваше приложение сохраняет сокет открытым, даже когда другой конец завершил отправку данных. Это может произойти по нескольким причинам. Там может быть брандмауэр или другой балансировщик нагрузки, который теряет последний ACK от клиента и оставляет вас застрявшим в состоянии last_ack. Если время соединения не истекло через несколько минут (10 или около того), возможно, у вас ошибка.

Посмотрите на диаграмму состояний по адресу http://tangentsoft.net/wskfaq/articles/debugging-tcp.html

pehrs
источник
4
Неправильно. Вы описываете CLOSE_WAIT.
user207421
4

LAST_ACK - последнее состояние перед закрытием соединения TCP.

Имо
источник
1
Спасибо, что может привести к зависанию порта в этом состоянии?
Ник Болтон
Является ли это веб-сервером IIS (или другой службой), который вы видите в этом, или в вашем собственном приложении?
Имо
Приложение реализует клиент XML-RPC «Cook Computing» (из Asp.Net, запускается через IIS) и взаимодействует с сервером Java XML-RPC.
Ник Болтон
1
Это заключительные этапы TCP-разговора с клиентом. Ваша программа закрывает () сеанс TCP и отправляет LAST_ACK клиенту. Затем клиент должен отправить обратно подтверждение, что LAST_ACK был получен. Я согласен с pehrs в том, что клиент (возможно, брандмауэр), возможно, не подтвердил его, или пакет, возможно, был потерян ... это два наиболее вероятных случая.
Imo
1
Он не «отправляет LAST_ACK клиенту». Он отправляет FIN и в настоящее время ожидает ACK, уже получив FIN и отправив ACK. Это последнее состояние после закрытия соединения.
user207421
2

LAST_ACK означает, что ваш конец получил FIN от однорангового узла, отправил ACK, отправил FIN и ожидает окончательного ACK от однорангового узла. На данный момент приложение ничего не может сделать: сокет закрыт. Приложение может даже выйти. Начиная с этого момента, TCP может повторно отправлять FIN до тех пор, пока не получит окончательный ACK или не истечет время ожидания. Как администратор, вы мало что можете сделать, кроме как исследовать сеть.

user207421
источник
0

Я считаю, что @lmo правильно сказал, что это «последнее состояние перед закрытием TCP-соединения», но в дополнение к этому, основываясь на моем чтении страницы википедии, стоит отметить, что это не является частью « Механизм «Активное закрытие», который (в моем понимании) является окончанием большинства хорошо управляемых соединений, а скорее частью последовательности «Пассивное закрытие», которая предположительно связана с плохим случаем.

(FWIW, я - языки, а не сети. Я был бы рад получить разъяснения от сетевого человека.)

Джон Клементс
источник
Он не прав, говоря об этом, и нет ничего плохого в пассивном закрытии. Это просто означает, что пэр закрылся раньше вас.
user207421