как я могу передавать большие объемы данных без разделения.
Я интерпретация выше, чтобы быть примерно эквивалентны «как я могу передать мои данные через соединение TCP, используя в качестве несколько TCP пакетов, как это возможно ». Как отмечали другие, нет никакой возможности для гарантии, что ваши данные будут помещены в один TCP-пакет, но вы можете сделать некоторые вещи, чтобы сделать его более вероятным. Вот некоторые вещи, которые я бы сделал:
- Держать одно TCP-соединение открытым. (HTTP традиционно открывает отдельное TCP-соединение для каждого запроса, но для низкой задержки вы не можете этого сделать. Вместо этого вам нужно открыть одно TCP-соединение, оставить его открытым и продолжить отправку/получение данных на нем, поскольку по мере необходимости).
- Уменьшите объем данных, необходимых для отправки. (т. е. есть ли какие-то вещи, которые вы отправляете, которые уже получает программа приема? Если да, не отправляйте их)
- Уменьшите количество байтов, которое необходимо отправить.(Самый простой способ сделать это - zlib -создавать свои данные сообщений перед отправкой, а при получении принимающей программы распаковать сообщение после его получения. Это может привести к уменьшению размера на 50-90%, в зависимости от содержимое ваших данных)
- Отключите Nagle's algorithm на вашем TCP-сокете. Это уменьшит задержку на 200 мс и обескураживает стек TCP от ненужных игр с вашими данными.
- Отправляйте каждый пакет данных с помощью одного вызова send() (если это означает, что нужно вручную копировать все элементы данных в отдельный буфер памяти перед вызовом send(), то пусть будет так).
Обратите внимание, что даже после выполнения всех вышеперечисленных действий уровень TCP по-прежнему иногда распространяет ваши сообщения на несколько пакетов и т. Д. - это именно так, как работает TCP. И даже если ваш локальный стек TCP никогда не делал этого, TCP-стек получающего компьютера по-прежнему иногда объединял данные из последовательных TCP-пакетов вместе внутри своего буфера приема. Таким образом, принимающая программа всегда собирается «получать ее, как разделенную», иногда, потому что TCP является потоковым протоколом и не поддерживает границы сообщений. (Если вам нужны границы сообщений, вам нужно будет сделать свой собственный кадрирование - самый простой способ - это, как правило, отправлять целое число байтов фиксированного размера (например, 1, 2 или 4 байта) перед каждым сообщением, поэтому получатель знает, сколько байтов ему нужно прочитать, прежде чем у него будет полное сообщение для разбора)
Чем меньше пакет, тем лучше вероятность его разложения, но вы никогда не сможете контролировать, происходит ли расщепление, если вы не владеете сеть до конца. – xaxxon
Не используйте JSON. Если все эти 1200 значений не более одного байта, вы можете использовать двоичный массив с фиксированными позициями переменных. Это почти наверняка будет меньше, чем ваш текущий MTU. И если вам нужно все принимать в порядок, подумайте о долговременном соединении, а не о многих маленьких. – DaSourcerer