максимальный размер пакета для соединения TCP

Каков максимальный размер пакета для соединения TCP или как я могу получить максимальный размер пакета?

180
задан Glen Selle 12 March 2016 в 06:58
поделиться

5 ответов

Обычно это будет зависеть от интерфейса, который использует соединение. Вероятно, вы можете использовать ioctl () для получения MTU, и если это Ethernet, вы обычно можете получить максимальный размер пакета, вычтя из него размер заголовка оборудования, что составляет 14 для Ethernet без VLAN.

Это справедливо только в том случае, если MTU в сети не меньше такого же размера. TCP может использовать определение MTU пути, чтобы уменьшить ваш эффективный MTU.

Вопрос в том, почему вас это волнует?

3
ответ дан 23 November 2019 в 06:14
поделиться

Абсолютное ограничение на размер пакета TCP составляет 64K (65535 байт), но на практике это намного больше, чем размер любого пакета, который вы увидите, потому что нижние уровни (например, ethernet) имеют меньшие размеры пакетов.

MTU (Maximum Transmission Unit) для Ethernet, например, составляет 1500 байт. Некоторые типы сетей (например, Token Ring) имеют большие MTU, а некоторые типы - меньшие MTU, но эти значения фиксированы для каждой физической технологии.

167
ответ дан 23 November 2019 в 06:14
поделиться

На уровне приложения приложение использует TCP как потоковый протокол. TCP, в свою очередь, имеет сегменты и абстрагирует детали работы с ненадежными IP-пакетами.

TCP работает с сегментами, а не с пакетами. Каждый сегмент TCP имеет порядковый номер, который содержится в заголовке TCP. Фактические данные, отправляемые в сегменте TCP, являются переменными.

Существует значение для getsockopt , которое поддерживается в некоторых ОС, которые вы можете использовать, и называется TCP_MAXSEG, который извлекает максимальный размер сегмента TCP (MSS). Однако он поддерживается не во всех ОС.

Я не совсем уверен, что вы пытаетесь сделать, но если вы хотите уменьшить размер используемого буфера, вы также можете изучить: SO_SNDBUF и SO_RCVBUF.

20
ответ дан 23 November 2019 в 06:14
поделиться

В TCP API нет пакетов.

Часто есть пакеты в базовых протоколах, например, когда TCP делается поверх IP, которые вас не интересуют, потому что они не имеют никакого отношения к пользователю, кроме очень тонких оптимизаций производительности, которые вас, вероятно, не интересуют (согласно формулировке вопроса).

Если вы спрашиваете, какое максимальное количество байт вы можете отправить() за один вызов API, то это зависит от реализации и настроек. Обычно вы вызываете send() для кусков размером до нескольких килобайт, и всегда должны быть готовы к тому, что система откажется принять его полностью или частично, и в этом случае вам придется вручную управлять разбиением на более мелкие куски, чтобы передать данные в API TCP send().

4
ответ дан 23 November 2019 в 06:14
поделиться

Это отличный вопрос, и я часто сталкиваюсь с этим на работе. Есть много "технически правильных" ответов, таких как 65k и 1500. Я много занимался написанием сетевых интерфейсов, и использовать 65k глупо, а 1500 может привести к большим неприятностям. В моей работе используется множество различных аппаратных средств / платформ / маршрутизаторов, и, честно говоря, я начинаю с 1400 байт. Если вам нужно больше 1400, вы можете начать подниматься вверх, вероятно, вы сможете дойти до 1450, а иногда и до 1480? Если вам нужно больше, то, конечно, вам нужно разделить на 2 пакета, для чего есть несколько очевидных способов...

Проблема в том, что вы говорите о создании пакета данных и записи его через TCP, но, конечно же, есть данные заголовка и так далее, так что у вас есть "багаж", который заставит вас работать до 1500 и выше... а также многие аппаратные средства имеют более низкие пределы.

Если "поднажать", можно получить очень странные вещи. Усеченные данные, очевидно, или потерянные данные я встречал редко. Поврежденные данные также редко, но случаются.

78
ответ дан 23 November 2019 в 06:14
поделиться