TCP (Transmission Control Protocol) — это стандарт, определяющий, как устанавливается и поддерживается сетевой диалог между двумя системами для упрощения обмена данными между приложениями. Интернет-протокол (IP) определяет, как системы отправляют пакеты данных друг другу.
Состояния TCP в Linux
Ниже приведен список состояний TCP-подключения, которые можно просмотреть с помощью команды netstat или ss в Linux.
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.
Для разницы в использовании между командами ss и netstat, проверьте netstat vs ss use guide on Linux. Используйте команду ниже, чтобы проверить все состояния TCP приложений на вашем сервере Linux, она даст вам количество процессов в каждом состоянии.
# netstat -nat | awk '{print $6}' | sort | uniq -c | sort -r 8959 CLOSE_WAIT 887 FIN_WAIT2 6 SYN_RECV 5597 TIME_WAIT 472 ESTABLISHED 24 LISTEN 1 SYN_SENT 1 Foreign 1 FIN_WAIT1 1 established) 183 LAST_ACK
Чтобы понять параметры, используемые в команде, прочтите руководство по использованию netstat vs ss в Linux. Вы также можете получить список процессов в определенном состоянии, передав вывод в grep. Например, чтобы получить процессы в состоянии CLOSEСостояние WAIT, используйте # netstat -apn | grep CLOSE_WAIT
Вы можете дополнительно отфильтровать этот вывод, чтобы получить идентификатор процесса в CLOSE.Состояние ОЖИДАНИЯ.
netstat -apn | grep CLOSE_WAIT | awk '{ print $7 }' | sort | uniq -c | sort -nr
Если вы хотите ограничить вывод 10 первыми процессами с состоянием TCP-соединения CLOSE_WAIT, используйте head
# netstat -apn | grep CLOSE_WAIT | awk '{ print $7 }' | sort | uniq -c | sort -nr | head -n 10 3856 8166/jsvc.exec 1783 15643/jsvc.exec 1313 26749/jsvc.exec 1203 11450/jsvc.exec 563 22495/jsvc.exec 270 6698/jsvc.exec 229 22625/jsvc.exec 9 9729/jsvc.exec 2 32038/httpd 2 29352/httpd
Это показывает, что процесс с идентификатором 8166 имеет 3856 состояний соединения CLOSE_WAIT.
Если у вас не хватает TCP-подключений или вы занимаетесь устранением неполадок, вам может потребоваться идентифицировать этот процесс с большим количеством состояний соединения CLOSE_WAIT. Это может означать, что приложение не закрывает соединения, как ожидалось.
# ps 8166 PID TTY STAT TIME COMMAND 8166 ? Sl 242:29 jsvc.exec -debug -pidfile /var/run/myapp.pid myapp.jar
Я создал простой bash-скрипт, который использует командуnetstat
для определения количества состояний TCP-соединения и процессов с большим количеством состояний CLOSE_WAIT
.
#!/bin/bash # Script to print Linux TCP connections using netstat # Github: https://github.com/jmutai # # vvvv vvvv-- the code from above RED='\033[0;31m' NC='\033[0m' # No Color echo "" echo -en "${RED} ALL TCP Connections Count: ${NC}\n" netstat -nat | awk '{print $6}' | sort | uniq -c | sort -r echo "" echo -en "${RED} Top CLOSE_WAIT state TCP Connections: ${NC}\n" netstat -apn | grep CLOSE_WAIT | awk '{ print $7 }' | sort | uniq -c | sort -nr | head -n 10
Пример вывода: