Каков максимальный размер пакета для соединения TCP или как я могу получить максимальный размер пакета?
networking
tcp
Alexa
источник
источник
Ответы:
Абсолютное ограничение на размер пакета TCP составляет 64 КБ (65535 байт), но на практике это намного больше, чем размер любого пакета, который вы увидите, потому что нижние уровни (например, Ethernet) имеют меньшие размеры пакетов.
MTU (максимальная единица передачи) для Ethernet, например, составляет 1500 байт. Некоторые типы сетей (например, Token Ring) имеют большие MTU, а некоторые типы имеют меньшие MTU, но значения фиксированы для каждой физической технологии.
источник
Это отличный вопрос, и я на самом деле много работаю над этим. Есть много «технически правильных» ответов, таких как 65k и 1500. Я много работал над написанием сетевых интерфейсов, и использование 65k глупо, а 1500 также может привести к большим неприятностям. Моя работа связана с большим количеством различного оборудования / платформ / маршрутизаторов, и, если честно, я начинаю с 1400 байт. Если вам НУЖНО больше 1400, вы можете начать продвигаться вверх, вероятно, вы можете перейти на 1450, а иногда и на 1480'ish? Если вам нужно больше, то, конечно, вам нужно разделить на 2 пакета, из которых есть несколько очевидных способов сделать ..
Проблема в том, что вы говорите о создании пакета данных и его записи через TCP, но, конечно, есть привязанные данные заголовка и т. Д., Поэтому у вас есть «багаж», который поднимает вас до 1500 или более ..., а также У многих аппаратных средств есть более низкие пределы.
Если вы «подтолкнете это», вы можете получить действительно странные вещи. Сокращенные данные, очевидно, или пропущенные данные, которые я видел редко. Поврежденные данные тоже редко, но, безусловно, случаются.
источник
send()
если это удобно.1480'ish
должен быть1460
. Заголовок IP и заголовок TCP занимают не менее 20 байтов каждый (если не используются необязательные поля заголовка), и, таким образом, максимальный для (не Jumbo-кадра) Ethernet равен1500 - 20 -20 = 1460
.На уровне приложения приложение использует TCP в качестве потокового протокола. TCP, в свою очередь, имеет сегменты и абстрагирует детали работы с ненадежными IP-пакетами.
TCP имеет дело с сегментами вместо пакетов. Каждый сегмент TCP имеет порядковый номер, который содержится в заголовке TCP. Фактические данные, отправляемые в сегменте TCP, являются переменными.
Существует значение для getsockopt , которое поддерживается в некоторых ОС, которое вы можете использовать, называемое TCP_MAXSEG, которое извлекает максимальный размер сегмента TCP (MSS). Это не поддерживается на всех ОС, хотя.
Я не уверен, что именно вы пытаетесь сделать, но если вы хотите уменьшить размер используемого буфера, вы также можете посмотреть: SO_SNDBUF и SO_RCVBUF.
источник
Согласно http://en.wikipedia.org/wiki/Maximum_segment_size , максимальный размер по умолчанию для пакета IPV4 в сети составляет 536 октетов (байт размером 8 бит). См. RFC 879
источник
В TCP API нет пакетов.
В базовых протоколах часто бывают пакеты, например, когда TCP выполняется по IP, который вас не интересует, потому что они не имеют ничего общего с пользователем, за исключением очень деликатной оптимизации производительности, которая вас, вероятно, не интересует (в зависимости от постановка вопроса).
Если вы спросите, какое максимальное количество байтов вы можете использовать
send()
в одном вызове API, это зависит от реализации и настроек. Обычно вы вызываете send () для кусков размером до нескольких килобайт и всегда готовы к тому, что система откажется принять его полностью или частично, и в этом случае вам придется вручную разбивать фрагменты на более мелкие куски, чтобы передать ваши данные в TCP send () API.источник
Как правило, это будет зависеть от интерфейса, который использует соединение. Вероятно, вы можете использовать ioctl () для получения MTU, и, если это Ethernet, вы можете получить максимальный размер пакета, вычитая из этого размер аппаратного заголовка, который равен 14 для Ethernet без VLAN.
Это только в том случае, если MTU по крайней мере настолько велик по всей сети. TCP может использовать обнаружение MTU пути для уменьшения вашего эффективного MTU.
Вопрос в том, почему тебя это волнует?
источник
Если вы работаете с Linux, «ifconfig eth0 mtu 9000 up» - это команда для установки MTU для интерфейса. Тем не менее, я должен сказать, что большой MTU имеет некоторые недостатки, если передача по сети не так стабильна, и он может использовать больше памяти пространства ядра.
источник
Кажется, что большинство веб-сайтов в Интернете используют 1460 байт для значения MTU. Иногда это 1452, и если вы используете VPN, для заголовков IPSec он будет еще больше.
Размер окна по умолчанию варьируется от 65535 байт. Я использую http://tcpcheck.com, чтобы посмотреть свои собственные значения IP-адреса и проверить, что используют другие интернет-поставщики.
источник
Одним из решений может быть установка опции сокета TCP_MAXSEG ( http://linux.die.net/man/7/tcp ) в значение, которое является «безопасным» для базовой сети (например, для 1400, чтобы быть безопасным для Ethernet), а затем использовать большой буфер при отправке системного вызова. Таким образом, может быть меньше системных вызовов, которые стоят дорого. Ядро разделит данные в соответствии с MSS.
Таким образом, вы можете избежать усеченных данных, и вашему приложению не нужно беспокоиться о небольших буферах.
источник
Размер пакета для настройки TCP в протоколе IP (Ip4). Для этого поля (TL) выделено 16 битов, соответственно максимальный размер пакета составляет 65535 байтов: подробности протокола IP
источник