LINUX.ORG.RU
ФорумAdmin

Не понимаю фрагментацию IP-пакетов


0

2

Посылаю в Netkit по цепочке

ws1 --(MTU 1500)-> r1 --(MTU 576)-> ws2
пакет командой
ws1:~# ping ws2 -t 1000
при отключенном nofragment. Результат:
ws2:~# tcpdump -tnv icmp                                                                                                                                     
IP (tos 0x0, ttl 63, id 11059, offset 0, flags [+], proto ICMP (1), length 572) 10.10.0.2 > 10.20.0.2: ICMP echo request, id 22530, seq 1, length 552        
IP (tos 0x0, ttl 63, id 11059, offset 552, flags [none], proto ICMP (1), length 476) 10.10.0.2 > 10.20.0.2: icmp 

Вопрос: почему при значении MTU 576 первый пакет имеет размер именно 572, а не 576?

Да, я в курсе про определение MSS и про то, что фрагментация IP не используется.

★★★★★
Ответ на: комментарий от anonymous

Заголовок какого кадра? MTU --- это именно максимальный размер IP-пакета (вместе с IP-заголовком). 8 байт --- заголовок ICMP, но он-то тут причем...

572 + 476 = 1048 = 2 * sizeof(IP_header) + 1000 + sizeof(ICMP_header)

все сходится вроде, кроме одного --- почему 572 и 476, а не 576 и 472.

Сурсы ядра читать могу, но лень.

sv75 ★★★★★
() автор топика

Частично разобрался. Linux выравнивает длину посылаемой части полезной нагрузки на границу 8-ми байтов, вот и получается 552, а не 556.

/* IF: we are not sending upto and including the packet end
then align the next start on an eight byte boundary */
if (len < left) {
    len &= ~7;
}
sv75 ★★★★★
() автор топика
Ответ на: комментарий от dreamer

Только при фрагментации и во всех фрагментах, кроме последнего (при len < left, разумеется).

sv75 ★★★★★
() автор топика
Ответ на: комментарий от dreamer

Ну то есть можно сказать «да, хочу», учитывая что смещение 0 уже выровнено на границу 8 байт.

sv75 ★★★★★
() автор топика
Ответ на: комментарий от sv75

Боюсь это совсем тут не при чем. Первый пакет имеет размер 572 = 552 + 20 байт заголовок IP.

552 байт - минимальный mtu в linux.
sysctl net.ipv4.route.min_pmtu

Chumka ★★★
()
Ответ на: комментарий от Chumka

В данном случае MTU --- это ограничение на содеджимое пакета *вместе* с IP-заголовком. Теорию просто проверить на иных значениях, но фрагмент из ip_fragment по-моему и так выглядить убедитльно.

sv75 ★★★★★
() автор топика
Ответ на: комментарий от sv75

>Linux выравнивает длину посылаемой части полезной нагрузки на границу 8-ми байтов, вот и получается 552, а не 556.

rfc 791.

Fragment Offset: 13 bits. This field indicates where in the datagram this fragment belongs. The fragment offset is measured in units of 8 octets (64 bits). The first fragment has offset zero.

Вы про это?

mky ★★★★★
()
Ответ на: комментарий от mky

Господи, дождались специалиста да, спасибо %)

sv75 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.