관리 메뉴

너와 나의 스토리

주소 할당 에러의 원인 - Time wait과 SO_REUSEADDR 옵션 본문

Computer Networks/실습

주소 할당 에러의 원인 - Time wait과 SO_REUSEADDR 옵션

노는게제일좋아! 2019. 11. 8. 17:38
반응형

Time-wait의 이해 

Four-way handshaking

 

  • 호스트 A를 서버라고 하자, 서버가 호스트 B로 FIN 메시지를 먼저 보내고 있으니, 서버가 콘솔상에서 CTRL+C를 입력한 상황으로 볼 수 있다.
  • 이 때, four-way handshaking이 끝나고 바로 소켓이 소멸되는 것이 아니라 일정시간(time-wait)을 거친다. 
  • 먼저 연결 종료를 요청한 호스트만 time wait 상태를 거친다. 
  • 소켓이 time-wait 상태에 있는 동안에는 해당 소켓의 PORT 번호가 사용중이므로 다른 소켓에 할당할 수 없다.

 

 

 

Time-wait의 존재 이유
  • 호스트 A가 마지막 ACK을 전송하고 바로 소켓을 소멸시켰는데, 그 ACK이 소멸된다면?
    • 호스트 B는 호스트 A가 자신의 FIN을 못 받은지 알고 계속 FIN을 보내지만, 호스트 A는 이미 소멸되었기 때문에 영원히 ACK을 보낼 수 없게된다.
  • 이러한 이유로 Time-wait 과정을 거치는 것이다.
    • 호스트 A가 FIN을 다시 받으면 다시 ACK을 보낼 수 있도록 기다리는 시간이라고 생각하면 된다.

 

Time-wait은 길어질 수 있다.
  • 호스트 A가 FIN을 다시 받고 ACK을 보내면 Time-wait 타이머는 다시 시작한다. 즉, 네트워크 상황이 원할하지 않는다면 time-wait 상태는 길게 지속될 수 있다.

 

 

Time-wait이 길어지는 상황 해결
  • 소켓의 옵션 중에서 SO_REUSEADDR의 상태를 변경하면 된다. 
  • 이의 적절한 변경을 통해서 Time-wait 상태에 있는 소켓에 할당되어 있는 PORT번호를 새로 시작하는 소켓에 할당되게끔 할 수 있다.
  • SO_REUSEADDR의 디폴트 값은 0(FALSE)로 Time-wait 상태에 있는 소켓의 포트 번호는 할당이 불가능함을 의미

 

 

 

 

 

 

출처: [윤성우 열혈 TCP/IP 소켓 프로그래밍]

 

반응형
Comments