Існує певна впевненість, що якщо ви надішлете 20 байт на самому початку потоку TCP, він не отримає як два 10 байтних фрагмента. Це відбувається тому, що стек TCP не надсилатиме такі невеликі сегменти: мінімальний розмір MTU. Однак якщо відправка знаходиться десь посеред потоку, усі ставки відміняються. Можливо, ваш стек протоколів займає 10 байт даних, щоб заповнити сегмент і відправити його, а потім наступні десять байт переходять до іншого сегмента.
Ваш стек протоколів розбиває дані на шматки і розміщує їх у черзі. Розміри шматка базуються на шляху MTU. Якщо ви виконуєте операцію надсилання, і все ще є очікування даних у черзі, стек протоколів, як правило, зазирне в сегмент, який знаходиться в кінці черги, і побачить, чи є в цьому сегменті місце для додавання більше даних. Кімната може бути розміром як один байт, так що навіть двобайтове надсилання можна розбити на два.
З іншого боку, сегментація даних означає, що можуть бути часткові читання. Операція прийому може потенційно прокинутися і отримати дані, коли надійде лише один сегмент. У широко реалізованому API сокетів виклик прийому може запитати 20 байт, але він може повернутися з 10. Звичайно, на ньому може бути побудований буферний шар, який буде блокувати, поки не буде отримано 20 байтів, або з'єднання не буде розірвано. У світі POSIX цей API може бути стандартними потоками вводу / виводу: ви можете fdopen
описувати сокет для отримання FILE *
потоку, і ви можете використовувати fread
його для заповнення буфера таким чином, щоб повний запит був задоволений стільки read
викликів, скільки потрібно .
Даніграми UDP обрамляють дані. Кожен виклик відправки генерує дейтаграму (але див. Нижче про виправлення). Інша сторона отримує повну дейтаграму (і в API сокета він повинен вказати буфер, достатньо великий, щоб вмістити його, інакше дейтаграма буде усічена). Великі дейтаграми розбиваються на фрагментацію IP і прозоро перебираються у додатки. Якщо якийсь фрагмент відсутній, вся дейтаграма втрачається; у цій ситуації немає можливості прочитати часткові дані.
Існують розширення інтерфейсу, що дозволяють декільком операціям вказувати одну дейтаграму. У Linux сокет можна «закупорити» (не можна надсилати). Поки він пробковий, письмові дані збираються в єдине ціле. Тоді, коли сокет буде "відключений", може бути надіслана одна дейтаграма.