신뢰할 수있는 UDP가 필요할 때 무엇을 사용합니까?


92

TCP 연결이 잠재적으로 너무 느리고 UDP '연결'이 잠재적으로 너무 불안정한 상황이있는 경우 무엇을 사용합니까? 신뢰할 수있는 다양한 표준 UDP 프로토콜이 있습니다. 어떤 경험이 있습니까?

회 신당 하나의 프로토콜에 대해 논의하고 다른 사람이 이미 사용중인 프로토콜을 언급 한 경우 투표하고 필요한 경우 설명을 사용하여 설명하는 것을 고려하십시오.

여기서는 TCP가 스케일의 한쪽 끝에 있고 UDP가 다른쪽에있는 다양한 옵션에 관심이 있습니다. 신뢰할 수있는 다양한 UDP 옵션을 사용할 수 있으며 각각 TCP의 일부 요소를 UDP로 가져옵니다.

나는 종종 TCP가 올바른 선택이라는 것을 알고 있지만 대안 목록이 있으면 그 결론에 도달하는 데 도움이되는 경우가 많습니다. UDP를 기반으로 구축 된 Enet, RUDP 등과 같은 것에는 다양한 장단점이 있습니다. 사용해 본 적이 있습니까? 경험은 무엇입니까?

의심을 피하기 위해 더 이상 정보가 없습니다. 이것은 가설적인 질문이며 결정을 내려야하는 사람이 사용할 수있는 다양한 옵션과 대안을 자세히 설명하는 응답 목록을 도출하기를 바랐습니다.


1
이 질문은 기술에 대한 폴링이므로 주제에서 벗어난 것으로 보입니다
Dave Hillier 2014 년

TCP가 모든 경우에 가장 좋다고 생각하는 사람들은 다음을 읽어보십시오. en.wikipedia.org/wiki/Bandwidth-delay_product
nullptr

Wikipedia에는 UDP, UDP Lite, TCP, 다중 경로 TCP, SCTP, DCCP 및 RUDP의 다양한 측면을 비교 하는 멋진 표가 있습니다. SCTP는 해당 목록에있는 대부분의 기능을 지원합니다.
Evgeniy Berezovsky 2015

@EugeneBeresovsky 저는 SCTP에 대해 약간의 조사를했는데, 대부분의 정보 (SO 답변 포함, 2013 년 이전 날짜) 대부분의 사람들은 당시 SCTP 채택이 매우 낮았다 고 썼습니다. 오늘은 어떻습니까? stackoverflow.com/questions/1171555/…
Michael IV

@MichaelIvanov 채택률은 실제로 낮습니다. 그러나 데이터 센터 내에서 사용하려는 경우 스위치와 라우터가 문제를 일으키지 않고 (데이터 센터에서는 그렇게해서는 안되는) OS가있는 한 외부 채택에 신경 쓰지 않습니다. 연결 한 질문의 답변 중 하나 에 설명 된대로 문제가 될 수있는 라이브러리 지원 .
Evgeniy Berezovsky

답변:


25

문제의 영역에 대한 추가 정보 없이는이 질문에 답하기가 어렵습니다. 예를 들어, 어떤 양의 데이터를 사용하고 있습니까? 얼마나 자주? 데이터의 특성은 무엇입니까? (예 : 고유 한 일회성 데이터입니까? 아니면 샘플 데이터 스트림입니까? 등) 어떤 플랫폼을 위해 개발하고 있습니까? (예 : 데스크탑 / 서버 / 임베디드) "너무 느림"이 의미하는 바를 파악하기 위해 어떤 네트워크 매체를 사용하고 있습니까?

그러나 (매우!) 일반적인 용어로는 전송하려는 데이터에 대해 어려운 가정을 할 수 없다면 속도면에서 tcp를 이기기 위해 정말 열심히 노력해야한다고 생각합니다.

예를 들어 전송하려는 데이터가 단일 패킷의 손실을 허용 할 수있는 수준이면 (예 : 샘플링 속도가 신호 대역폭보다 몇 배 높은 정기적으로 샘플링 된 데이터) 다음 작업을 수행 할 수 있습니다. 데이터 손상을 감지 할 수 있는지 확인하여 전송의 신뢰성을 희생합니다 (예 : 좋은 crc 사용을 통해).

그러나 단일 패킷 손실을 용인 할 수 없다면 tcp가 이미 가지고있는 안정성을위한 기술 유형을 도입해야합니다. 그리고 합리적인 양의 작업을하지 않고도 이러한 요소를 모든 고유 한 속도 문제와 함께 사용자 공간 솔루션으로 구축하기 시작할 수 있습니다.


4
알겠습니다. 질문을 조정하겠습니다. 'TCP 사용'응답보다는 신뢰할 수있는 다양한 UDP 프로토콜의 장단점에 더 관심이 있습니다.)
Len Holgate

9
@Andrew-두 가지 경우에서 TCP를이기는 것은 매우 쉽습니다. (1) 응용 프로그램은 "모든 데이터가 항상 순서대로, 중복되지 않으며 과도한 대기열이 없음"보다 더 가벼운 신뢰성 요구 사항을 가지고 있습니다. 또는 (2) 멀티 캐스트를 사용하고 있습니다. 신뢰할 수있는 UDP는 멀티 캐스트 환경에서 매우 일반적입니다.
Tom

4
또한 TCP는 WAN 연결을 통해 사용될 때 끔찍한 문제를 겪습니다 (장기 문제). 간단합니다. TCP는 창에있는 패킷을 확인해야하는 창을 사용합니다. ACK 프로토콜은 회선 거리로 인한 지연으로 인해 어려움을 겪습니다. Google : WAN TCP "빛의 속도"
Ajaxx

3
@Ajaxx, 당신은 이것에 대해 매우 정확하지만, TCP / IP는 마지막 인터넷 붕괴 때문에 의도적으로 이것을 수행합니다. 혼잡 제어없이 높은 비트 전송률 프로토콜을 수행하는 경우 기본적으로 부끄럽습니다. 네트워크를 소유하고 있다면 거칠게 가십시오.
Kevin Nisbet

2
"샘플링 속도가 니퀴 스트 속도보다 상당히 높은 경우"-샘플링 속도는 정의상 항상 니퀴 스트 속도의 두 배입니다.
스티브

27

무엇에 대해 SCTP . IETF (RFC 4960)의 표준 프로토콜입니다.

속도에 도움이 될 수있는 청크 기능이 있습니다.

업데이트 : TCP와 SCTP 를 비교하면 두 인터페이스를 사용할 수없는 경우 성능이 비슷 함을 알 수 있습니다.

업데이트 : 멋진 소개 기사 .


좋습니다. 저는 IP 위에 빌드하기보다는 UDP 위에 빌드 할 수있는 것에 더 관심이 있지만 확실히 솔루션 공간에 맞는 것입니다.
Len Holgate

SCTP는 많은 훌륭한 기능 (예 : 멀티 호밍)을 가지고 있으며 부분적 안정성 확장 (RFC 3758)을 통해 매우 유연한 옵션입니다. 최신 Linux 커널 버전에 포함되어 있지만 Windows의 경우 자체 SCTP 스택을 설치해야합니다.
Andrew Johnson

6
SCTP는 UDP를 통해 터널링 될 수 있습니다. tools.ietf.org/id/draft-ietf-sigtran-sctptunnel-00.txt
Miles

감사합니다 Miles, 유용한 링크입니다!
Len Holgate

1
예 ...하지만 UDP와 동일한 수준이 아니라 UDP 위에 구축 된 것은 적어도 Windows에서 사용자 공간에서 구현하기가 더 쉬울 것입니다 ...
Len Holgate

21

ENET- http://enet.bespin.org/

저는 ENET을 신뢰할 수있는 UDP 프로토콜로 사용하고 서버에서 사용하는 클라이언트를 위해 비동기 소켓 친화적 버전을 작성했습니다. 꽤 잘 작동하지만 P2P 핑이 유휴 연결에 추가하는 오버 헤드가 마음에 들지 않습니다. 많은 연결이있을 때 모든 연결을 정기적으로 핑하는 것은 많은 바쁜 작업입니다.

ENET은 데이터의 여러 '채널'을 전송하고 전송 된 데이터가 신뢰할 수 없거나 신뢰할 수 있거나 순서가 지정되도록하는 옵션을 제공합니다. 또한 연결 유지 역할을하는 앞서 언급 한 피어 투 피어 핑도 포함됩니다.


14

UDT (UDP 기반 데이터 전송) ( http://udt.sourceforge.net/ 참조)를 사용하는 일부 방위 산업 고객이 있으며 매우 만족합니다. 친근한 BSD 라이센스도 있습니다.


2
특히 국방 부문에서 고객과 고객의 사용 사례에 대해 자세히 설명해 주시겠습니까? 아마 아닐 수도 있지만 한 번 시도해 볼 가치가 있습니다. 나는 실제로 파일 전송 응용 프로그램에서 UDT에 대한 아이디어를 상사에게 던졌지 만 실제로는 아직 아무데도 가지 않았습니다.
Thomas Owens

10

RUDP- 신뢰할 수있는 사용자 데이터 그램 프로토콜

다음을 제공합니다.

  • 수신 된 패킷의 승인
  • 윈도 잉 및 혼잡 제어
  • 손실 된 패킷 재전송
  • 오버 버퍼링 (실시간 스트리밍보다 빠름)

ENet보다 생존 유지와 관련하여 약간 더 구성 가능해 보이지만 많은 옵션을 제공하지 않습니다 (즉, 모든 데이터가 신뢰할 수 있고 결정해야하는 비트뿐만 아니라 순서가 지정됨). 구현하는 것은 매우 간단합니다.


나는 이것을보고 있었지만 많은 구현이없는 것 같습니다. 추천이 있으십니까?
Nicholas

아뇨, 죄송합니다. 나는 결국 그것을 사용하지 않았고 항상 처음부터 구현할 것입니다.
Len Holgate 2014

9

다른 사람들이 지적했듯이 귀하의 질문은 매우 일반적이며 TCP보다 '빠른지'여부는 응용 프로그램 유형에 따라 크게 달라집니다.

TCP는 일반적으로 한 호스트에서 다른 호스트로 데이터를 안정적으로 스트리밍하는 속도만큼 빠릅니다. 그러나 애플리케이션이 작은 트래픽 버스트를 많이 수행하고 응답을 기다리는 경우 지연 시간을 최소화하는 데 UDP가 더 적합 할 수 있습니다.

쉬운 중간 지대가 있습니다. Nagle의 알고리즘 은 송신자가 대량의 데이터 스트림을받는 사람을 압도하여 혼잡과 패킷 손실을 초래하지 않도록하는 TCP의 일부입니다.

TCP의 안정적인 순차 전달과 UDP의 빠른 응답이 필요하고 대용량 데이터 스트림 전송으로 인한 혼잡에 대해 걱정할 필요가없는 경우 Nagle 알고리즘을 비활성화 할 수 있습니다.

int opt = -1;
if (setsockopt(sock_fd, IPPROTO_TCP, TCP_NODELAY, (char *)&opt, sizeof(opt)))
  printf("Error disabling Nagle's algorithm.\n");

내가 말했듯이 TCP가 스케일의 한쪽 끝에 있고 다른 쪽 끝에 UDP가 있다고 가정하면 다른 것이 있습니다.
Len Holgate

현명 해지기를 원한다면 대부분의 논의 된 프로토콜이 UDP를 기반으로 구축됩니다.
smo

TCP가 한쪽 끝에 있고 UDP가 다른 쪽 끝에 있다는 가정은 거짓입니다. 예를 들어 UDP에는 흐름 제어가 없습니다. 패킷을 너무 빨리 쉽게 보낼 수 있으므로 중간 라우터가 모든 패킷을 삭제하게됩니다. 그럼 어떻게 해요? 손실 된 패킷을 무시하거나 다시 보내시겠습니까? 그것들을 재전송하면 결국 TCP를 다소간 다시 구현하게 될 것입니다. 안정적인 통신을위한 또 다른 옵션은 SCTP입니다.
nos

1
빠른 응답이 반드시 높은 처리량과 같지는 않습니다.
Matt

1
동의하지 않습니다. nagle이 많은 작은 패킷이있는 TCP 기반 프로토콜에서 사용되는 경우 함께 병합하여 더 큰 패킷을 생성합니다. 전송에 약간의 지연이 발생하므로 지연이 매우 약간 증가 할 수 있습니다. 그러나 더 많은 패킷 = 더 많은 패킷 헤더 = 더 큰 오버 헤드로 인해 nagle을 끄면 처리량이 낮아질 수 있습니다. LAN에서 삭제되는 패킷은 일반적으로 입력 버퍼 채우기와 관련이 있습니다. 동일한 호스트에 데이터를 보내는 많은 클라이언트가있는 경우 차이가 없을 수 있습니다. 나는 nagle을 끄고 켜는 것이 실제로 영향을 미칠 것이라고 생각하지 않습니다.
Matt

8

위의 목록이 충분하지 않다고 판단하고 자신의 신뢰할 수있는 UDP를 개발하기를 원하는 사람은 많은 복잡한 코너 케이스와 잠재적 인 서비스 거부 공격을 다루기 때문에 Google QUIC 사양을 확인해야합니다. 나는 아직 이것의 구현을 가지고 놀지 않았고, 당신은 그것이 제공하는 모든 것을 원하거나 필요로하지 않을 수도 있지만,이 문서는 새로운 "신뢰할 수있는"UDP 디자인을 시작하기 전에 읽을 가치가 있습니다.

QUIC의 좋은 출발점이 여기 있습니다. 크롬 블로그에서 이상.

현재 QUIC 디자인 문서는 여기 에서 찾을 수 있습니다 .


4

TCP 연결이 잠재적으로 너무 느리고 UDP '연결'이 잠재적으로 너무 불안정한 상황이있는 경우 무엇을 사용합니까? 신뢰할 수있는 다양한 표준 UDP 프로토콜이 있습니다. 어떤 경험이 있습니까?

문장의 핵심 단어는 '잠재적'입니다. 프로토콜의 안정성이 필요한 경우 TCP가 실제로 필요에 비해 너무 느리다는 것을 스스로 증명해야한다고 생각합니다.

UDP에서 안정성을 얻으려면 기본적으로 UDP 위에 TCP의 일부 기능을 다시 구현하여 처음에 TCP를 사용하는 것보다 속도가 느려질 것입니다.


예, Andrew Edgecombe는 많이 말했지만 제가 말했듯이 어떤 대안이 있는지의 장단점에 관심이 있습니다. 대안 목록과 장단점 목록이 없으면 무엇이 가장 좋은지 결정하기가 어렵습니다.
Len Holgate

알려진 신뢰성 기능이 주어지면 때때로 UDP 스트림을 직접 조정하여 OS에서 TCP 스트림을 능가 할 수 있습니다. 드물지만.
Joshua

1
@ 17 / 26, Len Holgate에 동의합니다. TCP는 일부 상황에서 신뢰할 수있는 UDP보다 느립니다. 높은 BDP 네트워크와 마찬가지로 중국에서 NewYork까지 1Gbps의 인터넷 연결이 있다고 가정하면 TCP가 거의 모든 1Gbps 속도를 사용하는 것이 좋지 않을 것이라고 확신합니다. TCP는 지구상의 대부분의 연결에 더 좋지만 고 대역폭 지연 제품이있는 네트워크에는 적합하지 않습니다.
nullptr 2014


3

RFC 5405 일 수 있습니다. "애플리케이션 설계자를위한 유니 캐스트 UDP 사용 지침"이 유용 할 것입니다.


2

데이터 압축을 고려하셨습니까?

위에서 언급했듯이 문제의 정확한 특성에 대한 정보가 부족하지만 데이터를 압축하여 전송하면 도움이 될 수 있습니다.


1
특히 최신 압축 라이브러리에서. 일부는 memcpy만큼 빠릅니다. 예 : lz4.
Matt


-3

UDP를 사용하여 안정성을 달성하는 가장 좋은 방법은 응용 프로그램 자체에 안정성을 구축하는 것입니다 (예 : 승인 및 재전송 메커니즘 추가).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.