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 을 보낸 뒤 일정 시간 기다리는 중

연결 수립 (3-way handshake)

[편집 | 원본 편집]
클라이언트                        서버
   |  --------- SYN --------->  |   LISTEN → SYN_RECV
SYN_SENT                         |
   |  <----- SYN + ACK -------  |
   |  --------- ACK --------->  |
ESTABLISHED                    ESTABLISHED

연결 종료 (4-way handshake)

[편집 | 원본 편집]
먼저 닫는 쪽                     상대
   |  --------- 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
  • 정상적으로는 아주 짧게 스쳐 가는 상태다. 이 상태의 연결이 대량으로 쌓여 있다면 SYN 플러딩 공격을 의심한다. 대응책이 SYN 쿠키다.
# 상태별 개수 집계
$ netstat -ant | awk '{print $6}' | sort | uniq -c

# ss 로 확인
$ ss -tan state time-wait

같이 보기

[편집 | 원본 편집]