Максимальный размер пакета для TCP-соединения - программирование
Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

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

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

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

Ответ 10

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