Стандарт TCP допускает фрагментацию пакетов данных. На практике это не происходит с небольшими пакетами данных размером в несколько сотен байтов или около того, но мегабайт данных почти наверняка фрагментируется.
Во-вторых, когда вы говорите, что сниффер говорит, что все данные отправляются, в одном пакете или во многих?
Хорошая практика сетевого программирования требует, чтобы вы не предполагали, что сообщения приходят единичными блоками. Два последовательных сообщения могут поступать как один пакет (теоретически, но почти никогда на практике), и даже если они поступают в нескольких пакетах, их можно прочитать как одно чтение. Одно сообщение может быть фрагментировано на несколько пакетов, и они могут не все прийти сразу, что, вероятно, то, что вы видите.
Ваша программа должна буферизовать все свои чтения и иметь механизм, чтобы определить, когда пришло целое сообщение, либо через разделитель (например, заголовки HTTP, которые разделены CRLFCRLF), либо по количеству байтов (например, тела HTTP, где длина равна указывается в заголовке) или закрыв соединение, чтобы указать конец данных (например, тела HTTP, когда длина содержимого не указана в заголовке). Могут быть и другие механизмы.