Tôi sử dụng netstat
để kiểm tra trạng thái cổng của tôi.
Tôi đã tự hỏi sự khác biệt giữa tình trạng cảng là những gì LISTENING
, TIME_WAIT
, CLOSE_WAIT
, FIN_WAIT1
và ESTABLISHED
?
Tôi sử dụng netstat
để kiểm tra trạng thái cổng của tôi.
Tôi đã tự hỏi sự khác biệt giữa tình trạng cảng là những gì LISTENING
, TIME_WAIT
, CLOSE_WAIT
, FIN_WAIT1
và ESTABLISHED
?
Câu trả lời:
Các manpage của netstat
có một mô tả ngắn gọn về mỗi tiểu bang:
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.
Bạn có thể sử dụng các sơ đồ chuyển trạng thái (ví dụ ở đây , ở đây và ở đây ) để hiểu rõ hơn về các trạng thái.
Hãy xem xét hai chương trình cố gắng kết nối ổ cắm (gọi chúng a
và b
). Cả hai thiết lập ổ cắm và chuyển sang LISTEN
trạng thái. Sau đó, một chương trình (nói a
) cố gắng kết nối với chương trình kia ( b
). a
gửi yêu cầu và vào SYN_SENT
trạng thái, và b
nhận yêu cầu và vào SYN_RECV
trạng thái. Khi b
thừa nhận yêu cầu, họ vào ESTABLISHED
tiểu bang và thực hiện công việc của mình. Bây giờ một vài điều có thể xảy ra:
a
muốn đóng kết nối, và đi vào FIN_WAIT1
. b
nhận được FIN
yêu cầu, gửi một ACK
(sau đó a
nhập FIN_WAIT2
), nhập CLOSE_WAIT
, cho biết a
nó đang đóng và nhập LAST_ACK
. Một khi a
thừa nhận điều này (và nhập TIME_WAIT
), b
nhập CLOSE
. a
Đợi một chút để xem có thứ gì còn lại không, sau đó đi vào CLOSE
.a
và b
đã kết thúc việc kinh doanh của họ và quyết định đóng kết nối (đóng đồng thời). Khi a
ở trong FIN_WAIT
và thay vì nhận một ACK
từ b
, nó sẽ nhận được FIN
(như b
muốn đóng lại), a
nhập vào CLOSING
. Nhưng vẫn còn một số tin nhắn để gửi (cái ACK
mà a
lẽ ra phải lấy cho bản gốc của nó FIN
), và một khi nó ACK
đến, a
sẽ đi vào TIME_WAIT
như bình thường.