Как настроить ОС для повторной сборки сегментов TCP

219
sam

У меня есть приложение, которое читает данные TCP из сокета. Отправляющее устройство отправляет полные 1400 байт данных в сокет сервера на другом конце. Где-то на этом пути пакет сегментируется / фрагментируется на 1024-байтовый сегмент и 376-байтовый сегмент. Чтобы правильно получать данные на стороне моего приложения, мне нужно дважды прочитать сокет и собрать пакет на уровне приложения, что может иметь проблемы с большим объемом трафика.

Из всего, что я прочитал, сборка сегментов TCP выполняется на IP-уровне. Я использую Windows Server 2012, и мое приложение использует Winsock. Есть ли способ настроить ОС для повторной сборки этих пакетов по мере их поступления на порт на этом уровне?

1
Вы используете терминологию небрежно (например, уровень IP обрабатывает только IP, а не * «повторную сборку сегментов TCP» *). Предоставьте лучшие описания или примеры того, что отправлено, и вы получаете. sawdust 5 лет назад 0
Транспортный слой, отправляющий данные изображения JPEG и получающий те же данные изображения JPEG. sam 5 лет назад 0

1 ответ на вопрос

3
Steffen Ullrich

TCP - это потоковый протокол, а не протокол сообщений. Стек TCP в ОС гарантирует, что данные передаются приложению в правильном порядке и что не происходит потеря данных и их дублирование. Он не заботится о сохранении каких-либо границ пакетов, поскольку, как я сказал, TCP является потоковым протоколом. Кроме того, отправитель может разделить одну запись на несколько пакетов или объединить несколько записей в один пакет. Будет выполнено разделение, чтобы адаптировать размер пакета к MTU / PMTU, чтобы избежать фрагментации пакетов во время доставки, и объединение для уменьшения накладных расходов на доставку.

Таким образом, приложение никогда не должно полагаться на неявные границы сообщений из-за того, как отправляющее приложение записало данные, но вместо этого должны использоваться явные (уровень приложения) границы сообщений.

Есть ли способ настроить ОС для повторной сборки этих пакетов по мере их поступления на порт на этом уровне?

Нет, вы должны правильно разобраться с этим в своем заявлении.