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
'책 > 윤성우 TCPIP' 카테고리의 다른 글
10-1 프로세스의 이해와 활용 (0) | 2020.12.15 |
---|---|
09-2 : SO_REUSEADDR (3) (0) | 2020.12.14 |
09-2 : SO_REUSEADDR (0) | 2020.12.12 |
09-1 소켓의 옵션과 입출력 버퍼의 크기 (2) (0) | 2020.12.11 |
09-1 소켓의 옵션과 입출력 버퍼의 크기 (0) | 2020.12.10 |