2017-12-27 16 views
0

Die allgemeine Funktion für das Senden von Daten, die über TCP-Socket unter Verwendung senden ist unten:Senden von Daten größer daß MSS()

ssize_t send (int sockfd, const void * Puffer, size_t Länge, int flags );

Im Allgemeinen wird das TCP die Daten fragmentieren, wenn die Datenmenge größer ist als die von MSS. Aber es wird gesagt, dass die send() - API die "Länge" von Daten sendet und die Menge an Daten zurückgibt, die an den ausgehenden Puffer gesendet werden könnte, und die Verantwortung des Entwicklers, den Rückgabewert zu überprüfen und die verbleibenden Daten erneut zu senden.

Also bezweifle ich, dann, wenn die 'Länge' Wert mehr als MSS ist, wird nicht TCP automatisch die Daten fragmentieren? Wenn nein, wie können wir das TCP dazu bringen, die Daten intern mit einem Aufruf von send() zu fragmentieren?

Antwort

3

Im Allgemeinen wird das TCP die Daten fragmentieren, wenn die Datengröße größer ist als die von MSS.

Nicht allgemein. Immer. Sonst hat MSS keine feststellbare Bedeutung.

Aber es wird gesagt, dass send() API wird die 'Länge' Menge von Daten senden und zurückgibt, welche Menge an Daten an ausgehende Puffer gesendet werden kann und die Verantwortung des Entwicklers, den Rückgabewert zu überprüfen und erneut zu senden die restlichen Daten.

Korrekt.

Diese beiden Anweisungen stehen nicht in Konflikt. send() überträgt Daten an den Socket-Sendepuffer; TCP übergibt es von dort an das Netzwerk unter Berücksichtigung der MSS, Stau, Empfangsfenster, etc.

Also meine Zweifel, dann, wenn die 'Länge' Wert ist mehr als MSS, wird nicht automatisch TCP Fragment die Daten?

Siehe oben. TCP befasst sich mit dem, was sich im Socket-Sendepuffer befindet, und nicht mit den Parameterwerten, die an send() übergeben werden.

Wenn nein, wie können wir dann das TCP machen, um die Daten intern mit einem Aufruf von send() zu fragmentieren?

Sie können nicht. Sie haben keine Kontrolle über die TCP-Segmentierung.

+0

Vielen Dank. Es ist jetzt sehr klar. – Ghansham

0

Für einen Stream-Socket, wenn die Länge mehr als in einem einzigen Paket gesendet werden kann, wird die Netzwerkschicht in der Tat automatisch in mehrere Pakete aufgeteilt. Sie haben sehr wenig Kontrolle darüber, wie das Betriebssystem streamte Daten aufteilen will. Es gibt Socket-Optionen, die einige Auswirkungen haben (zum Beispiel TCP_NODELAY), aber wenn Sie vorhaben, große Pakete zu senden, macht das keinen großen Unterschied.

+0

Sie bedeutet, wir haben keine Kontrolle über Fragmentierung auf TCP-Ebene? – Ghansham

+1

Netzwerkschicht = Transportschicht, in diesem Fall. Ich weiß, dass du das allgemeiner meinst, obwohl ... vielleicht "Network Stack". Für diese Frage ist TCP das Zerhacken, nicht IP. –