문제

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

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

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

나는 종종 TCP가 올바른 선택이라는 것을 알고 있지만 대안 목록을 갖는 것이 그러한 결론을 내리는 데 도움이 되는 경우가 많습니다.Enet, RUDP 등 UDP를 기반으로 구축된 것들은 다양한 장단점이 있는데, 사용해 보신 적이 있나요? 경험이 있으신가요?

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

도움이 되었습니까?

해결책

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

그러나 (매우!) 일반적인 관점에서 전송하려는 데이터에 대해 몇 가지 어려운 가정을 할 수 없다면 속도 측면에서 tcp를 이기려면 정말 열심히 노력해야 할 것입니다.

예를 들어, 전송하려는 데이터가 단일 패킷의 손실을 허용할 수 있는 정도라면(예:샘플링 속도가 신호의 대역폭보다 몇 배 더 높은 정기적으로 샘플링된 데이터) 데이터 손상을 감지할 수 있도록 함으로써 전송의 신뢰성을 어느 정도 희생할 수 있습니다(예:좋은 crc를 사용하여)

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

다른 팁

는 어때 SCTP.IETF(RFC 4960)의 표준 프로토콜입니다.

속도에 도움이 되는 청킹 기능이 있습니다.

업데이트:ㅏ TCP와 SCTP의 비교 두 개의 인터페이스를 사용하지 않는 한 성능이 비슷하다는 것을 보여줍니다.

업데이트:ㅏ 좋은 소개글이네요.

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

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

ENET은 데이터의 여러 '채널'을 전송하고 전송된 데이터를 신뢰할 수 없거나 순서대로 전송하는 옵션을 제공합니다.또한 앞서 언급한 P2P Ping(연결 유지 기능)도 포함됩니다.

UDT(UDP 기반 데이터 전송)를 사용하는 일부 방위산업 고객이 있습니다(참조: http://udt.sourceforge.net/) 매우 만족하고 있습니다.나는 그것이 친숙한 BSD 라이센스도 가지고 있다는 것을 알았습니다.

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

이는 다음을 제공합니다:

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

활성 유지와 관련하여 ENet보다 약간 더 구성 가능한 것처럼 보이지만 많은 옵션을 제공하지는 않습니다(예:모든 데이터는 신뢰할 수 있고 사용자가 결정한 비트뿐만 아니라 순서가 지정됩니다.구현하는 것이 매우 간단 해 보입니다.

다른 사람들이 지적했듯이 귀하의 질문은 매우 일반적이며 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");

위의 목록이 충분하지 않다고 판단하고 신뢰할 수 있는 자체 UDP를 개발하려는 사람은 Google QUIC 사양을 살펴봐야 합니다. 이 사양에는 복잡한 특수 사례와 잠재적인 서비스 거부 공격이 많이 포함되어 있기 때문입니다.나는 아직 이것을 구현해 본 적이 없으며 이것이 제공하는 모든 것을 원하거나 필요하지 않을 수도 있지만 새로운 "신뢰할 수 있는" UDP 설계를 시작하기 전에 이 문서를 읽어 볼 가치가 있습니다.

QUIC의 좋은 출발점은 여기, Chromium 블로그를 방문하세요.

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

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

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

UDP에서 신뢰성을 얻으려면 기본적으로 UDP 위에 TCP 기능 중 일부를 다시 구현하게 되며, 이로 인해 처음에 TCP를 사용하는 것보다 속도가 느려질 수 있습니다.

프로토콜 DCCP, 표준화됨 RFC 4340, "데이터그램 혼잡 제어 프로토콜"이 당신이 찾고 있는 것일 수 있습니다.

것 같다 리눅스에서 구현.

아마도 RFC 5405, "애플리케이션 설계자를 위한 유니캐스트 UDP 사용 지침"이 도움이 될 것입니다.

데이터 압축을 고려하셨나요?

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

루드프.많은 게임용 소켓 서버는 비슷한 것을 구현합니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top