1. final ACK가 loss될 경우에 대비하기 위해
2. wandering duplicate를 처리하기 위해
final ACK를 보낸 후 TIME_WAIT 상태가 되는 호스트를 A라 하고
그에 앞서 FIN을 보낸 호스트를 B라 합시다.
1번부터 간단히 보죠.
final ACK가 B에 도달하지 못했을 경우 B는 다시 FIN을 보내게 되겠죠.
이때 A가 TIME_WAIT 상태를 유지하지 않고 있다면
존재하지 않는 connection으로부터 난데없이 FIN이 온 것이니
A는 RST를 보내게 되고 B는 이를 에러로 인식하게 됩니다.
segment가 loss된 것은 중간 라우터들의 일시적인 장애일 수도 있는데
이를 에러로 인식하는 것을 방지하기 위해서죠.
2번의 경우는 이런 상황을 한번 가정해서 이해해 보죠.
connection이 종료되기 전에 B가 A에게 segment를 하나 보냈는데
중간에 지연이 되었습니다.
B는 timedout이 될 때까지 A로부터 ACK가 오지 않으니 재전송을 했겠죠.
그런데 최초 보낸 segment가 A가 final ACK를 보낸후 도착했다면 어떻게 될까요.
TIME_WAIT가 없다면 이 역시 에러로 처리됩니다.
이 경우 더 심각한 문제는 다음의 경우 발생합니다.
connection이 종료된 후 B와 A가 직전과 동일한 port로
다시 connection이 이루어졌습니다.
중간에 지연된 segment가 이때 날아온다면
A는 이 segment를 새로운 connection에서 날아온 데이터인지
이전 connection에서 지연되어 날아온 데이터인지 구분할 방법이 없겠죠...
따라서 TIME_WAIT 상태를 두어
직전과 동일한 (ip, port) 쌍으로는 새로운 connection을 열지 않기 위해서죠.
그럼 얼마나 오래 TIME_WAIT 상태가 되느냐는 MSL(maximum segment lifetime)의
2배동안입니다. MSL은 모든 TCP가 정의하게 되어 있습니다.
Re: TIME_WAIT 왜 필요한가요?
http//www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-2.html
에 있는
2.7 Please explain the TIME_WAIT state.
읽어보심이
Re^2: TIME_WAIT 왜 필요한가요?
아무리 읽어 보려 해도 영어가 딸려서...
간단히나마 설명을 좀 해주시면 안되나요?
Re^3: TIME_WAIT 왜 필요한가요?
2가지 이유 때문입니다.
1. final ACK가 loss될 경우에 대비하기 위해
2. wandering duplicate를 처리하기 위해
final ACK를 보낸 후 TIME_WAIT 상태가 되는 호스트를 A라 하고
그에 앞서 FIN을 보낸 호스트를 B라 합시다.
1번부터 간단히 보죠.
final ACK가 B에 도달하지 못했을 경우 B는 다시 FIN을 보내게 되겠죠.
이때 A가 TIME_WAIT 상태를 유지하지 않고 있다면
존재하지 않는 connection으로부터 난데없이 FIN이 온 것이니
A는 RST를 보내게 되고 B는 이를 에러로 인식하게 됩니다.
segment가 loss된 것은 중간 라우터들의 일시적인 장애일 수도 있는데
이를 에러로 인식하는 것을 방지하기 위해서죠.
2번의 경우는 이런 상황을 한번 가정해서 이해해 보죠.
connection이 종료되기 전에 B가 A에게 segment를 하나 보냈는데
중간에 지연이 되었습니다.
B는 timedout이 될 때까지 A로부터 ACK가 오지 않으니 재전송을 했겠죠.
그런데 최초 보낸 segment가 A가 final ACK를 보낸후 도착했다면 어떻게 될까요.
TIME_WAIT가 없다면 이 역시 에러로 처리됩니다.
이 경우 더 심각한 문제는 다음의 경우 발생합니다.
connection이 종료된 후 B와 A가 직전과 동일한 port로
다시 connection이 이루어졌습니다.
중간에 지연된 segment가 이때 날아온다면
A는 이 segment를 새로운 connection에서 날아온 데이터인지
이전 connection에서 지연되어 날아온 데이터인지 구분할 방법이 없겠죠...
따라서 TIME_WAIT 상태를 두어
직전과 동일한 (ip, port) 쌍으로는 새로운 connection을 열지 않기 위해서죠.
그럼 얼마나 오래 TIME_WAIT 상태가 되느냐는 MSL(maximum segment lifetime)의
2배동안입니다. MSL은 모든 TCP가 정의하게 되어 있습니다.
댓글 달기