전송 계층 - 2

이윤설·2024년 8월 21일

6,7. 혼잡 제어(congestion control)

flow control

지난 글에서 TCP의 특징 중, TCP만의 전송 방식(시퀀스 넘버와 ACK를 사용)과 reliable transfer(Send buffer와 Receive buffer를 사용) 개념을 알아보았다.

TCP의 또다른 특징인 flow control에 대해 알아보자.


flow control이란, receiver가 받을 수 있는 만큼(receive buffer의 여유공간)에 따라 데이터의 양(=속도)을 조절하는 것이다.

cf. 10M bps(bit/sec) 라는 게 있다고 가정하자. 단위시간 당 보내는 데이터가 높으면 속도가 높다.

따라서 보내는 양이 크면 보내는 속도도 크다.

그런데 네트워크도 상황이 좋지 않다면 어떻게 해야 할까?
만약 중간 전달자인 네트워크가 5만큼 처리 가능하고, receive buffer가 10 만큼 처리 가능하면 누구에게 맞춰야할까?

정답은 항상 더 상태가 안좋은 것에 맞추어야 한다. 따라서 질문의 답은 네트워크에 맞추는 것이다.

cf. receiver의 상태는 TCP 필드 중 "receive buffer size"로부터 쉽게 알 수 있지만, 네트워크는 모호한 집합체이므로 congestion이 있는지 알기 어렵다. 따라서 네트워크 상태는 congestion control이라는 것을 통해 알아낼 수 있다.

3 way handshake


3-Way Handshake는 데이터를 전송하기 전에 정확한 전송을 보장하기 위해 사전에 세션을 수립하는 과정이다. 양쪽 모두 데이터를 전송할 준비가 되었다는 것을 보장하고, 실제로 데이터 전달이 시작하기 전에 한쪽에서 다른 쪽이 준비되었다는 것을 알 수 있다.

3-way handshake는 TCP의 헤더 중 'TCP 플래그' 라는 세그먼트를 기반으로 이루어진다.
TCP 플래그는 ACK, SYN, FIN 비트 등을 포함한다.


1) 컴퓨터A가 컴퓨터B에게 요청을 보내기 위해 SYN(Synchronize) 필드에 1비트를 담아서 보낸다.
2) 컴퓨터B가 요청 수락을 컴퓨터A에게 보내기 위해 ACK 필드에 1비트를 담아서 보낸다.
3) 컴퓨터B의 확인을 확인하기 위해 ACK 필드 1을 설정 후 보낸다.


연결을 해제할 때는 4-way-handshake를 사용한다.

1) 컴퓨터A가 컴퓨터B에게 연결종료 요청을 보내기 위해 FIN 필드에 1비트를 담아서 보낸다.
2) 컴퓨터B가 요청 수락을 컴퓨터A에게 보내기 위해 ACK 필드에 1비트를 담아서 보낸다.
3) 컴퓨터B가 컴퓨터A에게 연결종료 요청을 보내기 위해 FIN 필드에 1비트를 담아서 보낸다.
4) 컴퓨터 A가 요청 수락을 컴퓨터B에게 보내기 위해 ACK 필드에 1비트를 담아서 보낸다.

congestion control, end to end congestion

TCP Congestion Control

정의:
TCP 혼잡 제어는 네트워크의 혼잡 상태를 감지하고 이를 완화하기 위해 데이터 전송 속도를 조절하는 기술이다. 혼잡이 발생하면 패킷 손실이나 지연이 증가할 수 있으므로, 이를 방지하기 위해 다양한 혼잡 제어 알고리즘을 사용한다.

작동 원리:
TCP는 여러 혼잡 제어 알고리즘을 사용합니다. 주요 알고리즘은 다음과 같다:

  • Additive Increase/Multiplicative Decrease (AIMD): 데이터 전송 속도를 점진적으로 증가시키고, 혼잡을 감지하면 급격히 감소시킵니다.
  • Slow Start: 연결이 시작될 때 데이터 전송 속도를 서서히 증가시킨다.
  • Congestion Avoidance: 혼잡이 감지될 때 전송 속도를 조절하여 혼잡을 피한다.
  • Fast Retransmit: 패킷 손실을 빠르게 감지하고 재전송한다.

핵심 원칙:
네트워크가 혼잡할 것으로 예상되면 데이터 전송 속도를 줄여야 하며, 혼잡이 없으면 전송 속도를 증가시킨다.
혼잡 상태에서 데이터를 계속 재전송하면 실제 전송량이 더 많아지고, 상태가 악화될 수 있다.

End-to-End Congestion Control

정의:
End-to-End Congestion Control은 네트워크의 중간 장비가 혼잡 상태에 대한 명시적인 피드백을 제공하지 않는 경우, 송신자와 수신자만으로 혼잡을 감지하고 조절하는 방식이다.

특징:

  • 네트워크 중간 장비가 혼잡 상태 정보를 직접 제공하지 않기 때문에, 송신자는 패킷 손실이나 지연(ACK이 늦게 오는 경우) 등의 간접적인 신호를 통해 혼잡을 감지한다.
  • 송신자는 이러한 신호를 기반으로 데이터 전송 속도를 조절하여 혼잡을 관리한다.

Why is TCP fair?


두 개의 데이터 스트림이 전송될 때 정말 동등한 양과 속도로 보내질까?

두 개의 데이터 스트림이 전송될 때, 각각의 스트림은 네트워크의 혼잡 상태에 따라 전송 속도를 조절한다.
이 과정에서 AIMD 방식이 적용되어, 각 스트림이 네트워크 자원을 대략적으로 동등하게 사용하게 되어,
결과적으로 1/2로 수렴하게 된다.
이러한 경우를 우리는 fair하다고 한다.

cf. AIMD(Additive Increase/Multiplicative Decrease):
TCP는 데이터 전송 중 네트워크 혼잡 상태를 감지하면 전송 윈도우 크기를 감소시키고, 혼잡이 완화되면 점진적으로 윈도우 크기를 증가시키는 것


알면 좋은 것들

1. TCP와 UDP의 핵심 차이

  • TCP는 연결 지향적이고 신뢰성을 보장합니다. 데이터의 순서, 완전한 전송을 보장하며, 혼잡 제어와 흐름 제어를 통해 안정적인 통신이 가능합니다.
  • UDP는 비연결 지향적이고 속도가 빠릅니다. 데이터 전송 순서나 패킷 손실을 보장하지 않지만, 그만큼 오버헤드가 적고 지연이 거의 없습니다.

2. TCP 실무 포인트

  • TLS/SSL 통합: 대부분의 웹 애플리케이션에서 TCP는 TLS/SSL을 통해 보안을 강화하여 사용합니다. HTTPS를 비롯한 보안 통신이 기본이 되므로, TLS 설정과 최적화는 필수입니다.
  • 장기 연결(Long-lived connections): 실시간 애플리케이션(예: 채팅, 실시간 스트리밍)에서 장기 연결이 필요합니다. 이때 Keep-Alive, 커넥션 풀링 등을 활용해 효율적으로 연결을 유지해야 합니다.
  • Nagle's Algorithm: 작은 패킷을 하나로 묶어 전송하여 네트워크 부담을 줄이는 기법인데, 실시간 애플리케이션에서는 지연이 발생할 수 있습니다. 따라서 필요에 따라 TCP_NODELAY를 사용해 비활성화할 수 있습니다.
  • TCP 혼잡 제어 알고리즘 최신 동향: BBR, CUBIC 등의 혼잡 제어 알고리즘이 최근 많이 사용됩니다. 특히 BBR(Bottleneck Bandwidth and Round-trip propagation time)은 구글에서 개발한 것으로, 고속 네트워크 환경에서 성능을 크게 향상시킬 수 있습니다.

3. UDP 실무 포인트

  • 실시간 애플리케이션: 비디오 스트리밍, VoIP, 게임 등에서 UDP가 주로 사용됩니다. 패킷 손실이나 순서가 크게 문제가 되지 않는 환경에서 높은 속도와 낮은 지연을 제공합니다.
  • QUIC 프로토콜: UDP를 기반으로 구글이 개발한 프로토콜로, HTTP/3에서 사용됩니다. TCP의 신뢰성과 UDP의 속도를 결합한 형태로, 브라우징 속도를 크게 개선합니다. 최신 웹 서비스 개발에서는 HTTP/3와 QUIC의 지원 여부를 점검해야 합니다.
  • UDP 홀 펀칭: NAT 환경에서 P2P 연결을 위해 많이 사용되는 기법입니다. 실시간 통신 애플리케이션에서 두 클라이언트 간의 직접 연결을 위해 UDP 홀 펀칭을 활용할 수 있습니다.

4. 혼잡 제어와 네트워크 안정성

  • 혼잡 제어 튜닝: 고속 대용량 전송이 필요한 환경에서는 TCP의 혼잡 제어 파라미터를 조정해 성능을 높일 수 있습니다. 커널 설정을 통해 윈도우 크기, 타임아웃 등을 최적화하는 것이 중요합니다.
  • QoS와 네트워크 우선순위: 중요 트래픽에 우선순위를 부여하기 위해 Quality of Service(QoS)를 설정할 수 있습니다. 게임 서버, 미디어 스트리밍 등에서는 특정 포트나 패킷에 우선권을 부여해 안정적인 서비스를 제공합니다.

5. 현대 네트워크 환경에서의 최적화 전략

  • 로우 레이턴시와 고속 네트워킹: 고속 인터넷 환경에서의 레이턴시 최적화가 중요합니다. 레이턴시를 줄이기 위해 TCP Fast Open(TFO)와 같은 기능을 사용하거나, UDP 기반의 프로토콜을 설계할 수 있습니다.
  • 멀티플렉싱: HTTP/2, HTTP/3와 같은 프로토콜에서는 멀티플렉싱을 사용해 한 연결에서 여러 요청을 동시에 처리할 수 있습니다. 이는 TCP의 단점을 보완하며, 높은 효율성을 제공합니다.

6. 개발 도구와 모니터링

  • 네트워크 분석 툴: Wireshark, tcpdump 등으로 패킷을 분석하여 성능 이슈나 보안 문제를 진단할 수 있습니다.
  • 로드 밸런싱과 스케일링: 여러 TCP 연결을 관리하고 부하를 분산하기 위해 로드 밸런서(예: Nginx, HAProxy)를 사용합니다. 특히 마이크로서비스 아키텍처에서는 연결 관리가 중요합니다.

7. UDP 기반 신기술

  • WebRTC: 실시간 P2P 통신을 위해 사용되며, UDP 기반입니다. 브라우저 간 실시간 미디어 전송에서 핵심 기술로 자리 잡았습니다.
  • DTLS: UDP에서 TLS 보안을 적용하기 위한 표준입니다. WebRTC 등에서 보안을 강화하기 위해 사용됩니다.
profile
화려한 외면이 아닌 단단한 내면

0개의 댓글