[리눅스] socket의 상태를 확인 - netstat 명령어 개념과 사용 방법 모음
리눅스 네트워크 프로그래밍에 관한 더 많은 정보와 예제를 담은 리눅스 교재를 배포했습니다. 아래의 페이지에서 리눅스 교재를 받아가세요.
https://reakwon.tistory.com/233
netstat
네트워크의 connection, routing table, interface 통계 등 네트워크 전반의 정보들을 나타내어주는 명령어입니다. netstat 명령어를 사용함으로써 시스템의 port들이 어떤 상태인지를 확인할 수 있게 됩니다. 예를 들어 현재 서버에서 socket이 열려서 client의 연결을 대기 중인 상태라면 listen 상태가 됩니다.
netstat을 어떻게 사용하는 지 알아봅시다.
기본적으로 netstat만을 사용하면 열린 모든 socket들에 대해서 보여줍니다. 그런데 기본적으로 LISTENING 상태는 보여주지 않습니다. LISTENING 상태의 socket을 함께 보고싶으시면 아래의 설명할 -a, 혹은 -l 옵션을 지정해주어야합니다.
※ 여기서 Active Internet connections, Active UNIX domain sockets라고 하여서 약간 다르게 나타나는게 보이시죠? Internet connections는 여러분이 알고 있는 네트워크 상의 connection을 의미하지만, UNIX Domain Sockets(UDS라고도 합니다.)은 시스템 내부에서 사용하는 socket으로 인터넷을 사용하지 않고 통신하기 위한 IPC 기법입니다. socket 파일을 통해서 통신합니다. ls -l 명령을 입력했을때 앞에 s가 바로 그 socket 파일입니다. 복잡한 네트워크를 사용하지 않기 때문에 아래에서 보겠지만 State가 Internet connections보다는 간단합니다. 함수는 인터넷 socket과 동일하게 사용합니다.
netstat를 그냥 사용하면 정신없을 수도 있으니까 아래의 option들을 적절히 이용해서 사용하도록 합시다.
옵션 | 설명 |
-l | Listening 중인 socket을 표시합니다. |
-p | socket을 사용하는 pid와 program 이름을 보여줍니다. |
-n | 주소등을 number로 표시합니다(ex localhost를 127.0.0.1 로 표현) |
-i | interface의 정보를 보여줍니다. |
-t | tcp 사용 socket을 보여줍니다. |
-u | udp 사용 socket을 보여줍니다. |
-r | routing table을 보여줍니다. |
-a | listening과 non-listening 상태 모두를 보여줍니다. |
-c | 매 초마다 명령을 계속적으로 실행합니다. |
netstat -nltp : listen 중인 tcp를 사용하는 socket을 표시하는데, 그 socket을 사용하는 프로그램도 같이 표시. 주소를 숫자로 표현
netstat -nltp | grep port 번호 : 특정 port가 어떤 상태인지 알아보려면 grep을 이용해서 찾을 수 있습니다.
netstat -r : 라우팅 테이블의 정보를 확인할 수 있습니다.
State
netstat을 사용하면 State라는 socket의 상태를 볼 수 있는데, Internet connection과 UDS를 아래의 표로 정리하였습니다.
- Internet
State | 설명 |
ESTABLISHED | socket이 연결이 성립된 상태입니다. |
SYN_SENT | socket이 syn 패킷을 보냈으며 연결을 시도하려고 하는 상태입니다. |
SYN_RECV | socket이 연결 요청을 받은 상태입니다. |
FIN_WAIT1 | socket이 닫혔고, 연결이 해제되고 있는 상태입니다. |
FIN_WAIT2 | 연결이 닫혔으며, socket은 remote end로부터 shutdown을 기다리고 있는 상태입니다. |
TIME_WAIT | close 이후 socket이 여전히 네트워크에 남아있는 패킷을 처리하기 위해 대기 중인 상태입니다. 일정시간이 지난 후 이 상태는 사라집니다. |
CLOSE | socket이 사용중이지 않는 상태입니다. |
CLOSE_WAIT | remote end가 연결을 해제하였고, 이 컴퓨터의 socket이 닫히기를 기다리고 있는 상태입니다. |
LAST_ACK | remote end에서 shut down되었고, socket이 닫힌 상태입니다. 하지만 최종 ack 응답은 기다리는 상태입니다. |
LISTEN | socket이 연결을 위해서 listening 중인 상태입니다. |
CLOSING | 양쪽 모두 socket이 닫혔지만, 페킷을 완전히 못받은 상태입니다, 즉, 페킷이 유실되었다는 의미입니다. |
UNKNOWN | 어떠한 이유에서 socket의 상태를 알수가 없는 상태입니다. |
모두 알필요는 없으며, LISTEN, ESTABLISHED, WAIT과 관련된 것만 봐도 상관없을 것 같네요.
- Unix Domain Socket(UDS)
State | 설명 |
FREE | socket이 할당되지 않았습니다. |
LISTENING | connection을 대기하고 있습니다. internet의 LISTENING과 같습니다. |
CONNECTING | connection을 막 하고 있는 상태입니다. |
CONNECTED | 연결이 된 상태입니다. internet의 ESTABLISHED 상태와 같습니다. |
DISCONNECTING | socket이 연결 해제 중입니다. |
(empty) | socket이 연결되지 않은 상태입니다. |
UNKNOWN | 절대로 발생할 수 없는 상태입니다. |
하지만 netstat은 오래된 프로그램이라서 ss 명령어로 대체가 되었습니다. 나중에 시간이 있으면 ss 명령어에 대해서 포스팅하도록 하겠습니다.