베하~~!
뉴진쓰의 작은뉴진입니다.
우선, 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 |
댓글