TCP 연결 상태
IT 위키
- TCP State
- TCP 연결이 수립되고 종료되기까지 양 끝단이 거쳐 가는 상태.
netstat·ss의 State 열에 표시되는 값이다.
TCP 는 연결 지향 프로토콜이므로 각 연결마다 상태 기계를 유지한다. 상태 이름은 RFC 793 에서 정의되었다.
| 상태 | 어느 쪽 | 의미 |
|---|---|---|
| CLOSED | 공통 | 연결이 없는 초기·종료 상태 |
| LISTEN | 서버 | 포트를 열고 연결 요청을 기다리는 중 |
| SYN_SENT | 클라이언트 | SYN 을 보내고 응답을 기다리는 중 |
| SYN_RECV (SYN_RECEIVED) | 서버 | SYN 을 받아 SYN+ACK 을 보내고 마지막 ACK 을 기다리는 중 |
| ESTABLISHED | 공통 | 3-way 핸드셰이크가 끝나 데이터를 주고받는 중 |
| FIN_WAIT1 | 먼저 닫는 쪽 | FIN 을 보내고 응답을 기다리는 중 |
| FIN_WAIT2 | 먼저 닫는 쪽 | FIN 에 대한 ACK 을 받고, 상대의 FIN 을 기다리는 중 |
| CLOSE_WAIT | 나중에 닫는 쪽 | 상대의 FIN 을 받았고 자신의 종료 처리를 기다리는 중 |
| LAST_ACK | 나중에 닫는 쪽 | 자신도 FIN 을 보내고 마지막 ACK 을 기다리는 중 |
| CLOSING | 공통 | 양쪽이 동시에 FIN 을 보낸 경우 |
| TIME_WAIT | 먼저 닫는 쪽 | 마지막 ACK 을 보낸 뒤 일정 시간 기다리는 중 |
클라이언트 서버 | --------- SYN ---------> | LISTEN → SYN_RECV SYN_SENT | | <----- SYN + ACK ------- | | --------- ACK ---------> | ESTABLISHED ESTABLISHED
먼저 닫는 쪽 상대 | --------- FIN ---------> | FIN_WAIT1 CLOSE_WAIT | <-------- ACK --------- | FIN_WAIT2 | | <-------- FIN --------- | LAST_ACK | --------- ACK ---------> | TIME_WAIT CLOSED ↓ 2MSL 대기 CLOSED
- TIME_WAIT
- 연결을 먼저 종료한 쪽에만 나타난다.
- 마지막 ACK 이 유실되었을 때 상대의 FIN 재전송에 응답할 수 있도록, 그리고 같은 포트 조합의 새 연결에 이전 연결의 지연 패킷이 섞이지 않도록 2MSL(Maximum Segment Lifetime의 2배) 동안 기다린다.
- 요청이 많은 서버에서 TIME_WAIT 소켓이 대량으로 쌓일 수 있다. 커널 파라미터 조정이나 연결 재사용(Keep-Alive)으로 완화한다.
- CLOSE_WAIT
- 상대는 닫았는데 내 쪽 애플리케이션이 소켓을 close() 하지 않아 머무는 상태다. 수가 계속 늘어나면 애플리케이션의 자원 반납 누락을 의심해야 한다.
- SYN_RECV
# 상태별 개수 집계
$ netstat -ant | awk '{print $6}' | sort | uniq -c
# ss 로 확인
$ ss -tan state time-wait
