Как точно се определя и разпределя количеството пространство, разпределено за пакет skb, който трябва да бъде предаден?

Доколкото разбирам, когато буферът на сокет (skb) е разпределен от стека на ядрото (по пътя на Tx), указателите „head“ и „tail“ сочат към началото и края на запазеното пространство в паметта.

Въпросът ми е: какво точно определя това количество: (опашка - глава) октети? Макс. MTU ли е? Не изглежда така, тъй като малък експеримент показва, че # байтове (опашка-глава) може да бъде доста малък (320 байта и т.н.). И така, приложението на сокета играе ли роля тук?

Също така, AFAIK, идеята е да се резервира достатъчно памет, така че да не се изискват допълнителни разпределения по-надолу в протоколния стек, т.е. запазеното пространство може да бъде повече от полезния товар. Ако е така, какво ще кажете за случаите, в които се извършва допълнително капсулиране (като VoIP, SSL и т.н.?)?

Актуализация: Това помага ли да се отговори на qs?

  1. Намерено в net/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?

TIA!


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
Благодаря ugoren! Какво е MTU-40? - person kaiwan; 25.06.2012
comment
MTU на интерфейса (1500) минус 40. - person ugoren; 25.06.2012