Hallo,
Wie stellst du fest, das deine Daten in einem Paket platz haben? Kann es sein, dass der Overhead so gross ist, dass ein weiteres Paket geschickt wird? Da reicht schon, wenn es nut um ein Byte zu lang ist.
Eine Anwendung muss das gar nicht feststellen. Das macht das Betriebssystem - und zwar in zwei Schritten bei TCP: MSS und Fragmentierung.
MSS bezeichnet die Maximum Segment Size und gibt an, wie groß die Nutzdaten in einem TCP-Paket maximal sein kann. Sie ist immer so groß wie MTU - IP-Header-Größe - TCP-Header-Größe. Die MTU (Maximum Transmission Unit) ist eine Angabe, die zur Netzwerkschnittstelle gehört und angibt, wie groß ein Paket, das über diese Schnittstelle geht, maximal sein darf. Das ist hardwareabhängig (bei Ethernet z.B. 1500 Bytes), allerdings kann man manuell durchaus einen geringeren Wert einstellen.
Wenn nun also eine Anwendung dem Betriebssystem sagt "sende über eine bestehende TCP-Verbindung", dann sendet das Betriebssystem daraufhin für jeden Aufruf genau ein Paket*, solange die Daten reinpassen. Wenn sie das nicht tun, teilt das Betreibssystem automatisch auf, je nach der aktuellen MTU.
Wenn nun auf der Zwischenstrecke zwischen den beiden Kommunikationspartnern eine Strecke ist, die eine noch geringere Maximalkapaizität hat (MTU/MSS gelten ja nur für den direkten Anschluss an den Rechner, die können ja nicht wissen, was dazwischen liegt), so tritt das Phänomen der Fragmentierung ein: Die Router dazwischen teilen TCP-Pakete selbst wieder in nochmal kleinere Häppchen auf, die dann am anderen Ende der Leitung wieder zu einem ganzen TCP-Paket zusammengesetzt werden, das dann verarbeitet werden kann.
* Wenn die Netzwerkschnittstelle gerade zu viel zu tun hat und Daten warten müssen, kann es auch mal sein, dass Daten zusammengefasst werden, idR. ist aber ein Aufruf von send() mindestens ein Paket.
Viele Grüße,
Christian