[networking] TCP 대신 UDP를 사용하는 것이 언제 적절한가요? [닫은]

TCP는 패킷 전달을 보장하므로 “신뢰할 수있는”것으로 간주 될 수 있지만 UDP는 아무것도 보장하지 않으며 패킷이 손실 될 수 있습니다. TCP 스트림이 아닌 응용 프로그램에서 UDP를 사용하여 데이터를 전송하면 어떤 이점이 있습니까? 어떤 상황에서 UDP가 더 나은 선택이며 왜 그럴까요?

UDP는 스트림을 만들고 유지 관리하는 오버 헤드가 없으므로 UDP가 더 빠르다고 가정하지만 일부 데이터가 대상에 도달하지 않으면 관련이 없습니까?



답변

이것은 내가 가장 좋아하는 질문 중 하나입니다. UDP가 너무 잘못 이해되었습니다.

다른 서버에 대한 간단한 답변을 빨리 얻고 싶은 경우 UDP가 가장 효과적입니다. 일반적으로 응답이 하나의 응답 패킷에 포함되기를 원하며 신뢰성을 위해 자체 프로토콜을 구현하거나 다시 보낼 준비가되었습니다. DNS는이 사용 사례에 대한 완벽한 설명입니다. 연결 설정 비용이 너무 높습니다 (아직 DNS는 TCP 모드도 지원합니다).

또 다른 경우는 새로운 데이터가 이전 데이터 / 상태를 대체하기 때문에 손실 될 수있는 데이터를 제공 할 때입니다. 날씨 데이터, 비디오 스트리밍, 주식 시세 서비스 (실제 거래에는 사용되지 않음) 또는 게임 데이터가 떠 오릅니다.

또 다른 경우는 엄청난 양의 상태를 관리하고 OS가 많은 세션을 처리 할 수 ​​없기 때문에 TCP를 사용하지 않는 경우입니다. 이것은 오늘날 드문 경우입니다. 실제로, 응용 프로그램 작성기가 해당 TCP 상태에 필요한 리소스를보다 세밀하게 제어 할 수 있도록 사용할 수있는 사용자 영역 TCP 스택이 있습니다. 2003 년 이전에는 UDP가 실제로 유일한 게임이었습니다.

다른 경우는 멀티 캐스트 트래픽입니다. UDP는 여러 호스트로 멀티 캐스트 될 수 있지만 TCP는이 작업을 전혀 수행 할 수 없습니다.


답변

경우 TCP의 패킷이 손실되는, 그것은 다시 보내야합니다. 특정 순서로 실시간으로 처리되는 데이터에 의존하는 응용 프로그램에는 유용하지 않습니다.

예를 들어 비디오 스트리밍, 특히 VoIP (예 : Skype )가 있습니다. 그러나 그러한 경우에, 손실 된 패킷은 그다지 중요하지 않습니다 : 우리의 감각이 완벽하지 않으므로, 우리는 눈치 채지 못할 수도 있습니다. 이러한 유형의 응용 프로그램이 사용되는 이유 이 TCP 대신 UDP 를 입니다.


답변

UDP의 “신뢰할 수 없음”은 형식입니다. 전송이 절대적으로 보장되는 것은 아닙니다. 실질적인 문제로, 그들은 거의 항상 통과합니다. 시간 초과 후에는 승인되지 않고 재 시도되지 않습니다.

TCP 소켓 협상 및 TCP 패킷 핸드 셰이 킹의 오버 헤드는 엄청납니다. 정말 큰. 인식 가능한 UDP 오버 헤드가 없습니다.

가장 중요한 것은 TCP보다 오버 헤드가 적은 안정적인 전달 핸드 셰이 킹으로 UDP를 쉽게 보완 할 수 있습니다. 이것을 읽으십시오 : http://en.wikipedia.org/wiki/Reliable_User_Datagram_Protocol

UDP는 게시-구독 종류의 응용 프로그램에서 정보를 브로드 캐스트하는 데 유용합니다. IIRC, TIBCO는 상태 변경 알림을 위해 UDP를 많이 사용합니다.

다른 종류의 단방향 “중요한 이벤트”또는 “로깅”활동은 UDP 패킷으로 처리 할 수 ​​있습니다. 전체 소켓을 구성하지 않고 알림을 보내려고합니다. 다양한 청취자의 응답을 기대하지 않습니다.

시스템 “하트 비트”또는 “살아 있습니다”메시지도 좋은 선택입니다. 빠진 것은 위기가 아닙니다. 열 여섯 개가 누락되었습니다.


답변

클라이언트와 서버 간의 UDP (IP) 및 TCP / IP 통신을 모두 지원하는 제품에서 작업하고 있습니다. 15 년 전에 IPX로 시작하여 13 년 전에 IP 지원이 추가되었습니다. 3 년 또는 4 년 전에 TCP / IP 지원을 추가했습니다. 사나운 추측 : UDP 대 TCP 코드 비율은 아마도 약 80/20입니다. 제품은 데이터베이스 서버이므로 안정성이 중요합니다. 우리는 다른 답변에서 이미 언급 한 UDP (패킷 손실, 패킷 배가, 패킷 순서 등)로 부과 된 모든 문제를 처리해야합니다. 거의 문제가 없지만 때때로 발생하기 때문에 처리해야합니다. UDP 지원의 이점은 자체 용도에 맞게 약간 사용자 정의하고 약간 더 성능을 조정할 수 있다는 것입니다.

모든 네트워크는 다를 수 있지만 UDP 통신 프로토콜은 일반적으로 조금 더 빠릅니다. 회의론자는 우리가 모든 것을 올바르게 이행했는지에 대해 의문을 가질 것입니다. 또한 2 자리 담당자가있는 사람에게서 무엇을 기대할 수 있습니까? 그럼에도 불구하고, 나는 방금 호기심에서 테스트를 실행했습니다. 이 테스트는 백만 개의 레코드를 읽습니다 (일부 테이블에서 * 선택). 각 개별 클라이언트 요청과 함께 리턴 할 레코드 수를 1, 10 및 100 (각 프로토콜에 대해 세 번의 테스트 실행)으로 설정했습니다. 서버는 100Mbit LAN을 통해 두 번 홉 떨어져있었습니다. 이 수치는 다른 사람들이 과거에 찾은 것과 일치하는 것으로 보입니다 (UDP는 대부분의 상황에서 약 5 % 빠릅니다). 이 특정 테스트의 총 시간 (밀리 초)은 다음과 같습니다.

  1. 1 기록
    • IP : 390,760ms
    • TCP : 416,903ms
  2. 10 기록
    • IP : 91,707ms
    • TCP : 95,662ms
  3. 100 레코드
    • IP : 29,664ms
    • TCP : 30,968ms

전송 된 총 데이터 양은 IP와 TCP 모두에서 거의 동일했습니다. TCP / IP (체크섬, 시퀀스 번호 등)에서 “무료”로 얻을 수있는 것과 동일한 것들이 있기 때문에 UDP 통신에 추가 오버 헤드가 있습니다. 예를 들어, Wireshark는 다음 레코드 세트에 대한 요청이 UDP의 경우 80 바이트, TCP의 경우 84 바이트임을 보여주었습니다.


답변

이 이미 많은 좋은 답변은 여기에 있습니다,하지만 난 하나 개를 추가 할 매우 잘 요약만큼 중요한 요소. UDP는 정체 제어를 사용하지 않기 때문에 올바른 조정으로 훨씬 높은 처리량을 달성 할 수 있습니다 . TCP의 혼잡 제어는 매우중대한. 연결의 현재 용량을 추정하여 네트워크 정체를 최소화하기 위해 연결 속도와 처리량을 제어합니다. 코어 네트워크와 같이 매우 안정적인 링크를 통해 패킷이 전송 되더라도 라우터의 크기는 제한적입니다. 이러한 버퍼는 용량을 채우고 패킷은 삭제되고 수신 된 승인이 없으면 TCP가이 삭제를 확인하여 용량 추정에 대한 연결 속도를 제한합니다. TCP는 slow start 이지만 처리량 (실제로는 정체 창))는 패킷이 삭제 될 때까지 천천히 증가한 다음, 패킷이 떨어질 때까지 감소하고 천천히 다시 증가합니다. 이로 인해 TCP 처리량이 변동됩니다. 큰 파일을 다운로드하면이를 명확하게 볼 수 있습니다.

UDP는 혼잡 제어를 사용하지 않기 때문에 드롭 포인트까지 버퍼를 최대화하려고하지 않기 때문에 더 빠르며 지연이 적습니다. UDP는 혼잡 제어를 사용하지 않지만 TCP는 사용하기 때문에 TCP에서 용량을 빼앗아 UDP 흐름을 생성 할 수 있습니다.

UDP는 여전히 혼잡 및 패킷 삭제에 취약하므로 재전송 또는 오류 수정 코드를 사용하여 이러한 합병증을 처리 할 수 ​​있도록 응용 프로그램을 준비해야합니다.

결과적으로 UDP는 다음을 수행 할 수 있습니다.

  • 네트워크 드롭률이 애플리케이션이 처리 할 수있는 한계 내에있는 한 TCP보다 높은 처리량을 달성하십시오.
  • 적은 지연으로 TCP보다 빠른 패킷을 제공합니다.
  • 연결을 설정하기위한 초기 핸드 셰이크가 없으므로 연결을 더 빠르게 설정
  • TCP는 다중 연결을 사용해야하는 반면 멀티 캐스트 패킷을 전송합니다.
  • 고정 크기 패킷을 전송하는 반면 TCP는 세그먼트로 데이터를 전송합니다. 300 바이트의 UDP 패킷을 전송하면 다른 쪽 끝에 300 바이트가 수신됩니다. TCP를 사용하면 송신 소켓에 300 바이트를 공급할 수 있지만 수신자는 100 바이트 만 읽으므로 도중에 200 바이트가 더 있는지 확인해야합니다. 응용 프로그램이 바이트 스트림이 아닌 고정 크기 메시지를 전송하는 경우 중요합니다.

요약하면, 적절한 재전송 메커니즘을 구현하는 한 TCP는 TCP가 할 수있는 모든 유형의 응용 프로그램에 UDP를 사용할 수 있습니다. UDP는 매우 빠를 수 있으며 지연이 적으며 연결 기반의 정체의 영향을받지 않으며 고정 된 크기의 데이터 그램을 전송하며 멀티 캐스팅에 사용될 수 있습니다.


답변

UDP는 오버 헤드가 적고 오디오 또는 비디오와 같은 실시간 데이터 스트리밍과 같은 작업을 수행하거나 데이터가 손실 된 경우 괜찮은 경우에 좋습니다.


답변

UDP는 비 연결 프로토콜이며 SNMPDNS 와 같은 프로토콜에 사용됩니다. 순서에 따라 도착하지 않은 데이터 패킷이 수용 가능하고 데이터 패킷을 즉시 전송할 수 있습니다.

네트워크가 스트레스 상태에있을 때, 즉 정체가 통제 된 안정적인 데이터 전송을 달성하기 어려운 경우 네트워크 관리를 수행해야하기 때문에 SNMP에서 사용됩니다.

연결 설정을 포함하지 않으므로 연결 설정 지연을 피하기 때문에 DNS에 사용됩니다.

건배