Es besteht die Gewissheit, dass beim Senden von 20 Bytes am Anfang eines TCP-Streams keine zwei 10-Byte-Teile eingehen. Dies liegt daran, dass der TCP-Stack keine so kleinen Segmente sendet: Es gibt eine minimale MTU-Größe. Befindet sich der Send jedoch irgendwo in der Mitte eines Streams, sind alle Wetten deaktiviert. Es kann sein, dass Ihr Protokollstapel 10 Byte der Daten benötigt, um ein Segment zu füllen und auszusenden, und dann die nächsten 10 Byte in ein anderes Segment gehen.
Ihr Protokollstapel zerlegt Daten in Blöcke und stellt sie in eine Warteschlange. Die Blockgrößen basieren auf dem Pfad MTU. Wenn Sie einen Sendevorgang ausführen und noch Daten in der Warteschlange anstehen, wird der Protokollstapel in der Regel das Segment am Ende der Warteschlange überprüfen und feststellen, ob in diesem Segment Platz zum Hinzufügen weiterer Daten vorhanden ist. Der Raum kann so klein wie ein Byte sein, so dass sogar ein Zwei-Byte-Send in zwei Teile aufgeteilt werden kann.
Am anderen Ende bedeutet die Segmentierung von Daten, dass es teilweise Lesevorgänge geben kann. Eine Empfangsoperation kann möglicherweise aktiviert werden und Daten abrufen, wenn nur ein Segment eintrifft. In der weit verbreiteten Sockets-API kann ein Empfangsaufruf nach 20 Bytes fragen, er kann jedoch mit 10 zurückkehren. Natürlich kann eine Pufferschicht darauf aufgebaut werden, die blockiert, bis 20 Bytes empfangen werden oder die Verbindung unterbrochen wird. In der POSIX-Welt kann diese API die Standard-E / A-Datenströme sein: Sie können fdopen
einen Socket-Deskriptor zum Abrufen eines FILE *
Datenstroms verwenden, fread
um einen Puffer so zu füllen, dass die vollständige Anforderung mit so vielen read
Aufrufen wie nötig erfüllt wird .
UDP-Datagramme rahmen die Daten ein. Jeder Sendeaufruf generiert ein Datagramm (siehe unten zum Verkorken). Die andere Seite empfängt ein vollständiges Datagramm (und in der Socket-API muss ein Puffer angegeben werden, der groß genug ist, um es aufzunehmen, da das Datagramm sonst abgeschnitten wird). Große Datagramme werden durch IP-Fragmentierung fragmentiert und für Anwendungen transparent neu zusammengestellt. Wenn ein Fragment fehlt, geht das gesamte Datagramm verloren. In dieser Situation können keine Teildaten gelesen werden.
Es gibt Erweiterungen für die Schnittstelle, mit denen mehrere Operationen ein einzelnes Datagramm angeben können. Unter Linux kann ein Socket "verkorkt" werden (das Senden wird verhindert). Während des Verkorkens werden geschriebene Daten zu einer Einheit zusammengefasst. Wenn der Socket dann "entkorkt" ist, kann ein einzelnes Datagramm gesendet werden.