* 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 상태가 발생하지 않게 된다.
/* 중략 */ ling.l_onoff = 1; setsockopt(sock, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling)) |
'통신 관련 지식 > 네트워크(Network)' 카테고리의 다른 글
[네트워크] tcpdump 사용법 (0) | 2014.06.27 |
---|---|
[네트워크] TCP 소켓 프로그래밍 주의사항 (0) | 2014.06.27 |
[네트워크] TCP 연결/종료 과정 (0) | 2014.06.27 |
[네트워크] TCP TIME_WAIT 설정 (0) | 2014.06.27 |
[네트워크] 소켓 동작 모드 (0) | 2014.06.23 |