Что вы описываете, так это то, как TCP должен работать по умолчанию. То, что вы видите, - это алгоритм Нагла (RFC 896), который уменьшает количество отправляемых исходящих пакетов, чтобы они обрабатывались максимально эффективно. Возможно, вы отправляете 2 пакета в своем коде, но они передаются вместе как 1 пакет. Поскольку TCP является байтовым потоком, получатель не должен делать никаких предположений о том, сколько пакетов он получает. Вы должны разграничить свои пакетные данные в протоколе более высокого уровня, а получатель должен обработать данные в соответствии с этим протоколом. Он должен обрабатывать случаи, когда несколько пакетов поступают в одном чтении, один пакет приходит в нескольких чтениях, и все, что между ними, обрабатывает только пакетные данные, когда они получены полностью, кэшируя все, что осталось для последующих чтений, чтобы обработать, когда необходимо.