TCP - это потоковый протокол, поэтому вы всегда будете получать любые данные, поступившие с момента последнего чтения, вплоть до размера окна потоковой передачи на стороне получателя.Этот буфер может быть заполнен данными, полученными из нескольких пакетов любого заданного размера, отправленных отправителем.
Размер и масштабирование окна приема TCP @ MSDN
Несмотря на то, что в вашем примере вы наблюдали 1 объединенный блок данных, содержащий 2 байта, на принимающей стороне, можнополучать последовательности размером 1 байт на 1 байт (отправленные вашим отправителем) в зависимости от условий сети, а также множество возможных комбинаций чтений 0, 1 и 2 байта, если вы выполняете неблокирующие чтения.При отладке в типичной не перегруженной локальной сети или настройке обратной связи вы почти никогда не увидите этого, если на стороне отправки нет задержки.На нижних уровнях сетевого стека существуют способы обнаружения передачи по пакетам, но они не используются в типичном программировании TCP и находятся вне области применения.
Если вы переключаетесь на UDP, то каждый пакетбудет получен как он был отправлен, что будет соответствовать вашим ожиданиям.Это может подойти вам лучше, но имейте в виду, что UDP не имеет никаких обещаний доставки, и сетевая маршрутизация может привести к тому, что пакеты будут доставлены не по порядку.
Вы должны изучить вопрос об ограничении ваших данных или найти какой-то другой метод, чтобы определить, когдавы достигли конца единицы данных, определенной вашим приложением, и придерживаетесь протокола TCP.