netstat
는 "network statistics"의 약자로 네트워크 연결, 라우팅 테이블, 인터페이스 통계 등을 확인할 수 있는 유용한 명령어이다. 주로 시스템의 네트워크 상태를 점검하고 모니터링할 때 많이 사용한다. netstat
명령어를 입력하면, 현재 서버의 네트워크 연결 상태를 확인할 수 있다.
대표적인 옵션에는 다음이 있다.
옵션 | 설명 |
---|---|
-a |
모든 연결과 수신 중인 포트를 보여준다. |
-t |
TCP 연결만 표시한다. |
-u |
UDP 연결만 표시한다. |
-n |
호스트 이름 대신 IP 주소를 숫자로 표시한다. |
-l |
수신 대기 중인 소켓만 표시한다. |
-p |
프로세스의 ID와 이름을 표시한다. |
$ netstat -ant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 172.31.22.162:39806 169.254.169.254:80 TIME_WAIT
tcp 0 384 172.31.22.162:22 13.209.1.56:53874 ESTABLISHED
tcp 0 0 172.31.22.162:22 13.209.1.57:48444 ESTABLISHED
tcp6 0 0 :::22 :::* LISTEN
필자는 -anp
조합을 많이 사용하고 있다. 서비스를 시작했을 때 정상적으로 띄워졌는지, 포트 리스닝은 잘 하고 있는지 등 상태를 판단하기 위해 사용할 수 있다. 다음과 같이 명령어를 사용하면 현재 시스템의 모든 네트워크 연결과 포트, pid와 ip를 확인할 수 있다.
$ netstat -anp
특히 grep
과 함께 사용하여 원하는 포트나 상태만을 필터링하기에 좋다.
$ netstat -anp | grep LISTEN
$ netstat -anp | grep 8080
자주 사용하는 옵션을 정리하면 다음과 같다.
# 연결을 기다리는 목록과 프로그램을 보여준다
netstat -anp
# 특정 포트가 사용 중에 있는지 확인한다.
netstat -anp | grep 포트번호
# TCP listening 상태의 포트와 프로그램을 확인한다.
netstat -nlpt
실무를 하면서 네트워크 공부의 중요성을 정말 많이 느끼고 있는데, 그렇게 느끼게 된 여러 포인트 중 하나가 바로 이 netstat
명령어를 사용하면서이다. netstat
를 통해 각 네트워크 연결의 상태를 확인할 수 있으며, 이는 TCP 3-way Handshake와 아주 밀접한 연관이 있다.
많은 사람들이 취준을 위해 네트워크 CS를 공부하면서, TCP 3-way handshake에 대해 알아보고 이해하고, 암기해봤으며, 다음 프로세스에 대해 익히 알고있을 것이라 생각한다.
필자도 3-way hanshake에 대해 공부하고 블로그에 정리까지 했었다.
netstat
는 다음과 같이 3가지 상태(state)를 갖는다.
LISTEN
LISTEN
상태는 프로세스가 특정 포트에서 클라이언트의 연결 요청을 기다리는 상태로, 3-way handshake의 첫 번째 단계인 SYN
패킷을 수신하기 위한 준비 상태이다.
ESTABLISHED
클라이언트와 서버 간의 연결이 성공적으로 설정된 상태로, 3-way handshake가 완료된 후의 상태이다. 이 상태에서 데이터 전송이 이루어진다.
TIME_WAIT
연결이 종료된 후 일정 기간 유지되는 상태로, 이전 연결에 대한 패킷이 남아 있을 수 있으므로 이를 처리하기 위한 시간이다. 이는 3-way hanshake 과정에서 연결을 종료하는 단계와 관련이 있다.
예를 들어 localhost의 8443 포트가 LISTEN
상태라는 것은, 8443 포트에서 실행 중인 프로세스가 클라이언트의 요청을 기다리고 있다는 것을 의미한다. 즉, 8443 포트에서 실행되는 프로세스가 있을 때, 해당 프로세스가 잘 띄워졌는지를 확인하기 위해 LISTEN
상태인 지를 체크해볼 수 있는 것이다.
또한 localhost의 8080 포트와 클라이언트 IP가 ESTABLISHED
상태라는 것은, 프로세스와 클라이언트 간의 연결이 성공적으로 설정되었음을 의미한다. 즉, 네트워크 상에 문제는 없다는 것이다.
netstat
명령어는 이처럼 LISTEN
ESTABLISED
TIME_WAIT
를 통해 네트워크의 상태를 모니터링하고 문제를 진단하는 데 유용하게 사용할 수 있다.