책/윤성우 TCPIP

09-2 : SO_REUSEADDR (2)

babystep 2020. 12. 13. 23:48
728x90
  • Time - wait 상태

  • 위의 four-way handshaking 과정을 살펴보자
  • 그림에서 호스트 A 서버라고 보면, 호스트 A 호스트B FIN메시지를 먼저 보내고 있으니 서버가 콘솔상에서 cTRL+ c 입력한 상황으로 있다. 그런데 여기서 주목할 점은 연결의 해제 과정인 Four-way handshaking 이후에 소켓이 바로 소멸되지 않고 Time-wait 상태라는 것을 일정시간 거친다는 점이다.
  • 물론 Time-wait상태는 먼저 연결의 종료를 요청한 (먼저 FIN메시지를 전송한)호스트만 거친다. 이때문에 서버가 먼저 연결의 종료를 요청해서 종료하고 나면, 바로 이어서 실행을 없는 것이다. 소켓이 Time-wait상태에 있는 동안에는 해당 소켓의 PORT번호가 사용중인 상태이기 때문이다. 따라서 앞서 확인한 것처럼 bind함수의 호출과정에서 오류가 발생하는 것은 당연하다.
  • 클라이언트 소켓은 Time-wait 상태를 거치지 않는가?
    • Time-wait 상태는 서버에만 존재하는 것으로 오해하는 경우가 있다. 그러나 소켓의 Time-wait상태는 클라이언트나 서버냐에 상관없이 존재한다. 먼저 연결의 종료를 요청하면 해당 소켓은 반드시 Time-wait 상태를 거친다. 그러나 클라이언트의 Time-wait 상태는 신경을 쓰지 않아도 된다. 왜냐하면 클라이언트 소켓의 PORT번호는 임의로 할당되기 때문이다. 서버와 달리 프로그램이 실행될 때마다 PORT번호가 유동적으로 할당되기 때문에 Time-wait상태에 대해 신경을 쓰지 않아도 된다.
  • Time-wait 상태의 존재이유 :  위의 그림에서 호스트A 호스트B 마지막 ACK 메시지 SEK 5001, ACK 7502) 전성하고 나서 소켓을 바로 소멸시켰다고 가정해 보자, 그런데 마지막 ACK 메시지가 호스트 B 전달도지 못하고 중간에 소멸되어 버렸다 그렇다면 어떤일이 일어날까 아마도 호스틑B 자신이 전에 보낸 FIN메시지 (SEQ 7501, ACK 5001) 호스트 A 전송되지 못했다고 생각하고 전송을 시도할 것이다. 그러나 호스트 A 소켓은 완전히 종료된 상태이기 때문에 호스트B 호스트 A로부터 영원히 마지막 ACK메시지를 받지 못하게 된다. 반면 호스트A 소켓이 Time-wait상태로 놓여있다면 호스트 B 마지막 ACK메시지를 재전송하게 되고 호스트 B 정상적으로 종료할 있게 된다.
728x90