Коли саме проводиться ПМТУД? (Відкриття Шляху МТУ)


21

Під час дискусій, що випливали з інших питань на цьому сайті , я зрозумів, що я не розумію, коли виконується відкриття Path MTU (PMTUD).

Я знаю, що це робить - виявити найнижчу MTU на шляху від клієнта до сервера).
Я знаю, як це робиться - надсилайте прогресивно більші пакети зі своїм набором біт "Don't Fragment", і дивіться, наскільки великий пакет ви можете отримати, не отримуючи помилки "ICMP Need to Fragment".

Моє запитання конкретно тоді, коли хост виконає PMTUD?

Я шукаю конкретні випадки. Не просто щось загальне на кшталт "коли господар хоче відкрити MTU шлях". Бонусні бали, якщо ви можете забезпечити захоплення пакетів хостом, який це робить, або надати інструкції для генерації такого захоплення пакету.

Також я конкретно маю на увазі IPv4. Я знаю, що перехідні маршрутизатори IPv6 не відповідають за фрагментацію, і я можу уявити, що PMTUD трапляється набагато частіше. Але наразі я шукаю конкретні приклади PMTUD в IPv4. (хоча якщо єдине захоплення пакетів, яке ви можете скласти з PMTUD, знаходиться в IPv6, я все одно хотів би його побачити)


Чи виконується PMTUD від найнижчого підтримуваного MTU до найвищого? Або пристрій, що виконує PMTUD, спробує спершу найбільший MTU, а потім спуститься великим кроком, поки пакет не пройде, а потім посилиться меншими кроками, потім чергуйте вперед і назад до остаточного визначення?
cpt_fink

@cpt_fink, є кілька стратегій. Сучасні реалізації повідомлення про необхідність фрагментації ICMP включають у сам корисний набір ICMP MTU посилання, для якого необхідна фрагментація. Це полегшує, оскільки початковий хост одразу знає, що таке шлях MTU. Старіші реалізації повинні використовувати різні стратегії для «пошуку» потрібних MTU для використання. Ці стратегії викладені в RFC1191 у Розділі 5. Вони варіюються від автоматичного дефолту до мінімуму IP (576), до використання таблиці "загальних" MTU для більш ефективного пошуку (див. RFC1191, розділ 7.1).
Едді

2
Це цікаве питання. Я робив копання на PMTUD і виявив це. Незважаючи на те, що вона стара, я вирішив відповісти, тому що у мене було саме те питання, і через кілька годин дослідження я міг придумати досить гідну відповідь (я здогадуюсь). Я спробую завтра оновити та підтримати свою відповідь із захопленням пакетів, якщо це можливо.
Філіпе Гонсалвес

Відповіді:


15

Відповідь проста: коли завгодно хост. Дійсно. Це так просто.

Нижче пояснення передбачає лише середовище IPv4, оскільки IPv6 усуває фрагментацію маршрутизаторів (змушує хоста завжди мати справу з фрагментацією та виявленням MTU).

Не існує жодного суворого правила, яке регулює, коли (або навіть якщо) хост робить Path MTU Discovery. Причиною появи ПМТУД є те, що фрагментація вважається шкідливою з різних причин. Щоб уникнути фрагментації пакетів, концепція PMTUD була реалізована як спосіб вирішення. Звичайно, хороша операційна система повинна використовувати PMTUD, щоб мінімізувати фрагментацію.

Тож, природно, точна семантика використання PMTUD залежить від операційної системи відправника - зокрема, від реалізації сокета. Я можу говорити лише про конкретний випадок Linux, але інші варіанти UNIX, мабуть, не дуже відрізняються.

У Linux, PMTUD управляється IP_MTU_DISCOVERопцією socket. Ви можете отримати його поточний стан getsockopt(2), вказавши рівень IPPROTO_IPта IP_MTU_DISCOVERпараметр. Ця опція діє SOCK_STREAMлише для сокетів ( SOCK_STREAMсокет - це двосторонній, орієнтований на з'єднання, надійний сокет; на практиці це сокет TCP, хоча можливі й інші протоколи), і при встановленні Linux буде виконувати PMTUD точно так, як визначено в RFC 1191 рік.

Зауважте, що на практиці PMTUD - це безперервний процес; пакети надсилаються з набором бітів DF - включаючи 3-х сторонні пакети рукостискання - ви можете вважати це властивістю з'єднання (хоча реалізація може бути готовою прийняти певну ступінь фрагментації в якийсь момент і припинити надсилати пакети з DF встановлений біт). Таким чином, PMTUD - це лише наслідок того, що все, що стосується цього зв'язку, надсилається з DF.

Що робити, якщо ви не встановите IP_MTU_DISCOVER?

Існує значення за замовчуванням. За замовчуванням IP_MTU_DISCOVERувімкнено для SOCK_STREAMрозеток. Це можна прочитати або змінити, прочитавши /proc/sys/net/ipv4/ip_no_pmtu_disc. Нульове значення означає, що IP_MTU_DISCOVERвключено за замовчуванням у нових сокетах; ненульовий означає протилежне.

А що з безроз'ємними розетками?

Це складно, тому що безз’єднані, ненадійні розетки не передають повторно втрачені сегменти. Користувач стає відповідальним за пакетування даних у шматки розміру MTU. Також очікується, що користувач зробить необхідні повторні передачі у випадку надмірної помилки повідомлення. Отже, по суті код користувача повинен повторно виконувати PMTUD. Тим не менш, якщо ви готові до виклику, ви можете змусити біт DF, передавши IP_PMTUDISC_DOпрапор на setsockopt(2).

Суть

  • Ведучий вирішує, коли (і якщо) використовувати PMTUD
  • Коли він використовує PMTUD, це як атрибут з'єднання, це відбувається постійно (але в будь-який момент реалізація вільна припинити це робити)
  • Різні операційні системи використовують різні підходи, але, як правило, надійні роз'єми, орієнтовані на з'єднання, виконують функцію PMTUD за замовчуванням, тоді як ненадійні, безз'єднувальні сокети не роблять

4

Як правило, виявлення максимальної одиниці передачі шляху (PMTUD) відбувається, коли хост вважає, що пакет був упущений через занадто великий розмір.

Це може бути у відповідь на необхідну відповідь про фрагментацію ICMP (тип 3, код 4), що явно вказує на те, що пакет відпав. У типовій практиці всі пакети IPv4 встановлюються набором прапора "не фрагмент" (DF), тому будь-який пакет, що перевищує MTU, викликає таку відповідь. IPv6 взагалі не підтримує фрагментацію.

Деякі маршрутизатори або хост-брандмауери часто скидають усі ICMP, оскільки наївний адміністратор вважає ICMP ризиком для безпеки . Або деякі схеми агрегації ланок можуть порушити доставку ICMP . У RFC4821 запропоновано альтернативний механізм виявлення MTU, який не покладається на ICMP .

tracepath- мій улюблений інструмент Linux для зондування MTU. Ось приклад хоста з 9001 MTU в локальній мережі, але який повинен пройти IPsec VPN, щоб досягти 10.33.32.157:

$ tracepath -n 10.33.32.157
 1?: [LOCALHOST]                                         pmtu 9001
 1:  10.1.22.1                                             0.122ms pmtu 1500
 1:  169.254.3.1                                           1.343ms pmtu 1422
 1:  10.255.254.61                                        23.790ms 
 2:  no reply
^C [this host won't return an ICMP port unreachable, so tracepath won't terminate]

Помилки ICMP можна спостерігати за tcpdump:

$ sudo tcpdump -p -ni eth0 'icmp and icmp[0] == 3 and icmp[1] == 4'
14:46:57.313690 IP 10.1.22.1 > 10.1.22.194: ICMP 10.33.32.157 unreachable - need to frag (mtu 1500), length 36
14:46:57.315080 IP 169.254.3.1 > 10.1.22.194: ICMP 10.33.32.157 unreachable - need to frag (mtu 1422), length 556

Відкриття MTU зберігаються в кеші. У Linux це можна помітити і переконатись ip(будьте обережні щодо змін після Linux 3.6 ):

$ ip route get 10.33.32.157
10.33.32.157 via 10.1.22.1 dev eth0  src 10.1.22.194 
    cache  expires 591sec mtu 1422
$ sudo ip route flush cache
$ ip route get 10.33.32.157
10.33.32.157 via 10.1.22.1 dev eth0  src 10.1.22.194 
    cache

Для TCP перевищення MTU може уникнути як частина налаштування з'єднання. Має максимальний розмір сегмента (MSS), що входить до SYN, що надсилається кожним кінцем. Заголовок TCP (20 байт без урахування параметрів ) і IP-заголовок (20 байт) означають, що MSS і MTU пов'язані різницею в 40 байт.

Ось приклад налаштування з'єднання між цими двома хостами при передачі великого файлу за допомогою scp:

$ sudo tcpdump -p -ni eth0 'host 10.33.32.157 and tcp[13]&2 == 2'
IP 10.1.22.194.45853 > 10.33.32.157.22: Flags [S], seq 634040018, win 26883, options [mss 8961,sackOK,TS val 10952240 ecr 0,nop,wscale 7], length 0
IP 10.33.32.157.22 > 10.1.22.194.45853: Flags [S.], seq 1371736848, ack 634040019, win 26847, options [mss 1379,sackOK,TS val 10824267 ecr 10952240,nop,wscale 7], length 0

У першому пакеті локальний хост пропонує MSS 8961. Це налаштований 9001 MTU, менше 40 байт. Повернений SYN / ACK має MSS 1379, що означає MTU 1419. Я випадково знаю, що в цій мережі віддалений хост також надіслав 8961, але значення було змінено маршрутизатором, оскільки він знає, що шлях включає Інтернет-шлях ( MTU 1500) накладні витрати з тунелю IPsec. Цей маршрутизатор також змінив наш відправлений MSS 8961, щоб він відображався як 1419 у іншого хоста. Це називається затисканням MSS .

Тож у певному сенсі PMTUD відбувається постійно. На практиці це дійсно може статися ніколи, якщо затискання MSS не відбувається і весь трафік відбувається через TCP або якщо жоден з маршрутизаторів не має MTU, менший, ніж налаштовано на кінцевих точках. Навіть без затискання MSS це може траплятися лише рідко, коли кеш закінчується.


-3

PMTUD використовується для обчислення найкращих MSS для сеансів TCP. Одним із прикладів є реалізація BGP на маршрутизаторах Cisco або Juniper.

http://www.juniper.net/techpubs/en_US/junos12.1/topics/usage-guidelines/routing-configuring-mtu-discovery-for-bgp-sesions.html

Спасибі.


2
Я вважаю, що він мав на увазі "коли це спрацьовує?".
Глава Йорданії
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.