운영체제/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
✔️ State : 소켓 상태
syn_sent, syn_receive 는 상당히 빨리 지나가기 때문에 가장 자주 보게 될 상태는 아래 3개 입니다
- LISTEN : 통신이 이루어지기 위해 누군가 소켓을 "듣고" 있는 상태
- ESTABLUSHED : 연결된 상태
- TIME_WAIT : 특정 시간동안 추가 요청이 들어오지 않은 상태
ex)
1. LISTEM 상태인 소켓에 telnet 으로 연결을 시도하면 → 해당 소켓 상태가 정상적으로 연결되면서 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 상태가 문제가 되는 상황은 아닙니다.
📌정리
- netstat 명령을 이용해서 네트워크 연결 정보를 확인할 수 있습니다.
- 커넥션의 상태와 종단 간 IP 정보 등 서버의 네트워크 연결 정보를 확인할 수 있습니다.
- LISTEN, ESTABLISHED, TIME_WAIT 은 흔히 만나게되는 소켓 상태이므로 → 많이 보인다고해서 문제가 발생하지는 않습니다.
- 단, CLOSE_WAIT 상태가 발생한다면 어딘가에서 타임루프가 생성되어 커넥션 종료를 위한 4-way handshake 가 정상적으로 동작하지 않는 것이므로 반드시 조치가 필요하다고 합니다.