728x90

Time-wait 상태

- 서버, 클라이언트에 상관없이 종료의 과정인 4-way handshaking의 첫 메시지를 전달하는 호스트의 소켓은 Time-wait 상태를 거침

- 호스트 A는 호스트 B의 FIN에 대한 ACK를 보내고 호스트 B는 ACK를 받으면 소켓을 소멸시킴

- 만약 Time-wait이 없이 호스트 A쪽의 소켓을 소멸시키면 호스트 B의 FIN에 대한 ACK를 제대로 받을 수 없어 B에서는 계속해서 FIN을 전달

- 그렇기 때문에 일정 시간을 두고 소켓을 종료함으로써 ACK를 제대로 받을때까지 소켓을 소멸하지 않고 대기

- Time-wait 상태가 끝나면 소켓을 소멸

- Time-wait 상태에서는 해당 소켓이 소멸되지 않아 소켓에 할당된 Port를 다른 소켓이 사용할 수 없음

주소의 재할당

- Time-wait 상태에 들어가면 Timer를 동작하여 일정 시간이 지나면 소켓을 소멸시킴

- Timer가 돌아가는 와중 FIN이 다시 왔다는 것은 보낸 ACK가 제대로 안보내졌다는 것을 의미함

- 그럴 때는 다시 Timer를 재가동함

- Time-wait은 필요한 상태이지만 상태가 길어지면 서비스를 운영할 때 문제가 될 수 있음

- 서버의 경우 갑작스런 연결이 끊어질 경우 위의 과정이 계속 반복될 수 있는데 계속해서 Time-wait 상태에 머물러 있으면 그 포트는 제대로 서비스를 제공할 수 없음

- 그럴 경우를 방지하기 위해 SO-REUSEADDR의 옵션을 1로 설정해서 Time-wait 상태에 있는 소켓의 포트번호도 새로운 소켓에 할당할 수 있게 해주면 됨

int main(int argc, char *argv[])
{
    ...;
    serv_sock=socket(PF_INET, SOCK_STREAM, 0);
    if(serv_sock==-1) {
        printf("socket() error");
    }
    
    optlen=sizeof(option);
    option=TRUE;	
    setsockopt(serv_sock, SOL_SOCKET, SO_REUSEADDR, &option, optlen);
    
    ...;
}
728x90

+ Recent posts