Time Wait
•
TCP 상태의 가장 마지막 단계
•
연결 종료 시 마지막 패킷 전송 실패를 대비하기 위한 상태
•
실제 Time Wait 상태가 2~3분정도 걸리기 때문에, 서버가 Time Wait에 머물러 있는 경우 해당 소켓을 다시 사용할 수 없음
Time Wait 상태의 필요성 예시
1.
Client는 마지막에 ACK를 전송하면 할 일을 모두 마치게 된다
2.
만약 마지막 ACK 이 없어지면 Server는 TCP의 신뢰성 보장을 위해 FIN을 재전송
3.
Client가 이미 종료했다면 FIN을 처리해 줄 방법이 없기 때문에 정상적인 종료가 이루어지지 않음
Time Wait의 문제점 해결
•
코드를 통한 Time wait 해결
serv_sock=socket(PF_INET, SOCK_STREAM, 0);
optlen = sizeof(option);
option = TRUE; // #define TRUE 1
setsockopt(serv_sock, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option));
C
복사
◦
위 코드를 통해 Time Wait 상태의 소켓도 바로 바인딩하여 사용할 수 있다
•
Port 범위 늘리기
◦
대량의 Time Wait이 발생한 경우, 클라이언트에 할당된 Port의 범위를 늘려 어느정도 해결할 수 있다
•
Kernel 옵션 조정
◦
소켓이 완전히 닫히기 위해서는 FIN을 기다려야 하는데, 이 확인 간격을 초 단위로 설정할 수 있다 (기본적으로 60초)