Фізичний рівень і вимірювання
Навіщо це
Section titled “Навіщо це”Ви купили гігабітний тариф, а копіювання файлу на сервер за океаном іде зі швидкістю двадцять мегабіт. Провайдер тут ні до чого: швидкість одного TCP-з’єднання на далекій відстані залежить і від каналу, і від того, скільки часу кожен байт летить туди й назад. Інший приклад: відеодзвінок уривається, хоча швидкість у тесті чудова. Тест міряв пропускну здатність, а дзвінок страждає від коливань затримки.
«Швидкість мережі» у побуті означає два різні числа, а в цьому модулі ми їх розділимо й навчимося вимірювати кожне окремо. Фізичний рівень тут знадобиться на рівні інтуїції: досить знати, чим відрізняються носії, щоб розуміти, звідки беруться обмеження, які потім нічим не обійти.
Передумови. Модуль 1: уявлення про рівні. Більше нічого.
Середовища передачі
Section titled “Середовища передачі”Фізичний рівень вирішує, як перетворити біти на щось, що можна передати, і як отримати їх назад.
Мідь (кручена пара). Біти кодуються змінами напруги в парі мідних дротів. Дроти скручені, щоб зовнішні завади діяли на обидва однаково й віднімалися на приймачі. Звичайний кабель Ethernet має чотири такі пари. Мідь дешева, гнучка, проста в обтисканні, але сигнал слабшає й накопичує завади, тому для крученої пари Ethernet межа становить 100 м на сегмент (для 1000BASE-T і 10GBASE-T зокрема). Далі потрібен повторювач, комутатор або оптика.
Оптика. Біти кодуються спалахами світла у скляній жилі. Завади на волокно не діють, загасання мале, і кабель може тягнутися на десятки кілометрів. Волокно буває двох типів. Багатомодове (діаметр серцевини 50 або 62,5 мкм) дешевше, підходить для відстаней у сотні метрів усередині будівлі чи датацентру. Одномодове (близько 9 мкм) тонше, вимагає точніших лазерів і дорожчих трансіверів, але дає змогу без регенерації сигналу передавати на десятки кілометрів, а з підсилювачами й на океанські відстані. Майже вся магістральна мережа інтернету є оптикою, зокрема підводні кабелі між континентами.
Радіо. Біти кодуються в параметрах хвилі: амплітуді, частоті, фазі. Ефір ділять усі, хто його чує, і тут з’являються проблеми, яких немає в кабелі: завади від сусідів, відбиття, загасання в стінах, необхідність домовлятися, хто говорить зараз (про це в модулі 17). Межа швидкості радіоканалу випливає з формули Шеннона: пропускна здатність зростає з шириною смуги й логарифмічно з відношенням сигнал/шум. Тому швидший Wi-Fi означає ширші канали й краще співвідношення сигнал/шум, а не «магічні» антени.
| Мідь | Оптика | Радіо | |
|---|---|---|---|
| Типова відстань без підсилення | до 100 м | сотні метрів (багатомодове), десятки км (одномодове) | десятки метрів у Wi-Fi |
| Завади | є, крутіння їх послаблює | практично немає | головна проблема |
| Середовище | виділене | виділене | спільне |
| Де зустрінете | доступ до хосту, офіс | магістраль, датацентр | Wi-Fi, стільникові мережі |
Пропускна здатність і затримка
Section titled “Пропускна здатність і затримка”Пропускна здатність (bandwidth) каналу показує, скільки біт за секунду можна ввести в лінію. Затримка (latency) показує, скільки часу біт іде від одного кінця до іншого. Друге число часто вимірюють як RTT (round-trip time): час туди й назад.
Порівняйте їх з водогоном. Пропускна здатність відповідає діаметру труби: скільки води пройде за секунду. Затримка відповідає її довжині: скільки часу перша крапля йде від крана до склянки. Ширша труба не скорочує її довжину, тому найпотужніший тариф не зробить відповідь із іншого континенту миттєвою.
У щоденних задачах вирішальним буває то одне число, то інше:
- Завантаження великого файлу залежить переважно від пропускної здатності.
- Відкриття сторінки складається з десятків маленьких запитів, і кожен платить RTT (див. модуль 1), тож домінує затримка.
- Голосовий дзвінок потребує мізерної пропускної здатності, але стабільної затримки.
Одиниці слід розрізняти. Швидкість каналів вимірюють у бітах за секунду (Мбіт/с, Гбіт/с), а обсяги файлів і буферів у байтах. У байті вісім біт, тому гігабітний канал віддає щонайбільше 125 МБ/с, і то в теорії, без заголовків. Префікси каналів десяткові: 1 Гбіт/с — це 10⁹ біт, а не 2³⁰.
З чого складається затримка
Section titled “З чого складається затримка”Затримка одного пакета на одному переході складається з таких частин:
- Серіалізація (transmission delay). Час, за який відправник виштовхує всі біти пакета в лінію. Дорівнює розміру пакета, поділеному на швидкість каналу.
- Поширення (propagation delay). Час, за який сигнал долає відстань. Залежить від довжини лінії й швидкості сигналу і ніяк не залежить від того, наскільки швидкий канал.
- Обробка. Маршрутизатор читає заголовок, шукає маршрут, перераховує контрольні суми. На сучасному обладнанні це мікросекунди.
- Черга. Якщо пакети надходять швидше, ніж вихідний канал їх виштовхує, вони чекають у буфері. Єдина складова, яка сильно коливається.
Серіалізація. Для пакета розміром 1500 байтів (12 000 біт):
| Швидкість каналу | Час серіалізації |
|---|---|
| 1 Мбіт/с | 12 мс |
| 10 Мбіт/с | 1,2 мс |
| 100 Мбіт/с | 120 мкс |
| 1 Гбіт/с | 12 мкс |
| 10 Гбіт/с | 1,2 мкс |
На швидких каналах серіалізація майже зникає, а на повільних вона помітна навіть на короткій лінії.
Поширення. Сигнал у світловоді й міді поширюється зі швидкістю приблизно дві третини швидкості світла у вакуумі, тобто близько 200 000 км/с або 200 км за мілісекунду. Світлу потрібно близько 5 мкс на кілометр. Це нижня межа затримки, і жодна технологія її не здолає: для лінії завдовжки 6000 км це 30 мс в один бік і 60 мс туди й назад. Реальні маршрути довші за пряму, бо кабелі не проходять по ній, а на шляху ще є обладнання, тому 80–100 мс на такій відстані є нормою.
Тож затримка однієї передачі приблизно дорівнює сумі серіалізації та поширення (плюс черги й обробка). На коротких повільних лініях переважає перша, на довгих швидких друга. Поширення можна скоротити тільки разом із відстанню, для цього CDN і переносять вміст ближче до користувачів.
Поки вихідний канал встигає виштовхувати пакети, черги порожні. Коли
пакети надходять швидше (наприклад, гігабітна локальна мережа з’єднана з
100-мегабітним виходом в інтернет), надлишок накопичується в буфері. Час
очікування у черзі дорівнює обсягу черги, поділеному на швидкість каналу.
Буфер на 1 МБ перед каналом на 10 Мбіт/с, заповнений до краю,
додає 0,8 с до кожного пакета, і ping у завантаженій мережі легко
стрибає з 10 мс до сотень.
Цю появу надмірно великих буферів називають bufferbloat, і їй присвячений модуль 12. Поки що досить того, що під навантаженням затримка коливається, і це нормальна, хоч і небажана, властивість спільного каналу.
Джитер
Section titled “Джитер”Джитер (jitter) — коливання затримки від пакета до пакета. Якщо кожен пакет доходить рівно за 30 мс, затримка велика, але джитер нульовий. Якщо пакети йдуть то за 10, то за 80 мс, середня затримка мала, але джитер великий.
Для завантаження файлу це байдуже, бо TCP збирає байти по порядку. Для голосу і відео, де пакет має з’явитись у конкретну мить, коливання шкодить: приймач тримає невеликий буфер і програє з запізненням, щоб згладити коливання. Джитер, що перевищує цей буфер, чути як уривчастий звук. Джерела джитера ті самі: черги, шляхи різної довжини, конкуренція за радіоефір.
Добуток пропускної здатності на затримку
Section titled “Добуток пропускної здатності на затримку”Обидві величини об’єднує добуток пропускна здатність × RTT (bandwidth-delay product, BDP). Він показує, скільки даних умістить «труба» між відправником і отримувачем: стільки байтів відправлено й ще не підтверджено.
Приклад. Канал 1 Гбіт/с із RTT 50 мс. BDP = 10⁹ × 0,05 = 50 Мбіт, тобто 6,25 МБ. Щоб завантажити канал повністю, відправник мусить надіслати 6,25 МБ і лише тоді чекати на перше підтвердження. TCP обмежує кількість байтів у польоті вікном (деталі в модулі 11), тому швидкість одного з’єднання не перевищить «вікно / RTT». Якщо вікно дорівнює 64 КіБ (65 535 байтів, максимум у TCP без розширення масштабу вікна), то за RTT 50 мс маємо 65 535 × 8 / 0,05 ≈ 10,5 Мбіт/с, навіть за гігабітного каналу.
Це й пояснює повільне копіювання з початку модуля: швидкість одного з’єднання залежить від RTT і вікна. Сучасні системи використовують масштабування вікна й автоналаштування буферів, тому на практиці обмеження менш жорстке, але для великих BDP (міжконтинентальні лінії, супутники) його досі доводиться враховувати.
Вимірювання
Section titled “Вимірювання”Здебільшого вистачає таких інструментів:
pingміряє RTT до вузла й частку втрат. Використовує ICMP echo (модуль 6).mtrоб’єднуєtracerouteіping: показує RTT і втрати до кожного вузла на шляху.iperf3міряє пропускну здатність між двома машинами, на яких запущено його самого: один як сервер, інший як клієнт.
Замінити один іншим не вийде: ping
нічого не скаже про пропускну здатність, а iperf3 про затримку.
Як це насправді в Linux
Section titled “Як це насправді в Linux”Усі команди нижче запускаються на трьох просторах імен: h1, маршрутизатор r
і h2 із сервером iperf3. Якщо ви хочете повторити, зберіть цю мережу
командами з підрозділу «Мережа з нуля»
модуля 3 «Мережа в ядрі Linux».
ip netns exec h1 ping -c 5 -n 10.0.2.25 packets transmitted, 5 received, 0% packet loss, time 4092msrtt min/avg/max/mdev = 0.029/0.051/0.073/0.017 msРядок rtt вказує мінімум, середнє, максимум і mdev, стандартне відхилення.
Останнє дає грубу оцінку джитера. Тут усе відбувається в пам’яті одного
комп’ютера, тому RTT вимірюється десятками мікросекунд.
ip netns exec h1 mtr -n -r -c 5 10.0.2.2HOST: vm Loss% Snt Last Avg Best Wrst StDev 1.|-- 10.0.1.1 0.0% 5 0.1 0.1 0.0 0.1 0.0 2.|-- 10.0.2.2 0.0% 5 0.1 0.1 0.0 0.1 0.0Прапорці: -n без розв’язання імен, -r режим звіту, -c 5 п’ять проб.
У справжньому інтернеті обережно читайте втрати на проміжному вузлі: маршрутизатори
часто обмежують швидкість відповідей на ICMP, тож втрати на одному вузлі, які
не продовжуються на наступних, зазвичай означають саме це, а не втрату трафіку.
ip netns exec h2 iperf3 -s -Dip netns exec h1 iperf3 -c 10.0.2.2 -t 2[ 5] 0.00-2.00 sec 2.92 GBytes 12.5 Gbits/sec 18273 sender[ 5] 0.00-2.00 sec 2.92 GBytes 12.5 Gbits/sec receiver12,5 Гбіт/с між просторами імен: канал тут віртуальний і упирається в
швидкість процесора й копіювання пам’яті. Цікаво, що ethtool v1 для цього
інтерфейсу пише Speed: 10000Mb/s, а iperf3 показує більше. Число в
ethtool для віртуальних пристроїв лише зручний ярлик і ніде не обмежує.
Щоб побачити чергу, обмежимо канал до 50 Мбіт/с і заповнимо його. Для
обмеження використано tc-дисципліну tbf (token bucket filter):
ip netns exec h1 tc qdisc add dev v1 root tbf rate 50mbit burst 16kbit limit 300kbip netns exec h1 iperf3 -c 10.0.2.2 -t 6 &ip netns exec h1 ping -c 10 -i 0.3 -n 10.0.2.2[ 5] 0.00-6.00 sec 33.9 MBytes 47.3 Mbits/sec receiverrtt min/avg/max/mdev = 2.407/3.887/6.226/1.074 msБез навантаження RTT дорівнював 0,05 мс, а під завантаженням зріс до
4 мс: пакети ping стали в чергу позаду пакетів iperf3. Пропускна
здатність ~47 Мбіт/с показує, що tbf обмежив канал так, як просили.
ip netns exec h1 tc qdisc del dev v1 rootОбмеження треба прибрати, інакше далі все працюватиме «з гальмом».
Розмір буферів TCP, від якого залежить, чи зможе одне з’єднання заповнити великий BDP, видно тут:
sysctl net.ipv4.tcp_rmem net.ipv4.tcp_wmemnet.ipv4.tcp_rmem = 4096 131072 33554432net.ipv4.tcp_wmem = 4096 16384 4194304Три числа: мінімум, початкове значення й максимум у байтах. Ядро саме підбирає розмір між мінімумом і максимумом. Значення залежать від дистрибутива й розміру пам’яті, тож у вас вони можуть відрізнятися.
Якщо канал справжній, швидкість і дуплекс видно так (вивід залежить від мережевої карти й драйвера):
ethtool eth0 | grep -E 'Speed|Duplex|Link detected' Speed: 1000Mb/s Duplex: Full Link detected: yesУ віртуальній машині з картою virtio (наприклад, у Vagrant-машині курсу) побачите
Speed: Unknown!: віртуальна карта не має фізичної швидкості лінії, і реальну
пропускну здатність показує лише замір iperf3.
Типові помилки розуміння
Section titled “Типові помилки розуміння”«Більше мегабітів означає швидший інтернет». Пропускна здатність не скорочує відстань. Для типової веб-сторінки, яка складається з багатьох малих запитів, після певного рівня додаткові мегабіти майже не дають виграшу, а зменшення RTT дає.
«Мегабіт і мегабайт — одне й те саме». У байті вісім біт. Тариф 100 Мбіт/с дає щонайбільше 12,5 МБ/с, і реальний результат завжди трохи менший через заголовки.
«Швидкість тесту — це швидкість моєї мережі». Тест міряє канал до найближчого тестового сервера, за один момент, зазвичай декількома паралельними з’єднаннями. Ваша програма може працювати з дальшим сервером, одним з’єднанням і в час пік.
«Світловод майже миттєвий». Світло у склі йде приблизно на третину повільніше, ніж у вакуумі, і 200 км за мілісекунду це фізична межа. Кабель через Атлантику завжди додасть десятки мілісекунд, яким би швидким не був канал.
«Низький пінг означає хорошу мережу». Пінг у спокійній мережі лише показує, що затримка в спокої мала. Під навантаженням, коли виростають черги, він може вирости на два порядки, і на відеодзвінку це відчуєте одразу.
Перевір себе
Лабораторна
Section titled “Лабораторна”Числа цього модуля знадобляться в лабораторній B6:
там ви вимірюєте пропускну здатність і затримку під штучно погіршеним
каналом (tc netem) і пояснюєте результат через BDP і чергу.
Джерела
Section titled “Джерела”- Kurose, Ross — Computer Networking: A Top-Down Approach, розділ 1 (затримки в пакетних мережах)
- Peterson, Davie — Computer Networks: A Systems Approach, розділ 1 (bandwidth і latency)
- Grigorik — High Performance Browser Networking, розділ 1 «Primer on Latency and Bandwidth» (є відкрита онлайн-версія)
man 8 ping,man 8 mtr,man 8 tc-tbf,man 8 ethtool,man 7 tcp- Документація iperf3: software.es.net/iperf