Netzwerkfragen: Serialisierung und häufige kleine Pakete oder weniger große Pakete

7

Ich arbeite mit einem Socket-Server und versuche zu entscheiden, wie alle Clients aktualisiert werden sollen.

Ich sende derzeit einige Pakete mit ganzen in JSON serialisierten Objekten. In den meisten Fällen wird dadurch viel Abhören in Form von nicht benötigten Daten hinzugefügt. Dies ist für mich ein Kinderspiel, entfernen Sie die Serialisierung und senden Sie nur das, was benötigt wird.

Nehmen wir an, ich habe vier serverseitige AIs. Sollte ich alle vier AIs in einem riesigen Update senden und daher nur die benötigten Daten serialisieren, oder sollte ich jedes in einem separaten Update senden?

durchsehen
quelle
5
Was würde dich glücklicher machen?
Trevor Powell
Ich mag die Idee, etwas über das Netzwerk zu serialisieren, nicht wirklich, scheint leicht lesbar zu sein. Vor diesem Hintergrund kann es im Fall der Aktualisierung der X-Anzahl von KI sinnvoll sein, da diese Aktualisierungen wahrscheinlich gleichzeitig erfolgen. Um Ihre Frage zu beantworten, würde mich der effizienteste Weg glücklicher machen, von dem ich glaube, dass er sie serialisiert.
Seethru

Antworten:

12

Wenn Sie kleine Nachrichten senden, müssen Sie den Protokoll-Overhead kennen:

Geben Sie hier die Bildbeschreibung ein

Stellen Sie sich vor, Sie senden eine 10-Byte-Nachricht.

Ein TCP-Header ist 24 Byte, ein UDP-Header ist 8 Byte. Angenommen, Sie verwenden UDP, haben Sie insgesamt 18 Bytes.

Sie haben aber auch den IP-Header, der in IPv4 mindestens 20 Byte oder in IPv6 mindestens 40 Byte beträgt. Das sind insgesamt 38 Bytes, wenn Sie IPv4 verwenden.

Und dann haben Sie auch den Ethernet-Frame um all das, was (normalerweise) weitere 42 Bytes sind. Sie sind also bei 80 Bytes. Das ist siebenmal so viel Protokollaufwand wie die von Ihnen gesendeten Daten.

Wie Sie sehen, ist das Senden kleiner Datennachrichten nicht sehr bandbreiteneffizient, da für jede Nachricht Fixkosten von 70 Byte Protokoll-Overhead anfallen.

to visualize this better, seventy bytes is as much data as this string

Es ist jedoch oft auch keine gute Idee, kleine Nachrichten zu verzögern, damit Sie mehr gleichzeitig senden können, da sich das Spiel dadurch verzögerter anfühlt.

Es gibt keine goldene Hammerlösung, um den idealen Kompromiss dafür zu finden. Alle gleichzeitig verfügbaren Daten sollten jedoch in einer Nachricht gesendet werden, anstatt sie in mehrere zu trennen. Es gibt nichts zu gewinnen und viel zu verlieren, wenn unnötige Fragmentierung auf Anwendungsebene hinzugefügt wird.

(Bildquelle: http://en.wikipedia.org/wiki/File:UDP_encapsulation.svg )

Philipp
quelle
Genau das habe ich mit meinem letzten Kommentar gesucht. Vielen Dank für die exzellenten Informationen ... Ich erinnere mich, dass ich das alles vor vielen Jahren einmal gelernt habe, aber es ist anscheinend nicht geblieben.
RobCurr
Können Sie einen weiteren Kontext zu den Problemen bei der Fragmentierung auf Anwendungsebene bereitstellen?
Minismus
0

Im Allgemeinen sollten Sie Ihre Pakete klein packen, wenn das Spiel ziemlich groß ist oder viele Updates sendet. Wenn Ihr Spiel jedoch nur klein ist und nur etwas zum Herumspielen und Skalierbarkeit kein großes Problem darstellt, tun Sie einfach, was funktioniert.

Vaughan Hilts
quelle
Gibt es eine Möglichkeit zu sagen, welche Größe ein Paket optimal hat, vorausgesetzt, er passt zur Idee eines kleinen Pakets? Gibt es zum Beispiel eine Mindestgröße für ein Paket, bei der er versuchen sollte, so viel wie möglich davon zu verwenden?
RobCurr
@RobCurr Es gibt Dinge wie MaxMTU, für die Sie optimieren können (maximale Größe von Ethernet-Frames). Dies kann jedoch durch die Konfiguration jedes einzelnen Routers zwischen Server und Client beeinflusst werden. Sie sollten sich nicht wirklich darum kümmern, weil es einfach zu unvorhersehbar ist und der Effekt normalerweise zu gering ist, um es zu bemerken.
Philipp