본문 바로가기

TCP-IP 소켓 프로그래밍

주소할당 에러(Binding Error)를 이해해보자

들어가며


때때로 서버 프로그램을 강제종료하고 다시 서버를 켜려고 하면 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 때문에 바로 킬 수 없는 상황이 발생할 수도 있으니 끄는 것을 고려해봐야한다.

 

참고