들어가며
때때로 서버 프로그램을 강제종료하고 다시 서버를 켜려고 하면 Bind 하는 과정에서 오류가 발생한다. 이러한 상황은 왜 발생하는 것일까?
Time-wait 상태
Time-Wait??
Time-wait는 TCP의 연결종료 과정인 four-handshaking에서 일어난다.
먼저 연결 종료 요청(FIN)을 보낸 Host A는 마지막 ACK를 보내고 소켓이 바로 사라지지 않고, 일정 시간을 대기하게 되는데 그 상태를 Time-wait이라고 한다.
Time-wait을 사용하는 이유
아까와 같은 four-handshaking 상황에서 바로 소켓을 소멸시켰다. 하지만 마지막 ACK가 손실되어 버렸다.
얼마 뒤 Host B는 자신의 FIN메시지를 보낸다고 해도 Host A의 소켓은 이미 소멸해 버렸기 때문에 받을 수 없다. 이런 상황을 대비하기 위해서 Time-wait이 존재하는 것이다.
해결법
본론으로 돌아와서! Time-wait때문에 Binding Error가 발생한다는 것을 알 수 있었다. 이것을 방지하기위해 소켓의 옵션 SO_REUSEADDR를 사용하면된다. 1(true)은 활성화-> Time-wait이어도 주소할당, 0(false)는 time-wait시 할당 불가능.
마무리
binding error를 파헤쳐보며 time-wait 상태에 대해 알아봤다. 서버가 알 수 없는 오류로 꺼졌는데, binding error 때문에 바로 킬 수 없는 상황이 발생할 수도 있으니 끄는 것을 고려해봐야한다.
참고
'TCP-IP 소켓 프로그래밍' 카테고리의 다른 글
Select 모델을 위한 Select 함수를 이해해보자 (0) | 2023.09.05 |
---|---|
Nagle 알고리즘을 이해해보자 (0) | 2023.09.04 |
TCP 소켓의 우아한 연결종료(Half-close)를 이해해보자 (1) | 2023.08.31 |
UDP를 파헤치며 이해해보자 (0) | 2023.08.29 |
TCP의 내부 동작 원리를 이해해보자 (1) | 2023.08.28 |