netstat -o 명령은 네트워크 연결, 라우팅 테이블, 인터페이스 통계 등을 보여주는데, -o 옵션은 연결별 타이머를 보여줍니다. 이를 통해 각 연결의 상태와 해당 연결에 대한 정보를 얻을 수 있습니다.
다음은 netstat -o의 일반적인 출력 예입니다:
Proto Recv-Q Send-Q Local Address Foreign Address State Timer
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN off (0.00/0/0)
여기서 Timer 열은 각 연결에 대한 타이머 정보를 보여줍니다. 이 정보를 통해 연결이 언제 끊어질지 예측할 수 있습니다.
특정 프로세스의 네트워크 상태를 1초마다 확인하는 스크립트는 다음과 같이 작성할 수 있습니다:
#!/bin/bash
while true; do
netstat -o | grep 프로세스명
sleep 1
done
이 스크립트는 netstat -o를 실행하고 그 결과에서 특정 프로세스를 찾습니다. 그런 다음 1초 동안 잠시 멈춘 후 다시 반복합니다. 이 스크립트를 실행하려면 터미널에서 실행 권한을 부여하고 실행해야 합니다:
chmod +x script.sh
./script.sh
이 스크립트는 특정 프로세스의 네트워크 연결 상태를 지속적으로 모니터링하는 데 도움이 될 수 있습니다. 그러나 이 방법은 많은 출력을 생성하므로, 필요한 정보만을 캡처하기 위해 grep 명령을 더욱 세밀하게 조정해야 할 수도 있습니다.
netstat -o의 타이머 열은 두 개의 필드를 가지고 있습니다:
keepalive (6176.47/0/0)
<1번 필드> <2번 필드>
1번 필드는 다음과 같은 값을 가질 수 있습니다:
- keepalive: 소켓에 대한 keepalive 타이머가 켜져 있을 때
- on: 소켓에 대한 재전송 타이머가 켜져 있을 때
- off: 위의 두 가지 중 어느 것도 켜져 있지 않을 때
2번 필드는 세 개의 하위 필드를 가집니다:
(6176.47/0/0) -> (a/b/c)
a=타이머 값 (1번 필드가 "keepalive"일 때 a=keepalive 타이머; 1번 필드가 "on"일 때 a=재전송 타이머)
b=발생한 재전송 횟수
c=보낸 keepalive 프로브의 수
예를 들어, 클라이언트와 서버 사이에 두 개의 소켓을 열었고(루프백이 아님), keepalive 설정은 다음과 같습니다:
KEEPALIVE_IDLETIME 30
KEEPALIVE_NUMPROBES 4
KEEPALIVE_INTVL 10
그리고 클라이언트 머신 종료했으므로, 서버 측에서 netstat을 실행하고 출력은 다음과 같았습니다:
Port1:
netstat -c --timer | grep "192.0.0.1:43245 192.0.68.1:49742"
tcp 0 0 192.0.0.1:43245 192.0.68.1:49742 ESTABLISHED keepalive (1.92/0/0)
tcp 0 0 192.0.0.1:43245 192.0.68.1:49742 ESTABLISHED keepalive (0.71/0/0)
tcp 0 0 192.0.0.1:43245 192.0.68.1:49742 ESTABLISHED keepalive (9.46/0/1)
...
위의 출력에서 keepalive (1.92/0/0)에서 1.92는 keepalive 타이머 값을 나타내고, 첫 번째 0은 발생한 재전송 횟수를 나타내며, 두 번째 0은 보낸 keepalive 프로브의 수를 나타냅니다.
두 번째 연결에서 소켓은 동일했지만, 클라이언트가 다운되고 keepalive가 만료되기 전에 서버 측 애플리케이션이 메시지를 보내려고 했습니다.
netstat -c --timer | grep "192.0.0.1:36483 192.0.68.1:43881" 명령을 실행하면 다음과 같은 결과를 얻을 수 있습니다:
tcp 0 0 192.0.0.1:36483 192.0.68.1:43881 ESTABLISHED keepalive (8.18/0/1)
tcp 0 0 192.0.0.1:36483 192.0.68.1:43881 ESTABLISHED keepalive (7.00/0/1)
...
tcp 0 210 192.0.0.1:36483 192.0.68.1:43881 ESTABLISHED on (0.21/2/2) // <---- 재전송 타이머가 시작됨
tcp 0 210 192.0.0.1:36483 192.0.68.1:43881 ESTABLISHED on (0.68/3/2)
...
위의 출력에서 keepalive (8.18/0/1)에서 8.18은 keepalive 타이머 값을 나타내고, 첫 번째 0은 발생한 재전송 횟수를 나타내며, 두 번째 1은 보낸 keepalive 프로브의 수를 나타냅니다.
on (0.21/2/2)에서 0.21은 재전송 타이머 값을 나타내고, 첫 번째 2는 발생한 재전송 횟수를 나타내며, 두 번째 2는 보낸 keepalive 프로브의 수를 나타냅니다.
따라서 이 출력은 서버 측 애플리케이션이 클라이언트가 다운된 후 메시지를 보내려고 시도하면서 재전송 타이머가 시작되었음을 나타냅니다.
참고로 ss(socket statistics) 명령도 -o 옵션을 통해 timer를 확인할 수 있습니다.
% ss -o |grep ^tcp |head -10
tcp ESTAB 0 0 127.0.0.1:39001 127.0.0.1:53552 timer:(keepalive,9min4sec,0)
tcp ESTAB 0 0 127.0.0.1:40003 127.0.0.1:59198 timer:(keepalive,1.610ms,0)
tcp ESTAB 0 0 127.0.0.1:40001 127.0.0.1:61696 timer:(keepalive,1.706ms,0)
tcp ESTAB 0 0 127.0.0.1:61672 127.0.0.1:29777 timer:(keepalive,120min,0)
tcp ESTAB 0 0 127.0.0.1:48952 127.0.0.1:40005
tcp ESTAB 0 0 127.0.0.1:40006 127.0.0.1:46224 timer:(keepalive,2.170ms,0)
tcp ESTAB 0 0 127.0.0.1:53559 127.0.0.1:39001 timer:(keepalive,1min32sec,0)
tcp ESTAB 0 0 127.0.0.1:40001 127.0.0.1:46224 timer:(keepalive,2.730ms,0)
tcp ESTAB 0 0 127.0.0.1:22777 127.0.0.1:58748 timer:(keepalive,120min,0)
tcp ESTAB 0 0 127.0.0.1:40001 127.0.0.1:48270 timer:(keepalive,2.618ms,0)
'리눅스&OS' 카테고리의 다른 글
리눅스 tcp 커널 파라메터 정리 (1) | 2024.01.05 |
---|---|
리눅스의 man의 Section 설명 및 섹션별 검색 명령어 (0) | 2024.01.05 |
nginx용 docker 이미지 무식하게 만들기 (0) | 2023.12.05 |
Ubuntu(우분투 20.04)에서 Docker를 사용하기 (from Docker hub) (0) | 2023.12.05 |
리눅스 커널(linux kernel) 버전 정보 확인 uname | version | hostnamectl (0) | 2023.11.23 |