Получатель не собирает сегменты TCP в пакеты, он собирает их в потоки. Получатель знает местоположение в потоке своего принятого сегмента по порядковому номеру.
Возможно ли, что вы ожидаете, что результат подсчета системного вызова read()
принимающего приложения будет соответствовать системному вызову write()
отправляющего приложения? Если это так, вы будете разочарованы. Потоки TCP являются байтовыми, а не пакетными потоками. Они не сохраняют и не соблюдают границы отправляющих системных вызовов.