Viele kleine Pakete sind in Ordnung. Wenn Sie sich Sorgen über den TCP-Overhead machen, fügen Sie einfach einen ein bufferstream
, der bis zu 1500 Zeichen enthält (oder was auch immer Ihre TCP-MTUs sind, am besten dynamisch anfordern), und lösen Sie das Problem an einem Ort. Auf diese Weise sparen Sie den Overhead von ~ 40 Bytes für jedes zusätzliche Paket, das Sie sonst erstellt hätten.
Trotzdem ist es immer noch besser, weniger Daten zu senden und größere Objekte zu erstellen. Natürlich ist das Senden kleiner "UID:10|1|2|3
als das Senden UID:10;x:1UID:10;y:2UID:10;z:3
. Auch an diesem Punkt sollten Sie das Rad nicht neu erfinden. Verwenden Sie eine Bibliothek wie protobuf , die solche Daten auf eine 10-Byte-Zeichenfolge oder weniger reduzieren kann.
Das Einzige, was Sie nicht vergessen sollten, ist das Einfügen von Flush
Befehlen in Ihren Stream an den relevanten Stellen, denn sobald Sie aufhören, Daten zu Ihrem Stream hinzuzufügen, wartet er möglicherweise unendlich, bevor er etwas sendet. Wirklich problematisch, wenn Ihr Client auf diese Daten wartet und Ihr Server nichts Neues sendet, bis der Client den nächsten Befehl sendet.
Paketverlust ist etwas, das Sie hier geringfügig beeinflussen können. Jedes von Ihnen gesendete Byte kann möglicherweise beschädigt werden, und TCP fordert automatisch eine erneute Übertragung an. Kleinere Pakete bedeuten eine geringere Wahrscheinlichkeit, dass jedes einzelne Paket beschädigt wird. Da sich die Gesamtkosten jedoch summieren, senden Sie noch mehr Bytes, wodurch die Wahrscheinlichkeit eines verlorenen Pakets noch größer wird. Wenn ein Paket verloren geht, puffert TCP alle nachfolgenden Daten, bis das fehlende Paket erneut gesendet und empfangen wird. Dies führt zu einer großen Verzögerung (Ping). Während der Gesamtverlust an Bandbreite aufgrund von Paketverlust vernachlässigbar sein kann, wäre der höhere Ping für Spiele unerwünscht.
Fazit: Senden Sie so wenig Daten wie möglich, senden Sie große Pakete und schreiben Sie keine eigenen Methoden auf niedriger Ebene, sondern verlassen Sie sich auf bekannte Bibliotheken und Methoden wie bufferstream
und protobuf, um das schwere Heben zu bewältigen.