TCP/IP to model i stos sieciowy, który zawiera protokoły transportowe TCP i UDP. Dlatego, żeby przejść do dalszej dyskusji może kolega wyjaśni jakiego protokołu warstwy transportowej używał. Obstawiam TCP, bo z uwagi na strumieniowy charakter mogło dojść do segmentacji i potem fragmentacji, ale dla uściślenia niech autor potwierdzi.
Jeżeli chcesz wysłać rekordy po protokole strumieniowym, to powinieneś zastosować serializację do formatu, z którego da się potem odtworzyć oryginalne dane. Niskopoziomowo to może być kodowanie TLV, wysokopoziomowo np. JSON. Chodzi o to, żeby podczas deserializacji strumienia bajtów po stronie odbiorcy dało się stwierdzić gdzie kończy się wiadomość/rekord.
To jak pakiet zostanie podzielony, zależy od implementacji stosu sieciowego. Używając funkcji write/send przekazujesz bajty do stosu sieciowego. W przypadku TCP dane nie muszą być od razu wysyłane, mogą być buforowane po stronie stosu sieciowego w jądrze systemu, połączone i podzielone, dopiero po chwili wysłane. Wynika to ze strumieniowego charakteru protokołu TCP.
- a) Twoja oryginalna wiadomość, jeżeli okaże się zbyt duża, może zostać rozbita na wiele segmentów TCP, każdy zapakowany we własną ramkę IP.
- b) Stos sieciowy może też zadecydować, by zostawić jeden duży pakiet, ale podzielić go na wiele fragmentów. Dzieje się tak, gdy rozmiar segmentu TCP przekracza wartość MSS.
- c) Może zajść jednocześnie a i c.
Generalnie fragmentacja nie jest pożądana, a już szczególnie zrobiona przez urządzenia pośredniczące, gdyż obniża wydajność. Dlatego powstały takie mechanizmy jak path MTU discovery, by od razu podzielić pakiet jak najlepiej się da.
Jeżeli zastosujesz opcję DF (dont't fragment), to licz się z tym, że w zależności jakiego protokołu warstwy transportowej używasz, to wiadomość w ogóle może nie dojść. Jeżeli jakieś urządzenie na ścieżce będzie miało mniejsze MTU, to pakiet zostanie odrzucony . Z RFC 791:
An internet datagram can be marked "don't fragment." Any internet datagram so marked is not to be internet fragmented under any circumstances. If internet datagram marked don't fragment cannot be delivered to its destination without fragmenting it, it is to be discarded instead.
Efekt dla protokołu TCP, jak się okazuje, jest odwrotny niż byś się spodziewał właśnie z uwagi na path MTU discovery. Wiadomość zostanie odrzucona przez urządzenie sieciowe gdzieś na ścieżce, nadawca zostanie o tym poinformowany przez protokół ICMP i obniży wielkość segmentu TCP (dzieląc Twoją wiadomość ...) oraz wielkość pakietu IP, aby zmieścił się w MTU urządzenia, które pakiet IP odrzuciło. Opcja don't fragment nie jest przeznaczona dla wiadomości warstwy aplikacji.