Я использую netstat
проверять мое состояние порта.
Я задавался вопросом, каково различие между состоянием порта LISTENING
, TIME_WAIT
, CLOSE_WAIT
, FIN_WAIT1
и ESTABLISHED
?
Страница справочника netstat
имеет краткое описание каждого состояния:
ESTABLISHED
The socket has an established connection.
SYN_SENT
The socket is actively attempting to establish a connection.
SYN_RECV
A connection request has been received from the network.
FIN_WAIT1
The socket is closed, and the connection is shutting down.
FIN_WAIT2
Connection is closed, and the socket is waiting for a shutdown
from the remote end.
TIME_WAIT
The socket is waiting after close to handle packets still in the
network.
CLOSE The socket is not being used.
CLOSE_WAIT
The remote end has shut down, waiting for the socket to close.
LAST_ACK
The remote end has shut down, and the socket is closed. Waiting
for acknowledgement.
LISTEN The socket is listening for incoming connections. Such sockets
are not included in the output unless you specify the
--listening (-l) or --all (-a) option.
CLOSING
Both sockets are shut down but we still don't have all our data
sent.
UNKNOWN
The state of the socket is unknown.
Можно использовать диаграммы изменения состояний (примеры здесь, здесь и здесь), чтобы иметь лучший смысл состояний.
Рассмотрите две программы, делая попытку сокетного соединения (назовите их a
и b
). Оба настроенные сокеты и переход к LISTEN
состояние. Затем одна программа (говорят a
) попытки соединиться с другим (b
). a
отправляет запрос и входит SYN_SENT
состояние, и b
получает запрос и входит SYN_RECV
состояние. Когда b
подтверждает запрос, они входят ESTABLISHED
состояние, и ведет их бизнес. Теперь несколько вещей могут произойти:
a
пожелания закрыть соединение, и входят FIN_WAIT1
. b
получает FIN
запросите, отправляет ACK
(затем a
входит FIN_WAIT2
), входит CLOSE_WAIT
, говорит a
это закрывается и введение LAST_ACK
. Однажды a
подтверждает это (и входит TIME_WAIT
), b
входит CLOSE
. a
ожидает немного, чтобы видеть, оставляют ли anythings, то входят CLOSE
.a
и b
закончили их бизнес и решают закрыть соединение (одновременное закрытие). Когда a
находится в FIN_WAIT
, и вместо того, чтобы получить ACK
от b
, это получает a FIN
(как b
пожелания закрыть его также), a
входит CLOSING
. Но существуют все еще некоторые сообщения для отправки ( ACK
это a
как предполагается, добирается для его оригинала FIN
), и однажды это ACK
прибывает, a
входит TIME_WAIT
как обычно.