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);
...;
}
'Programming > Network' 카테고리의 다른 글
열혈 TCP/IP 10-1. 프로세스의 이해와 활용 (0) | 2021.03.01 |
---|---|
열혈 TCP/IP 09-3. TCP_NODELAY (2) | 2021.02.24 |
열혈 TCP/IP 09-1. 소켓의 옵션과 입출력 버퍼의 크기 (0) | 2021.02.23 |
열혈 TCP/IP 08-2. IP주소와 도메인 이름 사이의 변환 (0) | 2021.02.21 |
열혈 TCP/IP 08-1. Domain Name System (0) | 2021.02.21 |