1

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

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

1 ответ1

3

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .