CLOSE(초기 상태)
연결이 닫힌 상태. 소켓이 열리지 않았거나 연결이 종료됨
- 개발자 작업
- 소켓을 생성하고 연결 요청을 준비
- 클라이언트의 경우 connect() 호출 준비
- 서버의 경우 bind() 와 listen() 호출 후 대기 상태로 전환
LISTEN(서버 대기 상태)
서버가 클라이언트의 연결 요청을 기다리는 상태
- 개발자 작업
- 서버에서 accept() 를 호출해 클라이언트의 연결 요청을 처리
- 필요한 경우 연결 제한 수를 설정하거나 타임아웃 처리
SYN_SENT(클라이언트 연결 요청 상태)
클라이언트가 서버에 연결 요청을 보낸 상태
- 개발자 작업
- 연결이 성공하지 않을 경우 타임아웃 처리
- 연결이 성공하면 다음 단계로 상태 전환
- 실패 시 재시도 로직이나 오류 핸들링 구현
SYN_RECEIVED(서버 연결 요청 수신 상태)
서버가 클라이언트의 연결 요청을 수신했으나, 완전히 확정되지 않은 상태
- 개발자 작업
- 클라이언트의 ACK를 기다림
- 연결 확인이 완료되지 않을 경우 타임아웃 후 자원 정리
ESTABLISHED(연결 상태)
클라이언트와 서버 간에 연결이 성공적으로 설정된 상태
- 개발자 작업
- 데이터를 송수신할 준비
- 데이터의 크기, 패킷 분할 및 병합 처리
- 오류 복구 및 데이터 재전송 로직 구현
- 비정상적인 연결 종료(네트워크 장애 등) 시 복구 로직 추가
FIN_WAIT_1(연결 종료 요청 상태 - 클라이언트)
클라이언트가 연결 종료를 요청한 상태
- 개발자 작업
- 송신 중인 데이터를 마무리하고 FIN 패킷 전송
- 응답 패킷을 대기
FIN_WAIT_2(종료 대기 상태 - 클라이언트)
서버의 FIN 패킷을 기다리는 상태
- 개발자 작업
- 서버가 FIN 패킷을 전송할 때까지 연결 유지
- 설정된 타임아웃 후 자원 정리
TIME_WAIT(연결 종료 후 대기 상태)
클라이언트가 마지막 ACK를 보낸 후 일정 시간 동안 대기하는 상태
잃어버린 패킷의 재전송을 처리하고 새로운 연결과 충돌을 방지하기 위해 필요함
모든 패킷이 안전하게 도착했는지 확인하기 위해 일정 시간 대기하는 상태
- 개발자 작업
- 추가 작업은 거의 필요하지 않지만 타임아웃 후 자원 해제
- 연결 수가 많을 경우 TIME_WAIT 상태가 누적되지 않도록 조치 (포트 재사용 옵션 설정)
CLOSING / LAST_ACK(종료 중간 상태)
양쪽 모두 FIN 패킷을 전송했지만 아직 최종 확인이 완료되지 않은 상태
- 개발자 작업
- 서버가 최종 ACK 전송
- 필요한 경우 재시도 로직 추가
728x90
반응형
'네트워크' 카테고리의 다른 글
RESTful API (0) | 2025.01.23 |
---|---|
HTTP 1/2/3 (0) | 2025.01.22 |
HTTP 헤더 (0) | 2025.01.22 |
TCP 3-way handshake, 4-way handshake (0) | 2025.01.22 |
HTTP & HTTPS (0) | 2025.01.21 |