- 주소할당 에러(binding error)발생
- TCP 기반 에코 서버, 에코 클라이언트 프로그램에서 클라이언트에서 서버로 종료를 알릴 때 클라이언트의 close/ closesocket 함수가 호출되어 서버측으로 FIN 메시지 전달 → four way handshaking
- 클라이언트에서 프로그램을 강제종료 할 경우에도, CTRL+C를 입력해도 운영체제가 파일 및 socket을 닫으며 서버 측으로 FIN 메시지 전달
- 서버와 클라이언트가 연결된 상황에서 서버 측 콘솔에서 CTRL+C를 입력하여 강제종료 할 경우 서버의 재실행에 문제가 되어 동일한 PORT에서 bind error가 생김 (3분후 실행하면 정상적으로 실행)
- Time-wait 상태
- four way handshaking
- 호스트A(서버)가 호스트B로 fin메시지를 먼저 보냄 (서버의 콘솔창에 CTRL+C입력)
- four way handshaking 과정이후 socket이 바로 소멸되지 않고 time-wait상태를 일정시간 거침
- time-wait 상태는 먼저 FIN 메시지를 보낸 호스트만 거침
- 따라서 먼저 CTRL+C입력을 통해 FIN 메시지를 보낸 서버는 socket이 아직 time-wait상태에 있기 때문에 PORT가 아직 사용중인 상태이므로 bind 함수 호출에서 에러
◎ 클라이언트에서 먼저 FIN 메시지를 보내는 경우 사용한 socket이 time-wait 상태에 있지만 클라이언트 socket의 경우 connect 함수에 의해 내부적으로 자동 할당되므로 에러가 발생하지 않음
◎ 서버에서 먼저 FIN 메시지를 보내는 경우 서버 socket은 bind함수를 통해 IP, PORT 번호가 할당되므로 에러
- time-wait 의 역할
- 만약 time-wait없이 바로 종료된다면 four way handshaking 과정에서 마지막 메시지가 전송되지 못하고 소멸된다면 호스트B가 보낸 FIN 메시지를 수신받지 못했다고 인식하고 계속 재전송하고 호스트B는 ACK메시지를 받지 못함
- 주소의 재할당
- SO_REUSEADDR의 필요성
1. 시스템에 문제가 생겨 서버가 갑자기 종료된 상황에서는 time-wait을 기다려서 서버를 다시 가동시켜야 함
2. four way handshaking 과정에서 마지막 데이터가 손실될 경우 호스트B는 FIN메시지를 재전송하고 호스트A는 time-wiat 타이머를 재가동
- SO_REUSEADDR: time-wait 상태에 있는 socket의 PORT번호를 새로 시작하는 socket에 할당
이름 | 값 |
SO_REUSEADDR | default 0 |
1 |
- SO_REUSEADDR의 값이 0일경우 time-wait 상태의 socket의 PORT번호는 할당이 불가능 (1: 할당 가능)
// socket의 옵션 변경
optlen=sizeof(option);
option=true;
setsockopt(serv_sock, SOL_SOCKET, SO_REUSEADDR, &option, optlen);
'프로그래밍의 기초 > TCP | IP' 카테고리의 다른 글
프로세스 이해와 활용 (0) | 2022.01.14 |
---|---|
TCP_NODELAY (0) | 2022.01.14 |
socket의 옵션과 입출력 버퍼의 크기 (0) | 2022.01.14 |
IP주소와 도메인 이름 사이의 변환 (0) | 2022.01.13 |
DNS (Domain Name System) (0) | 2022.01.13 |