본문 바로가기
CS 기초/Network

Reliable UDP (RUDP)란?

by woohyeon 2023. 2. 6.
반응형
Reliable: 신뢰할 수 있는

 

TCP는 패킷 통신에 있어서 다음과 같은 특징 및 기능 제공 통해 신뢰성을 보장하는 프로토콜이다.

  • 패킷 순서 보장: 송신한 순서대로 수신함을 보장
  • 패킷 무결성 보장: 송신한 패킷과 수신한 패킷의 내용이 동일함을 보장
  • 패킷 도착 보장: 송신 패킷은 꼭 상대에게 도착할 것을 보장(재전송 등을 통해 자체적으로)
  • 혼잡 제어(congestion control): 패킷 송수신이 원활하게 발생할 수 없는 상황에 대한 자체적인 처리 
  • 흐름 제어(flow control): 혼잡 상황 혹은 수신측이 감당할 수 없는 양의 패킷 전송 등이 최대한 발생하지 않도록 패킷의 전송 흐름을 제어하는 기능


UDP는 위와 같은 기능을 제공하지 않는다. Reliable UDP는 신뢰될 수 있는 UDP 라는 의미로 위와 같은 기능을 자체적으로 구현하여 TCP 및 UDP의 특징을 가진 프로토콜이다. (순서, 무결성, 도착 보장 세 가지이고, 혼잡 제어 및 흐름 제어는 선택적 요소인 것 같기도 하다.)

각 기능을 구현하는 기본 아이디어를 살펴보면 다음과 같다.

패킷 순서 보장
각 패킷에 번호를 붙이고 수신측에서 알맞은 번호 순대로 패킷을 수신하면 처리한다.

패킷 무결성 보장
패킷에 crc, 체크섬 등을 삽입하여 변형이 있는지 체크

패킷 도착 보장
각 패킷에 번호를 붙이고 응답으로 받은 ack 번호를 체크하여 도착하지 않으면 재전송

혼잡 제어
혼잡 제어는 네트워크 환경 부하 등의 비정상적 상황에서 자체적으로 통신량 등을 조절하여 정상적인 상황으로 돌아가기 위한 기능이다. TCP의 혼잡 제어 방식을 살펴보면 다음과 같은 방식들이 있다.

  • Slow Start
    • 처음엔 패킷을 하나씩 보내다가 수신측에서 문제 없이 수신한다면 ACK 패킷마다 윈도 크기(단위 시간 내에 보내는 패킷의 수)를 1씩 늘리는 방식 -> 단위 시간당 패킷 수가 10이면 10, 20, 40, 80, ...
    • 혼잡 상황이 발생하면 윈도 크기를 1로 떨어뜨린다. 
  • Fast Retransmission(빠른 재전송)
    • 수신측에서 먼저 도착해야할 패킷(A)이 오기 전에 다음 패킷이 먼저 왔다면, 정상적으로 도착한 패킷의 다음 패킷(즉 도착하지 않은 첫 패킷 = A)의 순번을 Ack에 담아 전송한다. 이후에도 A 패킷이 오지 않고 계속해서 그 다음 패킷이 전송된다면 Ack(A)가 계속해서 송신측으로 전달될 것이다. 송신측에서 Ack(A)를 N개(보통 3개라 한다) 받으면... A에 대한 패킷을 재전송한다. 그림으로 보면 아래와 같다.
    • 이런 상황 발생 시 윈도 크기 또한 줄인다.
  • Fast Recovery(빠른 회복)
    • 혼잡한 상태를 감지하면 윈도 크기를 반으로 줄이고 선형 증가시키는 방법 -> ex) 윈도 크기가 10이면 5, 6, 7, 8, ..
  • AIMD(Additive Increase/Multiplicative Decrease)
    • 패킷을 하나씩 보내다가 문제 없이 도착하면 윈도 크기를 1씩 늘리며 전송한다.
    • 패킷 전송에 실패하거나 일정 시간 경과 시 패킷 송신 속도를 절반으로 줄인다.
    • 초기에 높은 대역폭 활용이 불가능해 오래 걸릴 수 있다.

Fast Retransmission(빠른 재전송)

 

참고로 프라우드넷에서는 UDP에 자체적으로 혼잡 제어 기능을 제공한다고 한다.

http://blog.nettention.com/ko/post/2015/08/20/proudnet-udp-congestion-control.aspx

 

Nettention Blog

by Sophia Lee / 2015. 08. 20. [06:08] 프라우드넷을 쓴 게임 중 하나가 2011년에 중국에서 문제를 일으켰다는 사건이 화제가 되었던 적이 있습니다. (관련 링크) 문제의 현상은 P2P나 C/S간 UDP 통신량이

blog.nettention.com

요약하면 두 단말기 사이에서 TCP, UDP 통신이 발생하고 있는데 데이터 통신량이 증가된 상황이다. 두 단말기 사이의 라우터와 같은 네트워크 장비는 처리하지 못하는 일부 데이터를 버리기 시작한다. TCP는 혼잡 제어 기능이 있기에 이를 감지하여 스스로 송신량을 조정한다. UDP는 이를 감지하지 못하기 때문에 이에 대한 대처를 하지 않는다. UDP에서 계속해서 증가하는 통신량 때문에 네트워크 장비는 TCP에 대한 처리도 제대로 못하게 된다. 이러한 상태가 지속되면 TCP 연결이 끊어진다고 한다.

이를 위해 수신자 측에서 주기적으로 송신자 측에 패킷 유실율 및 데이터 수신 속도를 측정하여 회신한다고 한다. 그리고 송신자 측은 패킷 유실율이 높으면 데이터 수신 속도를 참고해서 송신 속도를 제한하는 등의 기능을 수행한다고 한다.  

 


흐름 제어
흐름 제어는 혼잡 상황 혹은 수신측이 감당하지 못할 패킷량을 보내는 등의 상황을 방지하기 위해 패킷의 흐름을 제어하는 기능이다. TCP의 흐름 제어 방식을 살펴보면 다음과 같은 방식들이 있다. 두 방식 모두 수신한 패킷에 대해 자동으로 Ack등을 전달하는 ARQ 방식이 적용 되어 있어야 한다.

  • Stop and Wait
    • 송신측이 보낸 패킷에 대한 Ack를 수신할 때까지 다음 패킷을 보내지 않고 기다리는 방식이다.
    • 정상적으로 수신했다는 Ack 수신 시 다음 패킷을 보낸다.
    • 일정 시간 동안 Ack가 오지 않으면 패킷을 재전송한다.
  • Sliding Window
    • 수신 측에 전송할 일정 크기의 윈도(패킷 버퍼)가 있을 것이다.
    • 해당 크기 내에서 순서대로 패킷을 전달한다. 전달한 크기만큼 윈도 크기를 줄인다.
    • Ack를 받으면 윈도 크기를 그만큼 늘린다.
      • ex) 하나의 버퍼가 다음의 패킷들을 담고 있을 때..
      • {1, 2, 3, 4, 5, 6}
      •  1, 2를 전송하고 나면 {3,4,5,6}으로 크기를 줄이고 1, 2에 대한 Ack를 수신하면 {3,4,5,6,7,8}으로 크기를 다시 늘린다.



댓글