본문 바로가기
Network

TIME_WAIT

by BTC_작은뉴진 2023. 11. 13.

베하~~!

뉴진쓰의 작은뉴진입니다.

 

우선, 4-way handshaking 과정에 대해 복습을 해볼게요.

소켓이 종료될때는, 즉 클라이언트와 서버가 연결이 끊어질때는 4단계를 거쳐서 종료됩니다.

 

 

1. Active Closer(위 사진에서의 Client로, 먼저 연결을 끊는 쪽)가 서버에게 연결 종료를 요청합니다.

 

2. Passive Closer(위 사진에서의 Server)는 할 일을 마저 다 끝내야하기 때문에 바로 연결을 종료시키지 않고 ACK 신호를 보내며 CLOSE_WAIT 상태가 됩니다.

 

3. Passive Closer는 할 일을 다 마친 후 FIN 신호를 보내며 연결을 종료하고자 합니다.

 

4. Active Closer는 FIN 신호를 잘 받았다는 의미로 ACK를 다시 보내고, 신호를 받은 Passive Closer는 특정 시간 동안 기다린 후에 종료시킵니다.

 

 

이제 TIME_WAIT 상태에 대해 알아볼게요.

4-way handshake 에서 소켓이 바로 없어지지 않고, 일정 시간 동안 대기한 후에 제거가 되어야 합니다. 이때 이 일정 대기 시간을 TimeWait 이라고 부르며,

Active Closer쪽에 생성되는 소켓을 TIME_WAIT이라고 합니다.

 

 

TIME_WAIT 소켓이 많아지면 아래와 같은 문제가 발생할 수 있습니다.

 

1. 로컬 포트 고갈에 따른 애플리케이션 타임아웃이 발생할 수 있습니다.

 

커널은 프로세스가 외부와 통신하기 위해 소켓의 생성을 요청 시 해당 소켓이 사용하게 될 로컬 포트에 net.ipv4.ip_local_port_range에 정의된 값들 중 하나를 넘겨줍니다.

 

이 때 모든 로컬 포트가 TIME_WAIT 상태에 있다면 할당할 수 있는 로컬 포트가 없기 때문에 외부와 통신하지 못하게 되고, 이로 인하여 애플리케이션에서는 타임 아웃이 발생할 수 있습니다.

 

2. 잦은 TCP 연결 맺기/끊기로 인해 서비스의 응답 속도 저하가 일어날 수 있습니다.

 

지속적으로 통신이 있을때도 연결의 맺고 끊기를 반복한다면 그만큼 많은 양의 TCP 3-way handshake가 필요하게 되고 이는 전체적인 서비스의 응답 속도 저하를 불러올 수 있어요.

 

 

이렇게 보니 TIME_WAIT은 마냥 나쁜 것으로만 보이는데요, 이러한 대기 시간은 왜 필요할까요?

 

TIME_WAIT 소켓은 연결이 종료된 후에도 소켓을 바로 정리하지 않고 일종의 연결 종료에 대한 흔적을 남겨 놓아 일정 시간 동안 연결 종료에 대한 흔적을 남겨서 발생할 수 있는 문제점을 방지할 수 있습니다.

 

이렇게 TIME_WAIT은 꼭 필요하지만 앞서 말씀드렸다시피 Timewait 대기 상태에 있는 소켓이 많아지는 경우 로컬 포트가 고갈 될 수가 있어요.

 

다음에는 이 문제를 해결할 수 있는 Keepalive에 대해 알아보겠습니다.

 

다음에 만나요

 

베빠!

'Network' 카테고리의 다른 글

식별자(MAC주소/IP주소 /Port번호)  (1) 2023.11.24
keepalive  (0) 2023.11.17
URI, URL, URN  (0) 2023.11.05
TCP와 UDP의 차이(2)  (0) 2023.11.03
TCP와 UDP의 차이(1)  (1) 2023.11.03

댓글