Netstat для Linux: Перевірка стану TCP-з’єднань просто та швидко
TCP (протокол керування передачею) — це стандарт, який визначає, як мережеве спілкування між двома системами встановлюється та підтримується для полегшення обміну даними між програмами. Інтернет-протокол (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 проти ss у 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 проти ss у Linux. Ви також можете отримати список процесів у певному стані, надіславши вихід до grep. Наприклад, щоб отримати процеси в стані CLOSE WAIT, використовуйте # netstat -apn | grep CLOSE_WAIT
Ви можете додатково відфільтрувати цей вихід, щоб отримати ідентифікатор процесів у стані CLOSE WAIT.
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
Зразок результату:
Дякуємо за ваш час.