TCP와 UDP를 동시에 사용하는 것이 합리적입니까?


10

읽은 후 데이터가 많은 실시간 게임에서 UDP가 여전히 TCP보다 낫습니까? , TCP와 UDP를 동시에 사용하는 것이 다른지 궁금합니다.

  • 자주 전송되지 않지만 안정적으로 도착하는 정보를 전송하기위한 TCP.
    게임 세계에서 점수 업데이트, 플레이어 이름 또는 표시등의 켜짐 / 꺼짐 상태 등이 있습니다.

  • 최신 정보가 항상 제공되기 때문에 지속적으로 업데이트되고 때때로 손실 될 수있는 정보를 전송하기위한 UDP.
    위치, 회전 등

이것이 합리적인 생각입니까? 가능한 단점은 무엇입니까?
이것을 처리하는 더 좋은 방법이 있습니까?


이 사이트에서 udp 및 tcp에 관한 나머지 스레드를 읽으십시오. 본질적으로 질문을 다루는 몇 가지 세부 사항을 찾을 수 있습니다. 가설로서 : UDP를 통한 하이브리드 프로토콜이 있다고 믿습니다. 즉, 지연 시간 감소, 경합 전략,로드 밸런싱 및 전달 보장과 같은 두 세계를 최대한 활용하려고합니다. 제안 된대로 주제에 대한 관련 질문을 검색하고 아직 다루지 않은 것으로 범위를 좁 힙니다.
teodron

@teodron 의심 할 필요가 없습니다. 내 대답에서 언급했듯이 사실입니다.
엔지니어

답변:


8

두 프로토콜 사이의 경합으로 인해 UDP의 패킷 손실이 발생합니다. TCP는 전달되는 동안 UDP는 보장되지 않습니다. UDP가 발생하는 동안 더 많은 TCP 패킷이 전달됩니다. . TCP는 UDP 패킷 손실을 유발 합니다. 라우터 인프라가 TCP보다 UDP보다 TCP를 선호한다는 (역사적) 아이디어도 있었지만,이 말기에는 여전히 그렇습니다.

게임 등에서 사용하기 위해 연결 지향 UDP 프로토콜 중 하나를 찾는 것이 더 나을 것이라고 생각합니다. 일반적으로 각 개념을 자세히 설명하는 백서와 함께 몇 가지가 있습니다.

그 예로는 오픈 소스 Enet 라이브러리가 있으며, 주요 기능은 UDP를 통해 패킷을 순서대로 전달하는 안정적인 옵션입니다.


1
응답을 약간의 "계층"으로 만들기 위해 UDP 기반 전송 라이브러리에 대한 짧은 (매우 짧은) 옵션 / 참조 목록을 제공 할 수 있습니까? (아마도 ENET, RakNet, zeroMQ, UDT?). 위의 의견에 따라이 사이트의 어딘가에 대한 토론을 보았지만 해당 정보의 일부를 복제하는 것이 좋습니다.
teodron

1
@Arcane Engineer UDP와 TCP 소켓이 다른 포트에서 실행되고 있다면 어떨까요?
KaareZ

@KaareZ 전혀 차이가 없어야합니다. 수행 된 연구 (편집의 링크 참조)가 포트로 나누는 단순한 문제라면 유효하지 않을 것입니다. 하루가 끝나면 포트는 소프트웨어 포트 일뿐입니다. 실제로 네트워크 특성에 영향을 미치지는 않습니다.
엔지니어

당신이 말하는 것은 말이되지만 TCP 트래픽이 거의없는 곳에서 이것이 여전히 적용되는지 궁금합니다. TCP를 통해 소량의 정보 만 전송되는 경우 (예 : ~ 10 초마다 평균 1 ~ 2 회) 실제로 UDP 트래픽에 현저하게 영향을 미칩니 까?
gandalf3

2
"TCP는 UDP 패킷 손실을 유발합니다"논문에 날짜가 없습니다. 가장 최근에 인용 된 자료는 1996 년입니다. 논문은 언제부터 시작됩니까? 결론은 여전히 ​​유효합니까?
Andreas

4

Sam Jansen의 gafferongames.com에 대한 의견은 다음과 같습니다.

게임 개발자가 아닌 네트워크 연구원으로 말하면 TCP와 UDP를 함께 사용하지 않는다는 결론은 다소 강력합니다. TCP는 너무 많은 데이터를 보내는 경우에만 패킷 손실이 발생합니다. 어떤 방식 으로든 보내는 UDP 데이터와 같습니다. 차이점은 TCP 전송 속도를 직접 제어 할 수 없다는 점입니다.

안정적인 데이터를 전송해야하고 재전송 및 안정적인 프로토콜 구현에 대해 걱정하지 않고 속도가 느리다는 것을 알고 있다면 TCP와 UDP를 모두 사용하는 데 아무런 문제가 없습니다.

관계는 실제로 두 가지 사이의 복잡한 것은 아닙니다 : TCP는 패킷 손실을 얻을 때까지 전송 속도 (전송 할 데이터가있는 경우)를 증가시킵니다.이 경우 속도를 다시 다이얼링 한 다음 속도를 다시 증가시킵니다 더 천천히). 속도가 증가하면 패킷 손실이 발생하면 UDP 패킷을 포함하여 다른 데이터 스트림에도 영향을 줄 수 있습니다.

용지 UDP 패킷 손실의 특성 : TCP 트래픽의 효과는 한 번에 여러 TCP 연결을 열고 데이터로 네트워크를 범람하여 결과를 얻었다. 이로 인해 정체가 발생하고 전역 동기화가 수행되어 패킷이 손실됩니다. 분명히 게임 클라이언트는 한 번에 12 개의 연결을 열지 않고 데이터로 네트워크를 과도하게 사용하지 않으므로 결과가 달라집니다.

질문에 대답하려면 :

TCP와 UDP를 동시에 사용하는 것이 타당한 지 궁금하지만 다른 것들을 위해 [...]

예, 대역폭 제한 내에서 유지된다고 가정하면 허용되는 것입니다.

  • 자주 전송되지 않지만 안정적으로 도착하는 정보를 전송하기위한 TCP. 게임 세계에서 점수 업데이트, 플레이어 이름 또는 표시등의 켜짐 / 꺼짐 상태 등이 있습니다.

TCP와 UDP를 모두 사용하는 경우 항상 UDP를 통해 가능한 한 많이 전송하고 TCP를 통해 가능한 한 적게 전송하는 것이 좋습니다.

이제 나는 당신에게 이것을 묻습니다 : 실제로 점수, 선수 이름 및 TCP를 통한 라이트 상태를 보내야합니까? 이 데이터를 최종적으로 받아야하는 것이 사실이지만,이 데이터를 순서대로 정확히 한 번만 수신해야한다는 것이 사실입니까?

아마 아닙니다.

이러한 경우 UDP가 제대로 작동하며 Quake 3 이 좋은 예입니다.

그렇다면 UDP와 함께 TCP의 좋은 예는 무엇입니까? 글쎄, 게임의 대화 상자를 생각해보십시오. 이 대화 상자에 대한 업데이트 (즉, 새로운 텍스트 줄)는 안정적으로 그리고 순서대로 전송되어야합니다. 따라서 TCP가 적합합니다.


3

이것이 합리적인 생각입니까?

가능한 단점은 무엇입니까?

  • 패킷 손실, 코드 복잡성 증가, 관리를위한 또 다른 연결 == 연결 끊기, 시간 초과, 예외 등의 가능성이 높아짐 ...

이것을 처리하는 더 좋은 방법이 있습니까?

  • 기존의 신뢰할 수있는 UDP 라이브러리를 사용하십시오. 가장 인기있는 두 가지는 Lidgren Network (C #), RakNet (C ++)입니다. 경험을 통해 Lidgren은 사용하기 쉽고 빠르며 안정적이라고 말할 수 있습니다.

1

고려해야 할 추가 자원 제한이 있습니다. 서버에서 TCP에 대한 대부분의 구현 (모두 믿지만 참조는 없음)에는 서버가 동시에 열 수있는 동시 TCP 연결 수에 제한이 있습니다. 각 플레이어마다 고유 한 연결이 필요한 경우 동시에 열 수있는 플레이어 수가 제한됩니다.

한계는 네트워크 시스템의 설정에 의해 정의됩니다. 또한 모든 Connection은 서버 어딘가에서 가져와야하는 메모리를 사용합니다.

한 가지 해결책은 데이터가 전송되는 동안 임시 TCP 연결 만 열고 즉시 닫는 것입니다. 이렇게하면 트랜잭션 속도가 느려지고 TCP 연결을 여는 것은 다소 "비싼"프로세스입니다. 항상 그렇듯이, 큰 성장을 허용하기 위해 처음부터 강력한 시스템을 설계하는 것입니다.

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