본문 바로가기
리눅스&OS

tcp 네트워크 timer를 통해 리눅스 커널에서 소켓 끊는 현상 확인하기

by developer's warehouse 2024. 1. 5.

 

netstat -o 명령은 네트워크 연결, 라우팅 테이블, 인터페이스 통계 등을 보여주는데, -o 옵션은 연결별 타이머를 보여줍니다. 이를 통해 각 연결의 상태와 해당 연결에 대한 정보를 얻을 수 있습니다.

tcp 네트워크 timer를 통해 리눅스 커널에서 소켓 끊는 현상 확인하기 썸네일

다음은 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)

 

facebook twitter kakaoTalk kakaostory naver band shareLink