본문 바로가기

통신 관련 지식/네트워크(Network)

[네트워크] TCP 연결 상태 용어

* TCP 상태별 정의

 

- ESTABLISHED
: 3단계 핸드쉐이킹 후 연결 성립

 

 

- SYN_SENT
: 원격 호스트에 능동적인 개설 요청(능동적 열기)

 

 

- SYN_RECV
: 네트워크 통한 연결요청 받음(수동적 열기)

 

 

- FIN_WAIT1
: 능동적 닫기(active close) 요청을 한 상태

 

 

- FIN_WAIT2
: 로컬에서 종결(FIN)세그먼트를 전송하였고 원격 시스템에서 이에 대한 확인메시지를 수신하였지만, 원격 애플리케이션이 작업을 종료하지 않아 원격 호스트의 종결 세그먼트를 기다리는 상태

 

 

- TIME_WAIT
: 회선의 종결 절차가 완료되었지만 분실되었을지 모르는 느린 세그먼트를 위해
소켓을 열어 놓고 유지하고 있는 상태

 

 

- CLOSED
: 회선이 종결되고 모든 자원을 해제한 상태

 

 

- CLOSE_WAIT
: 수동적 닫기를 하고 있는 상태로 FIN 종결 세그먼트를 수신하고 이에 대한 확인 메시지를 전송한 상태

 

 

- LAST_ACK
: FIN 종결 요청을 받고 로컬에서도 회선 종결에 합의하여 종결을 요청(FIN)한 상태로
이에 대한 확인 메시지가 수신되면 회선이 종결됨

 

 

- LISTEN
: 서버 애플리케이션에서 수동적 열기로 연결 요청을 기다리고 있는 상태

 

 

- CLOSING
: 로컬 TCP는 FIN_WAIT_1에서 설명한대로 FIN 종결 세그먼트를 전송하였고,
LAST_ACK에서 설명한대로 원격 시스템의 종결 세그먼트도 수신하였지만,
FIN_WAIT_1 단계에서 전송한 세그먼트에 대한 확인 메시지(ACK)를 수신하지 못한 상태로
보통 확인 메시지가 전송 도중 분실되었다는 것을 나타냄

 

 

- UNKOWN
: 소켓의 상태에 대해서 확인이 안되는 경우

 

 

 

* TIME_WAIT 상태 없애기
: 이미 발생한 TIME_WAIT 상태는 일정시간이 지나면 없어지지만, client가 server에 매우 빈번히 connect/disconnect를 반복한다면 많은 TCP port가 TIME_WAIT 상태가 되서 문제가 생길 수 있다.


client application에서 socket option 중 linger option을 off 시키면, client에 의한 connection close시 TIME_WAIT 상태를 거치지 않고 ClOSED 상태로 바뀌게 되므로, TIME_WAIT 상태가 발생하지 않게 된다.

 

 /* 중략 */
int sock
struct linger ling;

ling.l_onoff = 1;
ling.l_linger = 0; /* 0 for abortive disconnect */

setsockopt(sock, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling))