Oto cytat Sama Jansena z komentarza na gafferongames.com :
Mówiąc jako badacz sieci, a nie twórca gier, wniosek, aby nigdy nie używać jednocześnie TCP i UDP, wydaje się nieco mocny. TCP może utracić pakiet tylko wtedy, gdy wysyła zbyt dużo danych; w pewien sposób, podobnie jak wysyłane dane UDP. Różnica polega na tym, że nie masz bezpośredniej kontroli nad prędkością wysyłania TCP, jest to dla ciebie ukryte.
Jeśli po prostu potrzebujesz wysłać pewne wiarygodne dane i nie chcesz się martwić retransmisją i wdrożeniem niezawodnego protokołu, a wiesz, że szybkość będzie niska, nie będzie żadnych problemów z używaniem zarówno TCP, jak i UDP.
Relacja między tymi dwoma nie jest tak naprawdę złożona: TCP po prostu zwiększa szybkość wysyłania (jeśli są dane do wysłania), dopóki nie utraci pakietu, w którym to przypadku ponownie wybiera swoją szybkość, a następnie zaczyna ponownie zwiększać szybkość (to czas wolniej). Gdy jego wzrost powoduje utratę pakietów, istnieje duże prawdopodobieństwo, że trafi również na inne strumienie danych, w tym na pakiety UDP.
Artykuł Charakterystyka utraty pakietów UDP: Wpływ ruchu TCP uzyskał swoje wyniki, otwierając wiele połączeń TCP jednocześnie i zalewając sieć danymi. Prowadzi to do przeciążenia, po którym następuje globalna synchronizacja , które powodują odrzucanie pakietów. Oczywiście klient gry nie otworzy jednocześnie kilkunastu połączeń i zalej sieć danymi, więc Twoje wyniki będą inne.
Odpowiedzieć na Twoje pytanie:
Zastanawiam się, czy ma sens jednoczesne używanie zarówno TCP, jak i UDP, ale do różnych rzeczy [...]
Tak, jest to do przyjęcia, zakładając, że nie przekraczasz limitów przepustowości.
- TCP do wysyłania informacji wysyłanych rzadko, ale należy zagwarantować, że dotrą one niezawodnie. Na przykład aktualizacje wyników, imię gracza, a nawet stan włączenia / wyłączenia światła w świecie gry.
Korzystając zarówno z protokołu TCP, jak i UDP, zawsze powinieneś preferować wysyłanie jak największej ilości danych przez UDP, a możliwie jak najmniej przez TCP.
Teraz pytam: czy naprawdę konieczne jest przesłanie partytury, nazwy gracza i stanu światła przez TCP? Chociaż prawdą jest, że w końcu musisz otrzymać te dane, czy to prawda, że musisz otrzymywać te dane ściśle w kolejności i dokładnie raz?
Prawdopodobnie nie.
UDP działa dobrze w tych przypadkach, a Quake 3 jest dobrym przykładem tego, jak to zrobić.
Więc jaki jest dobry przykład TCP obok UDP? Pomyśl o czacie gry. Aktualizacje tego czatu (to znaczy nowe wiersze tekstu) muszą być przesyłane zarówno niezawodnie, jak i ściśle w kolejności. Tak więc TCP jest dobrym dopasowaniem.