관리 메뉴

일서방

TIME_WAIT 소켓이 서비스에 미치는 영향 본문

IT공부/리눅스커널이야기

TIME_WAIT 소켓이 서비스에 미치는 영향

0asis 2025. 8. 21. 09:05

 

TCP 연결 종료 과정(4-way handshake)

 

 

Active Closure : 먼저 연결을 끊는쪽

Passive Closure : 그 반대

 

Active closure 쪽에 time_wait소켓이 생성된다. 주의해야할 부분은 time_wait 소켓은 서버에서 생기는 것이 아니고 먼저 연결을 끊는 쪽에서 생성된다. 클라이언트에서도 TIME_WAIT 소켓이 생길 수 있고 , 서버에서도 TIME_WAIT 소켓이 생길 수 있다.

 

TIME_WAIT소켓이 많아지면 로컬포트 고갈에 따른 어플리케이션 타임아웃이 발생 할 수있다.

커널에 net.ipv4.ip_local_port_range라는 커널 파라미터가 있는데, 외부와통신하기 위해 필요한 로컬포트의 범위를 지정한다. 이때 모든 로컬 포트가 TIME_WAIT 상태에 있다면 할당할 수 있는 로컬 포트가 없기 때문에 외부와 통신을 하지 못하게 되고 , 이로 인해 어플리케이션에서는 타임아웃이 발생 할 수 있다.

 

[TIME_WAIT 문제 해결방법]

1. net.ipv4.tcp_tw_reuse

의미 :  TIME_WAIT 상태에 있는 소켓을 클라이언트 outbound 연결에서 재사용할 수 있도록 허용할지 여부

설정값 :  

   . 0 : 재사용 비활성화(TIME_WAIT을 일반 규칙대로 유지)

   . 1 : 재사용 허용 :outbound연결(클라이언트 역할) 시 ,  TIEM_WAIT 소켓을 재사용 가

 

주의사항:

(1)서버 inbound coneection에는 적용되지않음

(2)TIME_WAIT 재사용은 안전성 < 성능을 선택하는 것이라 , 잘못 쓰면 지연된 패킷때문에 데이터 충돌위험이 생길 수 있음.

 

2. ConnetionPool방식 사용하기                   

 

-Connection less : 매번 소켓 연결이 필요

-Connection Pool : 소켓을 미리 열어놓고 사용

 

3. Keepalive사용하기

 

 

[TIME_WAIT상태의 존재 이유]

1) 지연 패킷(Delayed Packet) 제거

.TCP는 시퀀스 번호를 써서 데이터 순서를 보장한다.만약 연결을 끊자마자 같은 소켓(IP/포트 조합)으로 새로운 연결을 재사용한다면, 이전 연결에서 늦게 도착한 패킷이 새 연결로 들어올 수 있어서 데이터 혼동/충돌이 생긴다.

TIME_WAIT = 이전 연결의 잔여 패킷이 네트워크에서 사라질때까지 기다리는 시간

 

2) 정상 종료(4-WAY handshake) 보장

. TCP연결종료 과정은 FIN->ACK->FIN->ACK의 4단계 핸드셰이크이다.

. 이 과정에서 마지막 ACK가 상대방에게 제대로 전달되지 않았다면??

    - 상대방은 FIN을 다시보낸다.

    - 이때 TIME_WAIT.상태로 남아있으면 -> ACK를 재전송해준다 

    - TIME_WAIT상태로 남아있지않다면 -> RST패킷을 반환하며 정상적은 ACK를 받지못하기때문에 소켓이 LAST_ACK           계속 남아있게된다.

 

[정리]

1. TIME_WAIT 소켓은 먼저 연결을 끊는쪽에서 발생한다.

2. 클라이언트 입장에서의 TIME_WAIT소켓은 tw_reuse 파라미터를 통해 재사용할 수 있기때문에 로컬포트 고갈 문제는 발생하지 않는다.

3. 하지만 불필요한 TCP 3way handshake가 일어날 수 있기 때문에 가능하면 Connection Pool 방식을 적용해 TIME_WAIT 소켓을 줄이도록 한다.

4. 서버입장에서의 TIME_WAIT 소켓은 tw_recycle 파라미터를 통해 빠르게 회수할 수 있다. 하지만 특정환경에서는 SYN패킷이 버려지는 문제가 발생할수 있기 때문에 권하지 않는다.

5. 서버입장에서는 keepalive 기능을 켬으로써 불필요한 TCP 3 way handshake를 줄일 수 있고 TIME_WAIT소켓도 줄일 수 있다. 이를통해 서비스의 응답속도 향상이 가능해진다.

6. TIME_WAIT 소켓은 정상적인 TCP 연결해제를 위해 반드시 필요하다.