네트워크의 이해 - netstat(state)

2022. 2. 2. 17:12리눅스마스터 1급 - 필기/리눅스 실무의 이해

netstat : 네트워크 연결 상태를 확인하는 명령어입니다. 연결 상태 이외에도 소켓 정보, 네트워크 인터페이스 상태 등을 확인 할 수 있습니다.

주로 netstat -anp 와 같은 형식으로 사용합니다.

-a : 모든 소켓 정보를 출력합니다.

-n : 호스트명이나 포트명을 숫자로 표시합니다.

-p : 소켓에 대한 PID와 프로그램 명을 출력합니다.

 

소켓 : 네트워크로 연결되어 있는 컴퓨터에서 상호간 통신을 위한 접점을 말합니다.

 

 

확인 할 수 있는 정보중 네트워크 연결 상태를 표시하는 State에 대해 알아보겠습니다. State는 3 Way-Handshaking과 4 Way-Handshaking 과정에서 클라이언트와 서버의 상태를 출력한 것입니다. 먼저 3 Way-Handshaking과 4 Way-Handshaking 과정에 대해 알아보겠습니다.

 

TCP(Transmission Control Protocol) : 대표적인 전송 프로토콜중 하나로 3 Way-Handshaking과 4 Way-Handshaking를 통해 세션을 연결하고 해제합니다.

 

 

3 Way-Handshaking

 

 

1. 클라이언트가 서버로 접속 요청 메시지(SYN)를 전송합니다. 이때 클라이언트는 SYN_SENT 상태가 됩니다.

 

2. 서버는 SYN 요청을 받기 위해 LISTEN 상태여야 합니다. 서버가 CLOSED 상태라면 클라이언트의 요청을 받을 수 없습니다.

 

3. 서버(LISTEN)는 클라이언트로부터 접속 요청 메시지(SYN)를 받고 이에 대한 응답(수락)으로 SYN + ACK 메시지를 보냅니다. 서버는 클라이언트가 SYN + ACK 메시지에 대한 응답으로 보낼 ACK 패킷을 기다립니다. 이때 서버는 SYN-RECEIVED 상태입니다. 

 

4. 클라이언트는 서버로부터 SYN + ACK 메시지를 받은 상태입니다. 이제 클라이언트는 이것에 대한 응답으로 ACK 패킷을 서버로 전송하고 ESTABLISHED, 즉 서버와 접속이 완료된 상태가 됩니다.

 

5. 서버는 클라이언트로부터 ACK 패킷을 받아 클라이언트와 접속이 완료된 ESTABLISHED 상태가 됩니다.

 

4 Way-Handshaking

 

 

1. 세션(연결)을 종료하기 위해 클라이언트는 서버에게 FIN 메시지를 서버로 보냅니다. FIN 메시지에는 ACK 도 포함되어 있습니다. 이때 클라이언트는 FIN-WAIT-1 상태가 됩니다

 

2. 서버는 클라이언트로부터 FIN 메시지를 받은뒤 확인 했다는 의미로 ACK 메시지를 클라이언트로 보내고 현재 전송중인 데이터가 있다면 전송이 끝날 때까지 기다립니다. 이때 서버는 CLOSE_WAIT 상태가 됩니다.

 

3. ACK 메시지를 받은 클라이언트는 서버가 남은 작업을 끝내고 FIN 메시지를 보낼때까지 기다리며 이때 클라이언트는 FIN_WAIT_2 상태가 됩니다.

 

4. 남은 작업을 마무리한 서버는 연결 종료 준비가 되었다는 의미로 FIN 패킷을 클라이언트로 전송하고 클라이언트로부터 ACK 메시지를 받기 전까지 LAST_ACK 상태가 됩니다.

 

5. 서버로부터 FIN 패킷을 받은 클라이언트는 확인 했다는 의미로 ACK를 서버에게 보내고 TIME_WAIT 상태가 됩니다. 여기서 CLOSE 가 아닌 TIME_WAIT 상태가 되는 이유는 혹시나 서버로부터 받지 못한 잔여 패킷이 있을 수도 있기 때문에 default 240초 동안 세션을 닫지 않고 기다리는 것입니다. 240초 이후 CLOSE 상태가 됩니다.

 

6. ACK 패킷을 받은 서버는 연결을 종료하고 CLOSED 상태가 됩니다.

 

3 Way-Handshaking과 4 Way-Handshaking 과정에서 클라이언트와 서버의 상태, 즉 netstat의 state 정리를 해보겠습니다. 

 

클라이언트 State 

SYS_SENT : 클라이언트가 서버로 세션 연결을 요청하는 상태입니다.

ESTABLISHED : 3 Way-Handshaking이 완료되어 클라이언트와 서버가 서로 세션이 연결된 상태입니다.

FIN_WAIT1 : 클라이언트가 세션을 끊기 위해 FIN 패킷을 서버로 보낸 상태, 소켓이 닫히고 연결이 종료되는 상태입니다.

FIN_WAIT2 : 서버로부터 FIN 패킷을 받기 전까지 대기 하는 상태, 연결은 종료된 상태입니다.

TIME_WAIT : 서버로부터 받지 못한 잔여 패킷이 있을 수도 있기 때문에 잠시동안 세션을 열어놓는 상태입니다.

CLOSED : 연결이 종료된 상태입니다.

 

서버 State

LISTEN : 서버에서 클라이언트로부터 들어오는 패킷을 위해 소켓을 열고 기다리는 상태입니다.

SYS_RECEIVED : 서버가 클라이언트로부터 ACK 패킷(확인 메시지)을 기다리는 상태입니다.

ESTABLISHED : 3 Way-Handshaking이 완료되어 클라이언트와 서버가 서로 세션이 연결된 상태입니다.

CLOSE_WAIT : 서버는 종료된 상태이며 진행중이던 작업이 종료되는걸 기다리는 상태입니다.

CLOSED : 연결이 종료된 상태입니다.