Network

DB와 WAS 간 TCP 통신: 효율적인 커넥션 관리와 흐름, 혼잡 제어

경딩 2025. 1. 12. 21:22

 

DB Connection Pool의 필요성과 그 배경

개발을 하다 보면 String Pool, Thread Pool, DB Connection Pool 등 여러 종류의 풀(pool)에 대해 자주 언급된다. 이 풀들은 각기 다른 목적을 가지고 있으며, 그 중 DB Connection Pool은 특히 데이터베이스와의 커넥션을 효율적으로 관리하기 위해 생겨났다..

결론부터 말하자면, DB 커넥션을 맺는 과정이 비용이 많이 들기 때문에 미리 커넥션을 생성해두는 방법이 사용된다. 이 과정에서 발생하는 흐름 제어혼잡 제어의 목적을 이해하는 것이 중요하다. 왜 커넥션을 미리 생성해두어야 하는지, 그리고 그 과정에서 발생하는 비용과 성능 문제를 어떻게 해결할 수 있는지 알아보자.

 

 

DB와 WAS 서버 간의 통신을 위한 TCP 통신 과정

DB 드라이버를 통해 TCP/IP  커넥션을 연결 후 ID ,PW 등을 DB 서버로 보내 내부 인증을 완료하면 

생성된 커넥션 객체를 응답받을 수 있다.

 

 

초기 TCP/IP 연결 과정

(DB 커넥션 풀이 필요한 이유)

초기에 TCP/IP 로 연결하는 과정에서 3 way handshake 로 초기 연결을 하는 과정에서 시간이 많이 걸린다.

때문에 DB 호출시 커넥션을 맺게되면 쿼리하는 비용보다 커넥션을 맺는 비용이 더 클수 있다.

때문에 TCP/IP 로 DB 와 WAS 서버가 연결된 커넥션들을 커넥션 풀에 미리 생성을 해놓고 애플리케이션 로직은 언제든지 커넥션 풀에 이미 생성되어있는 커넥션 객체 참조를 가져다 쓴다.

 

TCP 커넥션을 맺는 비용은 왜 비쌀까?

연결 초기 설정에서 발생하는 여러 네트워크 지연, 혼잡 제어 및 흐름 제어로 인해 효율성이 떨어진다.네트워크 환경에 따라 이러한 비용이 커질 수 있다.

 


 

흐름제어란?

TCP의 가장 큰 특징 중 하나는 신뢰성 있는 데이터 전송을 보장한다는 점이다. 이 신뢰성을 보장하는 핵심 메커니즘 중 하나가 바로 흐름 제어(Flow Control)입니다.

 

  • 만약 수신 측보다 송신 측의 데이터 전송 속도가 더 빠르다면, 수신 측의 버퍼 용량을 초과하게 되고, 이로 인해 패킷 손실이 발생할 수 있다.
  • 손실이 발생하면 재전송이 필요하고, 이는 네트워크 자원을 낭비하게 된다.

이를 방지하기 위해 TCP는 수신 측의 상태에 따라 송신 측이 데이터를 조절하여 전송할 수 있도록 한다
즉, 수신 측이 감당할 수 있는 만큼만 송신 측이 데이터를 보내도록 조정하는 것이죠.

이 과정에서 잔여 버퍼의 크기를 수신 윈도우 크기(window size) 를 통해 송신 측에게 허용 가능한 전송량을 알려준다.

이렇게 TCP는 흐름 제어를 통해 수신 측 과부하를 방지하고, 신뢰성 있는 통신을 유지한다.

 

 

이러한 위험을 줄이기 위해 송신 측의 데이터 전송량을 수신측에 따라 조절해야한다.

 

해결 방법

 

Stop and Wait : 매번 전송한 패킷에 대해 확인 응답을 받아야만 그 다음 패킷을 전송하는 방법

 

 

 

Sliding Window (Go Back N ARQ)

  • 수신측에서 설정한 윈도우 크기만큼 송신측에서 확인응답없이 세그먼트를 전송할 수 있게 하여 데이터 흐름을 동적으로 조절하는 제어기법
  • 동작방식 : 먼저 윈도우에 포함되는 모든 패킷을 전송하고, 그 패킷들의 전달이 확인되는대로 이 윈도우를 옆으로 옮김으로써 그 다음 패킷들을 전송
  •  
  • Window : TCP/IP를 사용하는 모든 호스트들은 송신하기 위한 것과 수신하기 위한 2개의 Window를 가지고 있다. 호스트들은 실제 데이터를 보내기 전에 '3 way handshaking'을 통해 수신 호스트의 receive window size에 자신의 send window size를 맞추게 된다.

혼잡제어란?

송신측의 데이터는 지역망이나 인터넷으로 연결된 대형 네트워크를 통해 전달된다. 만약 한 라우터에 데이터가 몰릴경우, 자신에게 온 데이터를 모두 처리할 수 없게 된다. 이런 경우 호스트들은 또 다시 재전송을 하게되고, 결국 혼잡만 가중시켜 오버플로우나 데이터 손실을 발생시키게된다. 따라서 이러한 네트워크의 혼잡을 피하기 위해 송신측에서 보내는 데이터 전송 속도를 강제로 줄이게 되는데 , 이러한 작업을 혼잡제어라 한다.

 

즉 망 혼잡으로 재전송을 줄이기 위한 목적이다. 만약 망이 혼잡한데 계속해서 큰 사이즈의 패킷을 보내면 계속 유실이 되거나  재전송이 더 잦은 빈도를 일어나게 될것이다. 이런 혼잡을 피하기 위해 혼잡제어라는 개념이 있다.


또한 네트워크 내에 패킷의 수가 과도하게 증가하는 현상을 혼잡이라 하며, 혼잡 현상을 방지하거나 제거하는 기능을 혼잡제어라 한다.

 

혼잡 제어 예시

네트워크에서 패킷을 전송할 때, 송신자는 패킷을 점차적으로 증가시키며 보내고, 응답(ACK)을 받는다.

예를 들어, 1 → 2 → 4 → 8 → 16 → 32 → ... → 124와 같이 점진적으로 증가시키고, 응답을 받으면 계속해서 전송을 이어간다.

하지만, 만약 2048 크기의 패킷을 보낸 후 ACK 응답이 오지 않는다면, 이는 네트워크 혼잡으로 인해 패킷이 손실되었음을 나타낸다. 이때 송신자는 전송 속도를 줄여 패킷 크기를 작은 사이즈로 다시 전송힌다.

목적: 이 과정의 목적은 현재 네트워크의 혼잡도를 파악하여, 패킷 재전송이 발생하지 않는 최적의 지점을 찾아 최대한 많은 패킷을 안정적으로 전송하는 것이다.

 

흐름제어가 송신측과 수신측 사이의 전송속도를 다루는데 반해 , 혼잡제어는 호스트와 라우터를 포함한 보다 넓은 관점에서 전송문제를 다루게 된다.

 

3-Way Handshake 초기 연결 설정

 

TCP 연결을 설정하기 위해서는 3-way handshake 과정을 거쳐야한다.

 

초기 혼잡 제어 : Slow Start 알고리즘에 따라 처음에 작은 왼도우 크기로 시작하며 점진적으로 전송 속도를 늘려간다.

이 과정에서 데이터 전송 속도가 천천히 증가하지만, 네트워크 혼잡상태를 고려하여 안정적인 속도를 유지하려고 한다.

 

네트워크 지연 : 연결을 설정하는 동안 요청과 응답패킷이 오가면서 지연이 발생한다.

 

연결 수립후 혼잡 제어 안정화 : 연결이 수립되고 난 후 ,TCP 혼잡 제어 알고리즘을 통해 안정적인 속도로 데이터를 전송하게 된다.초기 Slow Start 이후, Congestion Avoidance 상태로 전환되며 데이터 흐름이 안정적으로 효율적으로 이루어진다.

 

패킷 전송: 네트워크 상태가 안정되면, 데이터를 빠르게 전송할 수 있으며, 재전송이 필요하지 않거나 발생하더라도 Retransmit 과 같은 기법으로 빠르게 복구된다.

 

즉, 초기 설정 후에는 혼잡제어에 의한 속도제한이 있지만, 이 이후에는 안정적으로 데이터 전송이 이루어진다.