2010-04-10 2 views
134

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

+20

TCP основан на потоке. Есть ли конкретная причина, по которой вы беспокоитесь об отдельных пакетах? –

+19

Поскольку нижележащие слои основаны на пакетах ... Типичная реализация -> Уровень 1 - Ethernet PHY, уровень 2 - Ethernet MAC (определение пакета MAC, уровень 3 - интернет-протокол (определение IP-пакетов), уровень 4 - TCP (управление передачей Протокол) - использует под ним пакетную службу. – 2012-07-19 16:04:26

+0

Существует не такая вещь, как «TCP-пакет». Существуют сегменты TCP * *, длина которых описана 32-битовым словом, и они содержатся внутри или через * IP-адрес * пакеты, длина которых описана в 16 бит.Есть также Ethernet-фреймы, которые содержат все эти вещи. О какой из этих вещей вы спрашиваете? В любом случае, если вы используете TCP, вам не нужно беспокоиться о каких-либо из них в любом случае: TCP и IP ухаживают за всем этим. – EJP

ответ

1

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

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

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

+5

Это даст вам максимальный размер пакета на первой ссылке. Насколько мне известно, любому другому узлу вдоль маршрута разрешено не любить большие пакетов, и он может быть разделен где угодно вдоль p ATH. –

+0

Да, это правда ... так что ваш вопрос хороший - зачем вам это нужно? – WhirlWind

+0

Я хочу передать видео/изображения через LAN-соединение. – Alexa

6

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

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

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

+7

TCP имеет пакеты, а также заголовок пакета, часть которого перекрывает IP-заголовок. Просто потому, что вы не должны видеть это, это не значит, что этого не существует. TCP всегда * выполняется по IP. Вы не можете сделать это без IP, потому что заголовки перекрываются. – WhirlWind

+15

@WhirlWind TCP имеет * сегменты. * IP имеет пакеты. – EJP

+0

@EJP - какой вред вызывает «сегменты» и «кадры» под общим названием «пакет» - пакет TCP, пакет Ethernet и т. Д.? –

15

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

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

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

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

+0

Интересно, можете ли вы использовать TCP в качестве очереди сообщений, если вы можете поместить все ваши сообщения внутри большого пакета TCP? – CMCDragonkai

116

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

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

+12

«Но значения фиксированы для каждой физической технологии» - это неверно. Ethernet имеет максимальный MTU 1500, но вы можете использовать более низкую. С появлением больших кадров нет реального указанного максимума, и максимальный размер зависит от оборудования и драйвера. – WhirlWind

+4

@Whirl: правда, они настраиваются, но обычно это не так; «настраиваемый» субъективен, потому что для этого нужно вникать в ядро. Это не то, что можно возиться на уровне приложений, на котором, похоже, находится OP. – Ether

+0

Очень релевантно ... для оценки количества пакетов, которые ваш сайт берет для загрузки .... если Ethernet составляет 1500, то почему среднее значение GET составляет всего около 600 байтов? – 2012-06-17 19:02:32

64

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

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

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

+0

Почему запросы GET составляют в среднем около 600 байтов? – 2012-06-17 19:03:50

+8

Вы имеете в виду 64K, а не 65K. Я не знаю, что вы подразумеваете под «местом, где я начинаю, это 1400 байт». Вам не нужно беспокоиться о размерах пакетов в API TCP. Он заботится об определении и наблюдении пути MTU. Нет причин, по которым вы не можете написать 2G в одном 'send()', если это удобно. – EJP

+0

@ Nektario мы можем достичь скорости линии при 1500 пакетов в Linux? – user2087340

4

Если вы с машинами Linux, «Ifconfig eth0 МТУ 9000 до» это команда для установки MTU для интерфейс. Тем не менее, я должен сказать, что у большого MTU есть некоторые недостатки, если сетевая передача не настолько стабильна и может использовать больше памяти ядра.

2

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

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

2

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

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

1

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

Смежные вопросы