Istnieje pewna pewność, że jeśli wyślesz 20 bajtów na samym początku strumienia TCP, nie pojawi się on jako dwa 10 bajtów. Wynika to z faktu, że stos TCP nie wysyła tak małych segmentów: istnieje minimalny rozmiar MTU. Jeśli jednak wysyłanie znajduje się gdziekolwiek w środku strumienia, wszystkie zakłady są wyłączone. Może być tak, że stos protokołu zajmuje 10 bajtów danych, aby wypełnić segment i wysłać go, a następnie następne dziesięć bajtów przechodzi do innego segmentu.
Stos protokołu dzieli dane na części i umieszcza je w kolejce. Rozmiary porcji są oparte na MTU ścieżki. Jeśli wykonasz operację wysyłania i nadal oczekują na dane w kolejce, stos protokołów zwykle zerknie na segment znajdujący się na końcu kolejki i sprawdzi, czy w tym segmencie jest miejsce na dodanie kolejnych danych. Pokój może być tak mały jak jeden bajt, więc nawet dwubajtowe wysyłanie może zostać podzielone na dwa.
Z drugiej strony segmentacja danych oznacza, że mogą być częściowe odczyty. Operacja odbierania może potencjalnie obudzić się i uzyskać dane, gdy pojawi się zaledwie jeden segment. W szeroko zaimplementowanym interfejsie API gniazd, wywołanie odbierające może poprosić o 20 bajtów, ale może zwrócić z wartością 10. Oczywiście można na nim zbudować warstwę buforującą, która będzie blokować do momentu odebrania 20 bajtów lub przerwania połączenia. W świecie POSIX ten interfejs API może być standardowym strumieniem we / wy: możesz użyć fdopen
deskryptora gniazda, aby uzyskać FILE *
strumień, i możesz fread
na nim użyć do wypełnienia bufora, aby pełne żądanie było zadowolone z tylu read
wywołań, ile potrzeba .
Datagramy UDP tworzą ramkę danych. Każde połączenie wysyłające generuje datagram (ale patrz poniżej o korkowaniu). Druga strona otrzymuje pełny datagram (i w interfejsie API gniazda musi określić bufor wystarczająco duży, aby go pomieścić, w przeciwnym razie datagram zostanie obcięty). Duże datagramy są pofragmentowane przez fragmentację adresów IP i są ponownie składane w przejrzysty sposób dla aplikacji. Jeśli brakuje jakiegoś fragmentu, cały datagram zostaje utracony; w takiej sytuacji nie można odczytać częściowych danych.
Istnieją rozszerzenia interfejsu umożliwiające wielu operacjom określenie jednego datagramu. W systemie Linux gniazdo można „zakorkować” (uniemożliwić wysyłanie). Podczas gdy jest zakorkowany, zapisane dane są składane w jedną całość. Następnie, gdy gniazdo jest „odkorkowane”, można wysłać pojedynczy datagram.