Как именно определяется и распределяется объем пространства, выделенного для передаваемого пакета skb?

Насколько я понимаю, когда буфер сокета (skb) выделяется стеком ядра (на пути Tx), указатели «голова» и «хвост» указывают на начало и конец зарезервированного пространства памяти.

Мой вопрос: что именно определяет это количество: (хвост - голова) октеты? Это максимальный MTU? Не похоже, так как небольшой эксперимент показывает, что количество байтов (хвост) может быть довольно маленьким (320 байт и т. д.). Так играет ли здесь роль сокет-приложение?

Кроме того, насколько мне известно, идея состоит в том, чтобы зарезервировать достаточно памяти, чтобы не требовалось никаких дополнительных распределений дальше по стеку протоколов, т. Е. Зарезервированное пространство может быть больше, чем полезная нагрузка. Если да, то как насчет случаев, когда выполняется дополнительная инкапсуляция (например, VoIP, SSL и т. д.?)?

Обновление. Помогает ли это ответить на вопросы?

  1. Найдено в сети/ipv4/tcp_output.c:

    ... tcp_make_synack() { ... skb = sock_wmalloc(sk, MAX_TCP_HEADER + 15 + s_data_desired, 1, GFP_ATOMIC); ... }

Кажется, это часть SYN-ACK состояния TCP m/c. Итак, таким образом, «размер», похоже, составляет около 320.

  1. Пакеты данных сегментов TCP .. по умолчанию «mss» - 512? ‹-- на основе tcp_base_mss?

ТИА!


person kaiwan    schedule 23.06.2012    source источник


Ответы (1)


Сначала небольшая поправочка - буфер находится между head и end, а не tail (который в паре с data).

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

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

MSS «по умолчанию» не очень важен — он используется только тогда, когда невозможно найти лучшее значение. Обычно MSS будет MTU-40, что обычно равно 1460.

person ugoren    schedule 24.06.2012
comment
Спасибо угорен! Что такое МТУ-40? - person kaiwan; 25.06.2012
comment
MTU интерфейса (1500) минус 40. - person ugoren; 25.06.2012