netstat으로 열린 포트 보기
이론은 충분합니다. 지금 이 컴퓨터에서 어떤 포트들이 열려 있는지 직접 확인해봅니다. netstat는 네트워크 상태를 보여주는 오래된 도구이고, Linux에서는 최신 대안으로 ss를 씁니다. 둘 다 알아두면 어떤 환경에서도 당황하지 않습니다.
기본 명령 실행
# 파일: 터미널
# macOS / Linux
netstat -an
# Linux 에서 더 빠른 대안
ss -tan
-a는 모든 소켓, -n은 IP와 포트를 숫자로 표시(이름 역조회 없음), -t는 TCP만 필터하는 옵션입니다. 화면이 길 수 있으니 파이프로 걸러봅니다.
# 파일: 터미널
# LISTEN 상태인 것만 보기 (macOS/Linux)
netstat -an | grep LISTEN
# Linux ss
ss -tlnp
출력 읽기
출력 예시는 이런 모양입니다.
# 파일: 터미널 출력
Proto Local Address Foreign Address State
tcp 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0.0.0.0:3306 0.0.0.0:* LISTEN
tcp 192.168.1.5:52341 142.250.196.110:443 ESTABLISHED
tcp 192.168.1.5:52345 142.250.196.110:443 TIME_WAIT
Local Address 열은 이 컴퓨터의 주소와 포트를, Foreign Address 열은 상대방 주소와 포트를 보여줍니다. State 열의 값들을 보면 소켓의 현재 상태를 알 수 있습니다.
LISTEN 상태는 이 포트로 연결 요청을 기다리고 있다는 뜻입니다. 0.0.0.0은 이 컴퓨터의 모든 IP 주소에서 받겠다는 의미입니다. 22번이 열려 있으면 SSH 서버가 동작 중이고, 3306번이 열려 있으면 MySQL이 동작 중입니다.
ESTABLISHED 상태는 연결이 맺어져 데이터를 주고받는 중입니다. 지금 브라우저로 어딘가에 접속해 있다면 이 상태의 항목들이 보입니다.
TIME_WAIT 상태는 연결이 끊어지는 과정의 마지막 단계입니다. 잠시 뒤 사라집니다. 14장 3절에서 이 상태가 왜 존재하는지 자세히 다룹니다.
Windows에서 확인
Windows에서도 명령 프롬프트에서 같은 명령이 동작합니다.
# 파일: 명령 프롬프트 (Windows)
netstat -an
netstat -an | findstr LISTENING
-b 옵션을 추가하면 각 포트를 사용하는 프로세스 이름까지 보여줍니다. 단, 관리자 권한이 필요합니다.
# 파일: 명령 프롬프트 (Windows, 관리자 권한)
netstat -anb
포트를 점령한 프로세스 찾기
개발 중 "이미 포트가 사용 중입니다"라는 오류를 만나면, 어떤 프로세스가 그 포트를 쓰고 있는지 찾아야 합니다.
# 파일: 터미널 (Linux/macOS)
# 8080번 포트를 쓰는 프로세스 찾기
lsof -i :8080
# ss로 PID까지 확인 (Linux)
ss -tlnp | grep 8080
lsof는 "list open files"의 약자입니다. 소켓도 파일이므로 소켓을 찾는 데 씁니다. PID(프로세스 ID)가 출력되면 kill -9 PID 명령으로 종료할 수 있습니다.
이것으로 포트와 소켓의 기초를 실습까지 마쳤습니다. 다음 장에서는 본론으로 들어갑니다. TCP가 어떻게 신뢰성을 보장하는지, 그 설계 원리를 하나씩 파헤칩니다.