Was ist eine gute Puffergröße für Socket-Programmierung?
Sind wir mit .Net und Steckdosen. Der server mit Hilfe der Socket.Absender(Byte[]) Methode, so dass es nur sendet die gesamte Nutzlast. Auf der anderen Seite sind wir Kunden konsumieren der Daten. Socket.Receive(buffer[]). In allen Beispielen, die von Microsoft (und andere) scheinen Sie stick mit eine Puffergröße von 8192. Wir haben diese Größe, aber jedes jetzt und dann wir senden die Daten an die clients, die größer ist als diese Puffergröße.
Gibt es eine Möglichkeit zu bestimmen, wie viel Daten, die der server gesendet hat Methode uns geschickt? Was ist die beste Puffergröße?
InformationsquelleAutor der Frage uriDium | 2010-05-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Selbst wenn Sie das senden von mehr Daten, als kann es auch nicht in einem Anruf zu Erhalten.
Können Sie nicht bestimmen, wie viel Daten, die der server gesendet hat - es ist ein stream von Daten, und Sie sind nur das Lesen von Blöcken zu einer Zeit. Sie können Lesen Teilwas den server gesendet in einer Schicken, anrufen, oder Sie Lesen die Daten aus zwei Send-Aufrufe in einem Receive-Aufruf. 8K ist ein angemessener Puffer-Größe - nicht so groß, dass Sie verbrauchen sehr viel Speicher, und nicht so klein, dass Sie müssen, verwenden Sie die Lasten vergeblicher Anrufe. 4K oder 16K würde sehr wahrscheinlich auch in Ordnung sein... ich persönlich würde nicht gehen, über 16K für Netzwerk-Puffer - ich vermute, Sie würden selten füllen.
Konnten Sie Experimentieren, indem Sie versuchen, verwenden Sie einen sehr großen Puffer und melden an, wie viele bytes empfangen wurden, bei jedem Anruf - das würde Ihnen eine Vorstellung von wie viel ist in der Regel verfügbar - aber wäre es nicht wirklich zeigen den Effekt der Verwendung eines kleineren Puffers. Welche Bedenken haben Sie gegenüber der Verwendung eines 8K-Puffer? Wenn es von der Leistung, haben Sie irgendwelche Beweise dafür, dass dieser Aspekt in deinem code ist ein performance-Engpass?
InformationsquelleAutor der Antwort Jon Skeet
Jon Skeet Antwort leider lässt einen großen Teil des Bildes aus - die sende-Puffer-Größe, und die Bandbreite-delay-Produkt dem Rohr, Sie schreiben zu.
Wenn Sie versuchen, Daten zu senden, die über ein großes Rohr mit einem single-socket -, und Sie möchten, TCP füllen Rohr verwenden, benötigen Sie einen sende-Puffer-Größe, die äquivalent zu der Bandbreite-Verzögerung-Produkt des Rohres. Ansonsten ist TCP nicht das Rohr füllen, weil es nicht genügend 'bytes im Flug' zu allen Zeiten.
Betrachten Sie eine Verbindung mit einer Geschwindigkeit von 1 gigabit, und hat ein one-way-Latenz von 10 Millisekunden im Durchschnitt. Die round-trip-time (aka, die Menge der Zeit, die verstreicht, zwischen Ihrem sockel ein Paket senden und die Zeit, die es empfängt das ack für das Paket und somit weiß, um weitere Daten zu senden), ist gewöhnlich zweimal die Latenz.
Also, wenn Sie einen 1-gigabit-Verbindung, und eine RTT von 20 Millisekunden, dann das Rohr ist mit 1 gigabit/s * 20 Millisekunden == 2.5 Megabyte an Daten im Flug zu aller Zeit, wenn es vollständig genutzt.
Wenn Ihr TCP send buffer ist nichts weniger als 2,5 Megabyte, dann, dass eine Steckdose wird nie in vollem Umfang nutzen die Rohr - Sie werden nie ein gigabit/sec an Leistung aus Ihrem sockel.
Wenn Ihre Anwendung viele Steckdosen, dann ist die Gesamtgröße aller TCP-Sendepuffer werden müssen, 2.5 MB, um vollständig nutzen zu können, diese hypothetischen 1 gigabit/20 ms RTT Rohr. Zum Beispiel, wenn Sie verwenden 8192-byte-Puffer, die Sie benötigen, 306 gleichzeitige TCP-sockets zu füllen, Rohr.
InformationsquelleAutor der Antwort antiduh
Es hängt von Ihrem Protokoll. Wenn Sie erwarten, dass Nachrichten über 8192 bytes, dann sollten Sie erhöhen Sie die Puffergröße entsprechend an. Aber denken Sie daran, diese Puffergröße ist nur für ein Anruf zu
Receive
. Wenn Sie wirklich wollen/müssen, können Sie mit einer Schleife überReceive
mehrere Male, und kopieren Sie die empfangenen Daten in eine beliebig große Daten-Struktur oder Puffer.Halten Sie auch im Verstand, ist es gute Praxis zu nennen
Receive
wiederholt, bis Sie überprüft haben, dass Sie Sie gelesen haben, alle Daten, die für eine gegebene Nachricht; auch wenn eine einzelne Nachricht ist kleiner als die Puffergröße, die es möglicherweise noch nicht alle abgerufen werden, indem eine einzelneReceive
nennen.InformationsquelleAutor der Antwort Justin Ethier
8192 wäre ideal. Wenn Sie Daten haben, die über diese Größe, die es möglichen, besser Sie senden die Daten in Pakete konstanter Länge.
Die Größe der Daten, die vom server gesendet, kann überprüft werden mit der "recv" - Vorgang-Funktion im WINSOCK-die einen parameter gibt die Länge des Puffers.
InformationsquelleAutor der Antwort ckv