максимальный размер пакета для соединения TCP - PullRequest
172 голосов
/ 10 апреля 2010

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

Ответы [ 10 ]

155 голосов
/ 10 апреля 2010

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

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

74 голосов
/ 19 июня 2010

Это отличный вопрос, и я действительно много на этом разбираюсь. Есть много «технически правильных» ответов, таких как 65k и 1500. Я много работал над написанием сетевых интерфейсов, и использование 65k глупо, а 1500 также может привести к большим неприятностям. Моя работа идет на множестве различного оборудования / платформ / маршрутизаторов, и, если честно, я начинаю с 1400 байт. Если вам НУЖНО больше 1400, вы можете начать продвигаться вверх, вероятно, вы можете перейти на 1450, а иногда и на 1480'ish? Если вам нужно больше, чем это, то, конечно, вам нужно разделить на 2 пакета, из которых есть несколько очевидных способов сделать ..

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

Если вы «подтолкнете это», вы можете получить некоторые действительно странные вещи. Усеченные данные, очевидно, или отброшенные данные, которые я видел редко. Поврежденные данные также редко, но, безусловно, случаются.

18 голосов
/ 10 апреля 2010

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

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

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

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

6 голосов
/ 21 мая 2014

Согласно http://en.wikipedia.org/wiki/Maximum_segment_size, наибольший размер по умолчанию для пакета IPV4 в сети составляет 536 октетов (байтов размером 8 бит). См RFC 879

4 голосов
/ 10 апреля 2010

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

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

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

3 голосов
/ 06 июня 2014

Если вы работаете с компьютерами Linux, «ifconfig eth0 mtu 9000 up» - это команда для установки MTU для интерфейса. Однако я должен сказать, что большой MTU имеет некоторые недостатки, если передача по сети не так стабильна, и он может использовать больше памяти пространства ядра.

3 голосов
/ 10 апреля 2010

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

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

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

2 голосов
/ 30 августа 2017

Размер пакета для настройки TCP в протоколе IP (Ip4). Для этого поля (TL) выделено 16 битов, соответственно максимальный размер пакета составляет 65535 байтов: Детали протокола IP

2 голосов
/ 26 сентября 2016

Кажется, что большинство веб-сайтов в Интернете используют 1460 байт для значения MTU. Иногда это 1452, и если вы используете VPN, для заголовков IPSec оно будет еще больше.

Размер окна по умолчанию варьируется от 65535 байт. Я использую http://tcpcheck.com, чтобы посмотреть свои собственные значения IP-адреса источника и проверить, что используют другие интернет-поставщики.

2 голосов
/ 24 декабря 2014

Одним из решений может быть установка опции сокета TCP_MAXSEG (http://linux.die.net/man/7/tcp) на значение, которое является «безопасным» для базовой сети (например, установлено 1400, чтобы быть безопасным для Ethernet), а затем использовать большой буфер в системе отправки. вызов. Таким образом, может быть меньше системных вызовов, которые стоят дорого. Ядро разделит данные в соответствии с MSS.

Таким образом, вы можете избежать усеченных данных, и вашему приложению не нужно беспокоиться о небольших буферах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...