멀티 플레이어 게임을위한 TCP 또는 UDP?


18

이것은 내가 많이 보는 질문입니다. 대부분의 사람들은 UDP가 항상 실시간 게임에 TCP보다 낫다고 말합니다. 내 이해는 TCP는 상대방이 패킷을 얻을 때까지 계속해서 패킷을 다시 보내려고하지만 UDP는 신경 쓰지 않는다는 것입니다.

내가 읽은 대부분의 것은 UDP가 모든 실시간 게임에 필수적이며 TCP는 끔찍하다는 것입니다. 그러나 문제는 대부분의 사람들이 UDP 위에 어떤 형태의 TCP를 구현하는 것처럼 보입니다. 또한 우리가 더 이상 80 대가 아니고 인터넷이 이제는 매우 빠르고 안정적이라는 점을 감안할 때이 둘의 차이는 무시할 만하다고 들었습니다.

여기에 내 일반적인 이해가 잘못 되었습니까? 누군가 나를 위해 이것을 정리할 수 있습니까?


7
internet is now pretty fast and reliable아뇨. 대역폭은 크게 네, 증가하지만, 대기 시간은 여전히 매우 높다. 순수한 TCP를 사용하면 UDP를 통해 클라이언트에서 가장 잘 수행되는 패킷 스 쿼싱을 수행하지 않는 한 서버 틱 시간이 저렴한 최대 대기 시간보다 길어야합니다. 문제는 게임의 일부 정보는 신뢰할 수 있어야하고 다른 일부는 빠르다는 것입니다. UDP 위에 사용자 정의 프로토콜을 사용하면 멋진 패키지에 필요한 모든 것을 제공하는 독점 프로토콜을 사용할 수 있습니다.
Ordous

4
TCP over UDP를 정확하게 구현하지는 않습니다. TCP가 제공하는 일부 기능이 있으며 UDP 위에 구현되어 있습니다. UDP를 사용하는 주요 요점은 t0수신되지 않은 시간에 월드 상태가 포함 된 패킷 을 보내면 새로운 월드 상태를 보내면 t1클라이언트가 실제로 첫 번째 패키지를받을 때까지 기다릴 필요가 없다는 것입니다. 이미 사용되지 않습니다.
Vincent Savard

@Ordous 나는 이것이 내 질문에 대답한다고 생각한다 :) Thanks
flooblebit

4
또한 UDP는 IP 스푸핑이 발생하기 쉬우므로 우려되는 경우 서버를 DDoS 공격에 노출시킬 수 있습니다. 클라이언트 IP 주소 및 기타 세부 사항을 서버로 전송 한 다음 "인증 된"주소에서 UDP 패킷을 수락하는 "제어"TCP 연결을 통해이를 방지 할 수 있습니다. 또한 UDP를 통한 공개 표준이 없기 때문에 자체 암호화 계층을 구현해야 할 수도 있습니다.
ARau

@ blownie55 좋은 지적
Naresh Kumar

답변:


12

피어 투 피어, 서버를 실행하는 사용자가있는 클라이언트 / 서버 또는 서버를 실행하는 데이터 센터가있는 클라이언트 / 서버에 대해 이야기하고 있는지에 따라 다릅니다. 후자의 경우에만 인터넷이 정말 빠르고 안정적입니다. 사용자의 컴퓨터가 빠르다 는 보장 은 없으며 확실하지 않습니다.

UDP를 사용하면 TCP와 같은 구현 유형을보다 효과적으로 제어 할 수 있습니다. 그것은 순서대로 패킷을 실행하고, 중요하다고 생각되는 패킷을 재 시도하면서 불필요한 것으로 간주되는 패킷을 폐기 할 수있는 유연성을 제공합니다. 그러나 이것은 필요한 경우와 필요한 전문 지식이있는 경우에만 수행해야합니다.

이러한 유연성없이 수행 할 수 있으면 TCP가 제대로 작동하여 시간을 크게 절약 할 수 있습니다. 심지어 내가 작업했던 스튜디오와 같은 전문 스튜디오조차도 UDP가 절대 필요하지 않고 네트워크 프로그래밍에 전념 하는 사람들이 있다면 TCP를 사용 합니다.


또한 "무엇을 위해"가 중요하다고 제안합니다. 예를 들어 게임 내 채팅 시스템의 경우 UDP도 고려하지 않습니다. 내가 고려해야 할 다른 것은 (적어도 "클라이언트 서버"의 경우) 서버가 효율적으로 트래픽을 처리 할 수있는 방법입니다. 현대 NIC는 TCP를위한 내장 된 "오프 로딩"기능을 많이 가지고 있습니다 (패킷 분할 및 병합, 패킷을 스트림으로 정렬, 등) CPU 오버 헤드를 줄 이도록 설계되었으며 대부분 UDP에서 작동하지 않습니다.
Brendan

1
UDP를 사용하고 기본적으로 TLS를 사용하여 암호화되는 HTTP / 3의 일부인 QUIC ( en.wikipedia.org/wiki/QUIC ) 가 변경 될 수 있습니다 . 이 기능이 널리 사용 되려면 다소 시간이 걸리고 기대됩니다. 필요가 여기에 처리 할 수있는 몇 가지 문제에 대한 자세한 내용 blog.cloudflare.com/the-road-to-quic
ARau

3

@Ordous가 지적한 것처럼 "인터넷은 이제 매우 빠르고 안정적"이라고 가정하고 위험한 것입니다.

대부분의 게임에서 배달에 중요한 패킷에 대한 UDP + 사용자 정의 프로토콜이 마술처럼 작동하는 이유는 일부 패킷을 잃으면 "괜찮아"있을 수있는 시간이 있기 때문입니다 (예 : 게임 플레이를 완료하기위한 2 차 중요하지 않은 이벤트의 경우). , 커서 움직임 등과 같은 데이터를 잃어버린 "아직 괜찮지 않은"시간도 있습니다. (저는 생계를 위해 게임 개발을하지 않기 때문에 모호한 예제를 용서합니다)

UDP는 기본적으로 반복해서 푸시하는 데 시간을 낭비하지 않습니다.

그리고 많은 게임들이 우연히 "항상 실패하지 않고 전달해야하는"패킷보다 "언제나 잃어 버릴 수있는"패킷을 가지고있는 것 같습니다. 따라서이 작업에 자연스럽게 적합합니다.

UDP에 필요한 것은 "항상 실패하지 않고 항상 전달할 필요가있는"패킷을 올바르게 전달하는 데 도움이되는 사용자 지정 프로토콜을 사용하는 것입니다. 나머지 게임 데이터는 네트워크 연결의 자비에 맡깁니다.

이제 전송되는 대부분의 데이터가 어떤 종류의 트래픽으로 구성되는지 결정하면 더 나은 결정을 내리는 데 도움이됩니다.

TCP에 대한 요점은 재 시도에 소요되는 시간이 지금 중요한 패킷을 보내는 데 소비 될 수 있다는 것입니다.

전송 중에 문제가 발생하면 TCP가 사용자를 위해 더 세분화 된 게임 플레이 시나리오로 캐스케이드하여 UDP + 커스텀 스택과 비교하여 경험을 망칠 수 있습니다 (이 마지막 부분은 직감입니다. 이것에 대해 다른 전문가들에게 의견을 말하십시오.이 시나리오의 가능성에 대해 배우고 싶습니다.)

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