운영체제/Linux

[Linux] netstat - 리눅스 네트워크 연결 정보

민돌v 2023. 9. 1. 15:43
해당 포스팅은 인프런 "리눅스 성능 분석 시작하기" 를 수강하고 정리한 글입니다 :)
  • 리눅스 기반 os 에서 돌아가는 서버 시스템의 성능 측정 및 장애 대응에 대한 학습 내용 정리 글 입니다.

 

💡 리눅스 성능 분석의 기본 명령어

명령어 역할
uptime 시스템 가동 시간, Load Average 확인
dmesg 커널 메세지 확인 (OOME 발생 여부, SYN Flooding 여부)
free 메모리 사용 현황 확인
df 디스크 여유 공간 및 inode 공간 확인
top 프로세스들의 상태, CPU 사용률, 메모리 사용률 확인
netstat 네트워크 연결 정보 확인
tcpdump 네트워크 트러블 슈팅 분석을 위한 패킷 수집 명령어

 

 


📌 netstat 명령어

  • 'netstat' 은 네트워크 연결정보를 위해 사용되는 명령어 입니다.
    • Local Address : 로컬 주소
    • Foreign Address : 상대방 주소
    • state : 소켓 상태
    • PID/Program name : 리눅스 서버에서 어떤 프로세스가 해당 연결을 사용하고 있는지

 

sudo netstat -napo

결과하면

 

연결되어있는 네트워크 소켓을 확인할려면 grep -i est (establish) 명령어를 하면 됩니다.

sudo netstat -napo | grep -i est

소켓이 establish 상태인 것만 확인


 

✔️ State : 소켓 상태

 syn_sent, syn_receive 는 상당히 빨리 지나가기 때문에 가장 자주 보게 될 상태는 아래 3개 입니다
  1. LISTEN : 통신이 이루어지기 위해 누군가 소켓을 "듣고" 있는 상태
  2. ESTABLUSHED : 연결된 상태
  3. TIME_WAIT : 특정 시간동안 추가 요청이 들어오지 않은 상태

 

ex)

1. LISTEM 상태인 소켓에 telnet 으로 연결을 시도하면 → 해당 소켓 상태가 정상적으로 연결되면서 ESTABLISHED 로 변경됩니다.

established

2. 그 다음 정상적으로 연결된 후, 아무런 행동을 취하지 않으면, 소켓 상태가 TIME_WAIT으로 변경됩니다.

 

✔️ TIME WAIT 이 되는 이유

📌 Keepalive_timeout 

  • HTTP/1.1 스펙 중 하나이며 연결을 유지하는 설정 때문에 타임아웃이 발생합니다.
  • → Nginx 의 conf 파일의 열어보면, keepalive default 값이 65초 로 설정되어있습니다.
  • → keepalive 값에 설정된 시간동안 Nginx 연결된 소켓은 HTTP 요청에 대해 커넥셕을 새로 맺지 않아도 되도록 새로운 요청을 기다립니다.

 

📌 원래 HTTP는 stateless 하기 때문에, 상태를 저장하지 않습니다.

  • 따라서 HTTP/1.0 에서는 연속된 요청에 "연결-종료" → "연결 - 종료" 단건 단건 연결을 했지만
  • 리소스의 지나친 낭비로 인해 HTTP/1.1 에서 부터는 KeepAlive 설정값을 추가하여 일정한 시간이 지나면 연결을 종료시키도록 동작한다고 합니다.

 

→ 즉, TIME_WAIT 상태가 문제가 되는 상황은 아닙니다.


 

📌정리

  1. netstat 명령을 이용해서 네트워크 연결 정보를 확인할 수 있습니다.
    • 커넥션의 상태와 종단 간 IP 정보 등 서버의 네트워크 연결 정보를 확인할 수 있습니다.
  2. LISTEN, ESTABLISHED, TIME_WAIT 은 흔히 만나게되는 소켓 상태이므로 → 많이 보인다고해서 문제가 발생하지는 않습니다.
  3. 단, CLOSE_WAIT 상태가 발생한다면 어딘가에서 타임루프가 생성되어 커넥션 종료를 위한 4-way handshake 가 정상적으로 동작하지 않는 것이므로 반드시 조치가 필요하다고 합니다.