DNS, IP, порти та мережа
Зміст
Коли автотест відкриває https://app.example.com/login, за одним цим рядком ховається злагоджена робота кількох протоколів: імʼя треба перетворити на адресу, до адреси достукатися, встановити зʼєднання, домовитися про правила обміну. Якщо будь-яка ланка спрацьовує повільно або нестабільно, тест «мигає» (flaky) без жодної помилки у власне продуктовому коді. Тому AQA-інженеру треба розуміти не лише HTTP-запити, а й шар під ними: адреси, імена, порти, транспорт. Цей розділ будує саме таку картину — від адресації до повного відкриття сторінки.
IP-адреса: як влаштована адресація в мережі
IP-адреса (IP address, від Internet Protocol) — це числовий ідентифікатор вузла в мережі. Її роль проста: за IP пакети даних знаходять дорогу до потрібного компʼютера, так само як лист знаходить будинок за поштовою адресою. Домени, порти й протоколи вищого рівня — це надбудова; на мережевому рівні маршрутизація йде саме за IP.
Сьогодні співіснують дві версії протоколу.
IPv4 використовує 32 біти, які записують як чотири десяткові числа (октети) від 0 до 255, розділені крапками:
192.168.0.14
93.184.216.34
32 біти дають приблизно 4,3 мільярда унікальних адрес. У 1980-х це здавалося величезним числом, але для сучасного інтернету адрес не вистачає — звідси й механізми продовження життя IPv4 на кшталт NAT (про нього нижче), і поява наступної версії.
IPv6 використовує 128 біт і записується як вісім груп по чотири шістнадцяткові цифри, розділені двокрапками:
2001:0db8:85a3:0000:0000:8a2e:0370:7334
Щоб не тягнути нулі, IPv6 дозволяє скорочення: провідні нулі в групі опускають, а один ланцюжок груп із самих нулів згортають до ::. Той самий приклад скорочено:
2001:db8:85a3::8a2e:370:7334
Адресний простір IPv6 настільки великий, що дефіциту адрес там немає в осяжній перспективі. Багато вузлів сьогодні двостекові (dual-stack) — мають і IPv4-, і IPv6-адресу; клієнт пробує їх майже одночасно, з невеликою перевагою для IPv6 (алгоритм Happy Eyeballs), і лишає те зʼєднання, що встановилося першим. За специфікацією спроби навіть не стартують строго одночасно: клієнт пробує спочатку IPv6, а IPv4-спробу запускає з невеликою затримкою, якщо перша ще не зʼєдналася. Для тестів це ще одне джерело плаваючих таймінгів: на кривій IPv6-мережі перше зʼєднання може «думати» довше, доки клієнт відкотиться на IPv4.
Кілька діапазонів варто знати напамʼять, бо AQA стикається з ними щодня.
| Адреса / діапазон | Що це | Де зустрічається |
|---|---|---|
127.0.0.1 (IPv4), ::1 (IPv6) | Loopback — «сам до себе» | Локальний застосунок під тестом |
localhost | Імʼя, що резолвиться у loopback | baseURL у конфігах тестів |
10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 | Приватні мережі (private ranges) | Домашні/офісні/CI-мережі, docker |
0.0.0.0 | «Усі інтерфейси» при прослуховуванні | Сервер, доступний ззовні контейнера |
Запис 192.168.0.0/16 — це CIDR-нотація: число після скісної риски (тут 16) означає, скільки старших біт адреси фіксовані як префікс мережі. Решта біт відводиться під адреси вузлів усередині цієї мережі — тобто /16 лишає 16 біт, приблизно 65 тисяч адрес.
Ім’я localhost за угодою резолвиться в loopback (127.0.0.1 / ::1) і зазвичай прописане в системному файлі hosts, тож працює навіть без DNS. Це не абсолютна гарантія — теоретично hosts можна переписати, — але на практиці на цю відповідність спираються сміливо.
Приватні адреси не маршрутизуються в публічному інтернеті. Щоб машина з приватної мережі вийшла назовні, роутер підміняє її адресу на свою публічну — це NAT (Network Address Translation). Практичний наслідок для тестування: сервіс, піднятий на 127.0.0.1:3000, видно лише всередині тієї ж машини чи контейнера, а сервіс на 0.0.0.0:3000 слухає всі інтерфейси й доступний ззовні. Плутанина між цими двома адресами — типова причина «у мене працює, а в CI ні».
DNS: телефонний довідник інтернету
Люди мислять іменами (google.com), а мережа маршрутизує за числами. DNS (Domain Name System) — це розподілена ієрархічна система, яка перекладає доменні імена в IP-адреси. Класична аналогія — телефонний довідник: ти знаєш імʼя, а система повертає номер.
DNS вирішує не лише зручність запамʼятовування. Він розвʼязує звʼязок «імʼя ↔︎ адреса», і цей рівень непрямості дає гнучкість:
- один сайт може стояти за багатьма IP — DNS повертає різні адреси й так балансує навантаження;
- IP-адресу сервера можна змінити, не чіпаючи імені — користувачі й тести й далі йдуть на
app.example.com; - за одним IP можуть жити багато доменів (віртуальний хостинг), і сервер розрізняє їх за іменем.
DNS зберігає не тільки адреси. Дані живуть у вигляді записів (records) різних типів.
| Тип запису | Що зберігає |
|---|---|
A | IPv4-адресу для імені |
AAAA | IPv6-адресу для імені |
CNAME | Псевдонім (alias): «це імʼя = те імʼя» |
NS | Які сервери авторитетні для зони |
MX | Поштові сервери домену |
TXT | Довільний текст (верифікація домену, SPF тощо) |
Як DNS резолвить домен: покроково
Припустимо, тест уперше відкриває app.example.com, і жодного кешу ще немає. Спрощено відбувається таке.
- Застосунок питає операційну систему. Бібліотека всередині браузера чи Node.js викликає системний резолвер (stub resolver) — «дай IP для
app.example.com». - Запит іде до рекурсивного резолвера (recursive resolver). Це сервер, який бере на себе всю чорнову роботу пошуку. Зазвичай це резолвер провайдера або публічний на кшталт
8.8.8.8(Google) чи1.1.1.1(Cloudflare). - Рекурсивний резолвер питає кореневі сервери (root servers). Ті не знають адреси
app.example.com, але кажуть: «за зону.comвідповідають ось ці TLD-сервери». - Резолвер питає TLD-сервери зони
.com. Ті теж не знають кінцевої адреси, але повертають: «за доменexample.comвідповідають ось ці авторитетні сервери (authoritative nameservers)». - Резолвер питає авторитетний сервер
example.com. Оцей уже знає точну відповідь і повертаєA-запис — реальний IP дляapp.example.com. - Відповідь повертається до застосунку, і браузер нарешті відкриває зʼєднання за отриманою адресою.
Ключова різниця в термінах: рекурсивний резолвер зобовʼязаний повернути кінцеву відповідь (він сам обходить усіх), а кожен кореневий/TLD/авторитетний сервер відповідає лише за свій шматок ієрархії і часто дає не адресу, а «referral» — вказівку, кого питати далі.
Кешування. Ходити щоразу по всьому ланцюжку — дорого й повільно, тому відповіді кешуються на кількох рівнях: у браузері, в операційній системі, у рекурсивному резолвері. Другий і наступні запити на те саме імʼя віддаються з кешу майже миттєво.
TTL (Time To Live). Кожен DNS-запис несе TTL — число секунд, скільки відповідь дозволено тримати в кеші. Побачити його можна прямо у відповіді:
$ dig +noall +answer app.example.com
app.example.com. 300 IN A 93.184.216.34
Тут 300 — це TTL: запис живе 300 секунд (IN — клас Internet, A — тип запису). Поки TTL не вичерпано, використовується кешоване значення; після — запис перезапитують. TTL — це компроміс: великий TTL зменшує навантаження й прискорює відповіді, малий дає змогу швидко перемкнути трафік на нову адресу.
Чому це важить для автотестів:
- Якщо тестове середовище нещодавно змінило IP, а десь у ланцюжку живе старий запис із довгим TTL, тести можуть стукати за застарілою адресою — і «падати» без видимої причини в застосунку.
- Файл hosts на CI-раннері або локально дозволяє жорстко привʼязати домен до потрібного IP в обхід DNS. Це зручно, щоб направити тести на конкретний стенд, але легко забути й отримати загадкову поведінку.
- Час на резолвінг першого запиту додається до часу відкриття сторінки. У flaky-тестах, чутливих до таймінгів, «холодний» DNS іноді і є причиною випадкового перевищення таймауту.
Порти: багато сервісів на одній адресі
IP-адреса веде до машини, але на машині одночасно працюють десятки програм. Порт (port) — це 16-бітне число (від 0 до 65535), яке визначає, до якого саме сервісу на цій машині йде зʼєднання. Аналогія: IP — це адреса будинку, порт — номер квартири.
Порти прийнято ділити на діапазони (класифікація IANA):
| Діапазон | Назва | Призначення |
|---|---|---|
| 0–1023 | Well-known (системні) | Стандартні сервіси (HTTP, HTTPS, SSH…) |
| 1024–49151 | Registered | Порти застосунків, зареєстровані за продуктами |
| 49152–65535 | Dynamic / ephemeral | Тимчасові порти клієнтських зʼєднань |
Ефемерні порти варто розуміти окремо: коли клієнт відкриває зʼєднання, ОС виділяє йому тимчасовий (ephemeral) порт як зворотну адресу. Кожне TCP-зʼєднання унікальне четвіркою «джерело-IP : джерело-порт → призначення-IP : призначення-порт», тому браузер може тримати багато паралельних зʼєднань до одного сервера — у кожного свій локальний порт. Важлива тонкість: фактичний ефемерний діапазон залежить від ОС і часто відрізняється від рекомендованого IANA 49152–65535. У Linux за замовчуванням це 32768–60999 (керується параметром net.ipv4.ip_local_port_range), тож на цільовій системі його варто перевіряти, а не покладатися на теоретичні межі.
Типові порти, які AQA бачить постійно:
| Порт | Протокол / сервіс |
|---|---|
| 80 | HTTP |
| 443 | HTTPS |
| 22 | SSH |
| 53 | DNS |
| 25 | SMTP (пошта) |
| 3306 | MySQL |
| 5432 | PostgreSQL |
| 6379 | Redis |
| 27017 | MongoDB |
| 8080 | Часто альтернативний HTTP (dev-сервери, проксі) |
Перевірити, хто зайняв порт локально чи чи відкритий він на віддаленому хості, можна прямо з термінала:
# Який процес слухає порт 3000 локально
$ lsof -i :3000
# Чи відкритий порт на віддаленому хості
$ nc -zv app.example.com 443
Синтаксис host:8080
Адресу сервісу записують як host:порт, де двокрапка відділяє порт:
localhost:8080
127.0.0.1:3000
db.internal:5432
У складі URL це виглядає так:
http://localhost:8080/api/health
https://app.example.com/login
Важлива деталь: для стандартних схем порт можна не писати, бо він мається на увазі за замовчуванням — 80 для http і 443 для https. Тобто https://example.com і https://example.com:443 — те саме. А ось dev-сервер на 8080 треба вказувати явно, інакше браузер піде на 80 і зʼєднання не відбудеться.
Порти — часте джерело нестабільності в CI. Якщо тест піднімає локальний сервер на фіксованому порту, а той уже зайнятий іншим процесом (наприклад, попереднім прогоном, що не завершився), запуск падає з address already in use. Тому багато фреймворків або підбирають вільний порт динамічно, або вимагають чистого стану між прогонами — це прямий вияв принципу ізоляції стану між тестами.
Домен vs IP: імʼя і адреса — різні речі
Домен (app.example.com) — це людиночитане імʼя; IP — числова адреса, куди реально йде трафік. Звʼязок між ними не «один до одного»:
- Один домен → багато IP. DNS може повертати кілька адрес, і трафік розподіляється між серверами (балансування).
- Багато доменів → один IP. На одному сервері живуть десятки сайтів; сервер розрізняє їх за іменем, яке клієнт повідомляє в запиті (для HTTP — заголовок
Host, для HTTPS — розширення SNI під час встановлення шифрованого зʼєднання). - Той самий домен → різні IP у різних місцях. Геораспределені мережі (CDN) віддають різним користувачам різні адреси залежно від їхнього розташування.
Практичний висновок для тестів: якщо звертатися напряму за IP замість домену, можна не потрапити на потрібний віртуальний хост або зламати перевірку сертифіката (сертифікат виданий на імʼя, а не на IP). І навпаки — підмінивши в hosts домен на IP конкретного стенда, можна детерміновано спрямувати всі тести саме туди, обійшовши балансування й CDN.
TCP: надійний транспорт під HTTP
Знайти адресу — замало; треба ще надійно доставити дані. Цим займається транспортний рівень, і головний його представник для вебу — TCP (Transmission Control Protocol).
TCP дає застосунку надійний, упорядкований потік байтів. За цими словами стоять конкретні гарантії:
- Надійність (reliability): якщо пакет загубився, TCP помітить це (через відсутність підтвердження) і надішле його знову.
- Порядок (ordering): пакети можуть прийти врозбій, але TCP збере їх у правильній послідовності, перш ніж віддати застосунку.
- Контроль потоку й перевантаження (flow / congestion control): TCP підлаштовує швидкість, щоб не завалити ні приймача, ні мережу.
Саме тому HTTP/1.1 і HTTP/2 працюють поверх TCP: вебу потрібна впевненість, що HTML, JSON і зображення прийдуть цілими й у правильному порядку. HTTP/3 — виняток: він побудований на QUIC поверх UDP, але надійність і впорядкування там реалізовані власними засобами протоколу QUIC.
TCP vs UDP
UDP (User Datagram Protocol) — другий важливий транспорт. Він робить мінімум: шле пакети (датаграми) без встановлення зʼєднання й без гарантій.
| Властивість | TCP | UDP |
|---|---|---|
| Зʼєднання | Встановлюється (handshake) | Немає (connectionless) |
| Надійність доставки | Так, з перевідправкою | Ні, пакет може зникнути |
| Порядок пакетів | Гарантований | Не гарантований |
| Накладні витрати | Вищі | Нижчі |
| Затримка на старті | Більша (рукостискання) | Мінімальна |
| Типове застосування | HTTP/1.1 і /2, пошта, передача файлів | DNS-запити, відео/аудіо в реальному часі, ігри, QUIC/HTTP3 |
Логіка вибору проста: коли важлива цілісність — беруть TCP; коли важлива швидкість і невеликі втрати терпимі (жива відеотрансляція, де перепитувати старий кадр немає сенсу) — беруть UDP. DNS, до речі, зазвичай ходить по UDP на порт 53, а на TCP переходить для великих відповідей (коли UDP-відповідь не вміщується й приходить із прапорцем «truncated») і для передачі зон між серверами.
TCP-рукостискання (three-way handshake)
Перш ніж передати хоч байт корисних даних, TCP встановлює зʼєднання за три кроки — це «трикрокове рукостискання» (three-way handshake):
Клієнт ── SYN ─────────────▶ Сервер (хочу зʼєднатися)
Клієнт ◀───── SYN-ACK ────── Сервер (згоден, і я теж хочу)
Клієнт ── ACK ─────────────▶ Сервер (підтверджую, працюємо)
- SYN (synchronize) — клієнт просить зʼєднання й повідомляє свій початковий номер послідовності.
- SYN-ACK — сервер підтверджує запит клієнта і надсилає свій номер послідовності.
- ACK (acknowledge) — клієнт підтверджує, після чого канал готовий до передачі даних.
Для HTTPS поверх цього ще накладається рукостискання TLS — обмін ключами для шифрування. Тобто до першого корисного байта встигає пройти кілька обмінів «туди-назад» (round trips).
Чому це критично для AQA: кожне рукостискання — це затримка. На повільному або далекому каналі відкриття першого зʼєднання відчутно довше за наступні запити тим самим зʼєднанням, яке TCP і HTTP намагаються перевикористати (keep-alive, а в HTTP/2 — ще й мультиплексування кількох запитів в одному зʼєднанні). Звідси часта картина: перший крок тесту повільніший за решту, а перший прогін «холодний». Якщо таймаути виставлені без запасу на встановлення зʼєднання, це прямий шлях до мигання тестів.
Затримка vs пропускна здатність (latency vs bandwidth)
Дві характеристики каналу, які легко сплутати, а вони про різне.
- Затримка (latency) — час, за який дані доходять від точки до точки. Часто міряють як RTT (round-trip time) — час на подорож «туди й назад». Одиниця — мілісекунди.
- Пропускна здатність (bandwidth) — скільки даних канал здатен пропустити за одиницю часу. Одиниця — мегабіти за секунду (Mbps) і подібні.
Класична аналогія — труба. Пропускна здатність — це діаметр труби (скільки води проходить за секунду), а затримка — це довжина труби (скільки часу перша крапля летить до виходу). Широка труба не зробить коротшою подорож однієї краплі; тому канал може мати величезну пропускну здатність і водночас велику затримку (типовий приклад — супутниковий інтернет).
Для тестів це розрізнення прикладне:
- Дії з багатьма дрібними запитами (типовий вебзастосунок з купою API-викликів) страждають насамперед від затримки: кожен запит платить свій RTT, і вони складаються.
- Завантаження великих файлів чи медіа впирається у пропускну здатність.
- Емуляція мережі в браузері (throttling) дозволяє штучно підняти затримку чи обрізати смугу й перевірити, чи не розсипаються тести й UI на повільному звʼязку. Це корисний спосіб відтворити flaky-поведінку, яка на швидкій машині розробника ніколи не виникає.
Proxy: посередник у мережі
Проксі (proxy) — це сервер-посередник, через який іде трафік замість прямого шляху «клієнт → сервер». Клієнт звертається до проксі, а той уже говорить із цільовим сервером від свого імені і повертає відповідь. Розрізняють два напрямки:
- Прямий проксі (forward proxy) стоїть з боку клієнта. Через нього виходять у мережу співробітники компанії; він може кешувати, фільтрувати, логувати, обмежувати доступ.
- Зворотний проксі (reverse proxy) стоїть перед серверами з боку сервісу. Він приймає зовнішні запити й розподіляє їх між внутрішніми серверами, термінує TLS, кешує статику. Приклади — nginx, HAProxy.
Оскільки проксі бачить увесь трафік, що крізь нього йде, він може його не лише передавати, а й інспектувати та змінювати. Саме на цьому будується найважливіший для AQA сценарій: перехоплювальний проксі (intercepting proxy) на кшталт mitmproxy, Charles або Fiddler дозволяє побачити реальні запити й відповіді, підмінити їх, зімітувати помилку сервера, уповільнити відповідь.
Той самий принцип вбудований у фреймворки автотестів — тільки перехоплення відбувається всередині браузера, без окремого інструмента. У Playwright це page.route:
// Перехопити запит до API і повернути фейкову відповідь
await page.route('**/api/user', route =>
route.fulfill({
status: 200,
contentType: 'application/json',
body: JSON.stringify({ id: 1, name: 'Test User' }),
})
);
// Зімітувати падіння бекенда
await page.route('**/api/orders', route => route.fulfill({ status: 500 }));
Практичне застосування в тестуванні: замокати відповідь бекенда, щоб тест UI не залежав від реальних даних; відтворити рідкісний стан (500-та помилка, порожня видача, таймаут через route.abort()); ізолювати тест від нестабільного зовнішнього сервісу. Усе це — способи прибрати зовнішні джерела флаку й зробити перевірку детермінованою.
VPN: що він робить із трафіком
VPN (Virtual Private Network) створює зашифрований «тунель» між твоєю машиною і VPN-сервером. Трафік іде так: застосунок → зашифрований тунель → VPN-сервер → цільовий сайт, і назад тим самим шляхом. Що це дає на практиці:
- Шифрування на ділянці до VPN-сервера. Локальна мережа й провайдер бачать лише факт зʼєднання з VPN, а не куди й що ти шлеш. Це головна причина користуватися VPN у ненадійних мережах (публічний Wi-Fi).
- Підміна видимої адреси. Для цільового сайту джерелом запиту виглядає VPN-сервер, а не ти. Звідси зміна видимого географічного розташування — корисно, щоб протестувати геозалежну поведінку (мова, ціни, доступність контенту, редиректи).
- Доступ до закритих мереж. Корпоративний VPN пускає в приватну мережу компанії, де живуть внутрішні тестові стенди, недоступні з публічного інтернету.
Чого VPN не робить: він не робить тебе анонімним і не шифрує все на всьому шляху — після VPN-сервера трафік іде до сайту звичайним чином (захищений уже своїм TLS, якщо це HTTPS). Сам VPN-сервер бачить твій трафік у міру того, що не зашифроване протоколом вищого рівня.
Для AQA VPN зʼявляється у двох ролях. По-перше, доступ до внутрішніх стендів — без нього тести просто не достукаються до цільового середовища, і це варто закладати в налаштування CI. По-друге, VPN сам може стати джерелом флаку: він додає затримку (трафік робить гак через VPN-сервер) і власну точку відмови. Якщо тести подеколи падають по таймауту саме коли ввімкнено VPN — це серйозний кандидат у підозрювані, а не «магія мережі».
Як усе поєднується в одному відкритті сторінки
Щоб зібрати картину, простежимо https://app.example.com/login від початку до кінця:
- Браузер бере імʼя
app.example.comі через DNS отримує IP (з кешу або повним рекурсивним обходом; TTL визначає свіжість). - За IP і портом
443(бо схемаhttps) відкривається TCP-зʼєднання трикроковим рукостисканням SYN / SYN-ACK / ACK. - Поверх TCP проходить TLS-рукостискання; клієнт через SNI повідомляє потрібне імʼя хоста (важливо для віртуального хостингу).
- Лише тепер летить власне HTTP-запит на
/login, і повертається відповідь. - Якщо між клієнтом і сервером стоїть проксі чи VPN — трафік проходить крізь них, додаючи затримку й, можливо, змінюючи чи інспектуючи вміст.
Кожна ланка — потенційне джерело затримки. Розкласти час по цих етапах допомагає curl:
$ curl -w "dns=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} ttfb=%{time_starttransfer}\n" \
-o /dev/null -s https://app.example.com/login
dns=0.031 connect=0.052 tls=0.108 ttfb=0.216
Тут видно кожен шар окремо: dns — резолвінг імені, connect — TCP-рукостискання (наростаючим підсумком від старту), tls — завершення TLS, ttfb — прихід першого байта відповіді. Всі ці значення відлічуються від старту запиту, тому кожне наступне включає попереднє. Розуміючи, де саме зупиняється або гальмує запит (DNS не відрезолвився? порт закритий? рукостискання довге? VPN додав RTT?), AQA-інженер діагностує flaky-тест не навмання, а прицільно — і будує очікування, ізоляцію стану й перехоплення мережі, спираючись на те, як цей шар справді працює.
Що таке IP-адреса і навіщо вона потрібна?
IP-адреса — це числовий ідентифікатор вузла в мережі, за яким пакети даних знаходять дорогу до потрібного компʼютера. Аналогія проста: як лист знаходить будинок за поштовою адресою, так пакет знаходить машину за IP. Домени, порти й протоколи вищого рівня — це надбудова: на мережевому рівні маршрутизація йде саме за IP. Для тестувальника це означає, що будь-який запит із тесту зрештою летить на конкретну IP-адресу, навіть якщо в конфігу написано красиве імʼя app.example.com.
Чим відрізняються IPv4 та IPv6?
Це дві версії протоколу IP з різною довжиною адреси. IPv4 використовує 32 біти й записується як чотири десяткові октети від 0 до 255 через крапку (192.168.0.14) — це дає приблизно 4,3 мільярда адрес, яких сучасному інтернету не вистачає. IPv6 використовує 128 біт і записується як вісім груп шістнадцяткових цифр через двокрапку, зі скороченнями: провідні нулі опускають, а один ланцюжок нульових груп згортають до :: (наприклад, 2001:db8:85a3::8a2e:370:7334). Дефіцит IPv4-адрес породив NAT і сам перехід на IPv6, де адрес вистачає з величезним запасом. Багато вузлів сьогодні двостекові (dual-stack): мають обидві адреси, і клієнт пробує їх майже паралельно за алгоритмом Happy Eyeballs — з невеликою перевагою для IPv6.
Що таке localhost і чим він відрізняється від 127.0.0.1?
localhost — це імʼя, яке за угодою резолвиться в loopback-адресу: 127.0.0.1 для IPv4 або ::1 для IPv6, тобто «сам до себе». Відповідність зазвичай прописана в системному файлі hosts, тому працює навіть без DNS. Loopback означає, що трафік не виходить за межі машини: сервіс на 127.0.0.1:3000 видно лише зсередини цієї машини чи контейнера. В автотестах localhost — типовий baseURL для локально піднятого застосунку, і саме тут ховається класична пастка «у мене працює, а в CI ні», коли сервіс у контейнері слухає loopback замість усіх інтерфейсів.
Що таке DNS і яку проблему він вирішує?
DNS (Domain Name System) — розподілена ієрархічна система, що перекладає доменні імена в IP-адреси, як телефонний довідник перекладає імʼя в номер. Але зручність запамʼятовування — не єдина мета: DNS розвʼязує звʼязок «імʼя — адреса», і цей рівень непрямості дає гнучкість. Один сайт може стояти за багатьма IP (балансування навантаження), адресу сервера можна змінити, не чіпаючи імені, а за одним IP можуть жити десятки доменів. Крім адрес, DNS зберігає й інші записи: A (IPv4), AAAA (IPv6), CNAME (псевдонім), MX (пошта), NS (авторитетні сервери зони), TXT (довільний текст для верифікації домену тощо).
Що таке порт і навіщо він потрібен, якщо вже є IP-адреса?
IP-адреса веде до машини, але на машині одночасно працюють десятки програм — порт визначає, до якого саме сервісу йде зʼєднання. Це 16-бітне число від 0 до 65535; аналогія: IP — адреса будинку, порт — номер квартири. IANA ділить порти на діапазони: 0–1023 — well-known (системні сервіси), 1024–49151 — registered (порти застосунків), 49152–65535 — динамічні/ефемерні для клієнтських зʼєднань. Типові номери варто знати напамʼять: 80 — HTTP, 443 — HTTPS, 22 — SSH, 53 — DNS, 5432 — PostgreSQL, 6379 — Redis, 8080 — альтернативний HTTP для dev-серверів. Локально перевірити, хто зайняв порт, можна командою lsof -i :3000, а доступність порту на віддаленому хості — nc -zv host 443.
Чому https://example.com і https://example.com:443 — це те саме?
Для стандартних схем порт мається на увазі за замовчуванням: 80 для http і 443 для https, тому його можна не писати. Браузер сам підставляє потрібний порт, виходячи зі схеми URL. А ось нестандартний порт треба вказувати явно: якщо dev-сервер слухає 8080, а в тесті написано просто http://localhost, браузер піде на порт 80 і зʼєднання не відбудеться. Це типова причина «сервер запущений, а тест не конектиться» — варто першим ділом звірити порт у baseURL з портом, який реально слухає процес.
Розкажи покроково, як DNS резолвить домен, коли кешу ще немає.
Застосунок через системний stub resolver питає рекурсивний резолвер (провайдерський або публічний на кшталт 8.8.8.8 чи 1.1.1.1) — і далі той бере всю чорнову роботу на себе. Резолвер питає кореневі сервери, ті не знають кінцевої адреси, але вказують TLD-сервери зони .com; TLD-сервери відсилають до авторитетних серверів домену example.com; авторитетний сервер повертає A-запис із реальним IP. Відповідь їде назад до застосунку й осідає в кешах — браузера, ОС, самого резолвера, — тому наступні запити віддаються майже миттєво. Ключова різниця в термінах: рекурсивний резолвер зобовʼязаний дійти до кінцевої відповіді, а кореневі/TLD/авторитетні сервери відповідають лише за свій шматок ієрархії і часто повертають referral — «питай далі отам». Для тестів наслідок практичний: «холодний» перший резолв додає час до відкриття сторінки, і на тісних таймаутах це вже привід для flaky.
Що таке TTL у DNS-записі й до яких проблем він призводить у тестових середовищах?
TTL (Time To Live) — число секунд, скільки DNS-відповідь дозволено тримати в кеші; поки TTL не вичерпано, використовують кешоване значення, після — перезапитують. Побачити його можна у відповіді dig +noall +answer app.example.com — число поруч із типом запису. TTL — компроміс: великий зменшує навантаження й пришвидшує відповіді, малий дає швидко перемкнути трафік на нову адресу. Практична проблема: якщо тестовий стенд нещодавно змінив IP, а десь у ланцюжку кешів живе старий запис із довгим TTL, тести стукають за застарілою адресою й падають без видимої причини в застосунку. Обхідний шлях — прописати домен у файл hosts на CI-раннері, але про такий запис легко забути й потім довго дивуватись загадковій поведінці.
Чим відрізняються TCP і UDP? Коли обирають один, а коли інший?
TCP дає надійний упорядкований потік байтів: встановлює зʼєднання рукостисканням, перевідправляє загублені пакети, збирає їх у правильному порядку, контролює швидкість (flow/congestion control) — ціною вищих накладних витрат і затримки на старті. UDP робить мінімум: шле датаграми без зʼєднання й без гарантій — пакет може зникнути або прийти не по черзі, зате швидко. Логіка вибору: важлива цілісність — TCP (HTTP/1.1 і HTTP/2, пошта, файли); важлива швидкість і невеликі втрати терпимі — UDP (живе відео, де перепитувати старий кадр немає сенсу, ігри). DNS зазвичай ходить по UDP на порт 53, а на TCP переходить для великих відповідей (з прапорцем truncated) і передачі зон. Окремий випадок — HTTP/3: він працює поверх QUIC на UDP, але надійність і впорядкування QUIC реалізує власними засобами.
Що таке трикрокове TCP-рукостискання і чому воно важливе для швидкості тестів?
Перш ніж передати хоч байт даних, TCP встановлює зʼєднання за три кроки: клієнт шле SYN (хочу зʼєднатися, ось мій початковий номер послідовності), сервер відповідає SYN-ACK (згоден, ось мій номер), клієнт підтверджує ACK — і канал готовий. Для HTTPS поверх цього накладається ще TLS-рукостискання з обміном ключами, тож до першого корисного байта проходить кілька round trips. Кожне рукостискання — це затримка, помножена на відстань до сервера, тому відкриття першого зʼєднання помітно довше за наступні запити тим самим зʼєднанням (keep-alive, а в HTTP/2 — ще й мультиплексування). Звідси типова картина в автотестах: перший крок повільніший за решту, перший прогін «холодний», і якщо таймаути виставлені без запасу на встановлення зʼєднання — тести миготять.
У чому різниця між доменом та IP-адресою? Чи завжди це «один до одного»?
Домен — людиночитане імʼя, IP — числова адреса, куди реально йде трафік, і звʼязок між ними не один-до-одного. Один домен може резолвитись у багато IP (балансування навантаження між серверами), багато доменів можуть жити на одному IP (віртуальний хостинг — сервер розрізняє їх за іменем із заголовка Host або SNI), а той самий домен у різних місцях світу дає різні IP (CDN). Практичний висновок для тестів двобічний. Якщо звертатися напряму за IP замість домену, можна не потрапити на потрібний віртуальний хост або зламати перевірку сертифіката — він виданий на імʼя, а не на IP. І навпаки: підмінивши в hosts домен на IP конкретного стенда, можна детерміновано спрямувати всі тести саме туди, обійшовши балансування й CDN.
Сервіс піднято на 127.0.0.1:3000 — локально тести проходять, а в CI в контейнері не достукуються. У чому справа?
Це класична плутанина між 127.0.0.1 та 0.0.0.0. Адреса 127.0.0.1 — loopback: сервер, що слухає її, приймає зʼєднання лише зсередини тієї самої машини або контейнера. 0.0.0.0 означає «слухати всі інтерфейси» — такий сервер доступний і ззовні контейнера. Коли тести й застосунок живуть в окремих контейнерах CI, сервіс на loopback для сусіднього контейнера просто не існує — зʼєднання відхиляється, хоча локально (де все в одній машині) усе працює. Рішення — запускати сервіс під тести на 0.0.0.0 або зводити тести й застосунок в один мережевий простір; головне — розуміти, що це не «магія CI», а детермінована поведінка адрес.
Що таке приватні діапазони IP-адрес і NAT?
Діапазони 10.0.0.0/8, 172.16.0.0/12 і 192.168.0.0/16 — приватні: вони не маршрутизуються в публічному інтернеті й використовуються в домашніх, офісних і CI-мережах, у docker-мережах. Запис через скісну риску — CIDR-нотація: число після риски каже, скільки старших біт зафіксовано як префікс мережі; /16 лишає 16 біт під адреси вузлів — приблизно 65 тисяч. Щоб машина з приватної мережі вийшла назовні, роутер підміняє її адресу на свою публічну — це NAT (Network Address Translation), один із механізмів, завдяки яким IPv4 досі живий попри дефіцит адрес. Для AQA це буденність: тестові стенди часто живуть у приватних мережах, і достукатися до них із публічного інтернету без VPN неможливо — це треба закладати в налаштування CI.
Що таке ефемерні порти і чому браузер може тримати багато зʼєднань до одного сервера?
Коли клієнт відкриває зʼєднання, ОС виділяє йому тимчасовий (ephemeral) порт як зворотну адресу. Кожне TCP-зʼєднання унікальне четвіркою «джерело-IP : джерело-порт — призначення-IP : призначення-порт», тому браузер спокійно тримає багато паралельних зʼєднань до одного сервера: у кожного свій локальний порт, і четвірки не збігаються. Тонкість, яку цінують на співбесідах рівня senior: фактичний ефемерний діапазон залежить від ОС і часто відрізняється від рекомендованого IANA 49152–65535 — у Linux за замовчуванням це 32768–60999, керується параметром net.ipv4.ip_local_port_range. Тож на цільовій системі діапазон варто перевіряти, а не покладатися на теоретичні межі. Суміжна CI-проблема — фіксований порт сервера: якщо попередній прогін не завершився і порт зайнятий, запуск падає з address already in use, тому фреймворки або підбирають вільний порт динамічно, або вимагають чистого стану між прогонами.
Чим затримка (latency) відрізняється від пропускної здатності (bandwidth)?
Затримка — час, за який дані доходять від точки до точки (часто міряють як RTT, round-trip time, у мілісекундах); пропускна здатність — скільки даних канал пропускає за одиницю часу (Mbps). Аналогія з трубою: пропускна здатність — діаметр (скільки води за секунду), затримка — довжина (скільки летить перша крапля); широка труба не скоротить подорож однієї краплі, тому канал може мати величезну смугу й водночас велику затримку — типовий приклад, супутниковий інтернет. Для тестів розрізнення прикладне: сценарії з багатьма дрібними API-викликами страждають насамперед від затримки (кожен запит платить свій RTT, і вони складаються), а завантаження великих файлів впирається у смугу. Емуляція мережі в браузері (throttling) дозволяє штучно підняти затримку чи обрізати смугу — корисний спосіб відтворити flaky-поведінку, яка на швидкій машині розробника ніколи не виникає.
Що таке проксі? Чим forward proxy відрізняється від reverse proxy і як проксі використовують у тестуванні?
Проксі — сервер-посередник: клієнт звертається до нього, а він говорить із цільовим сервером від свого імені й повертає відповідь. Прямий проксі (forward) стоїть з боку клієнта — через нього виходять у мережу, він кешує, фільтрує, логує. Зворотний (reverse) стоїть перед серверами сервісу — приймає зовнішні запити, розподіляє їх між внутрішніми серверами, термінує TLS, кешує статику; приклади — nginx, HAProxy. Оскільки проксі бачить увесь трафік, він може його інспектувати та змінювати — на цьому будується головний сценарій для AQA: перехоплювальний проксі (mitmproxy, Charles, Fiddler) показує реальні запити й відповіді та дозволяє їх підмінити. Той самий принцип вбудований у фреймворки автотестів: у Playwright page.route перехоплює запит усередині браузера й через route.fulfill повертає фейкову відповідь чи імітує 500-ту, а route.abort — обрив мережі. Усе це — способи прибрати зовнішні джерела флаку й зробити перевірку детермінованою.
Що робить VPN із трафіком і чого він не робить? Як VPN впливає на автотести?
VPN створює зашифрований тунель між машиною і VPN-сервером: локальна мережа й провайдер бачать лише факт зʼєднання з VPN, а для цільового сайту джерелом запиту виглядає VPN-сервер, а не ти. Це дає три речі: захист у ненадійних мережах, підміну видимого географічного розташування (корисно тестувати геозалежну поведінку — мову, ціни, редиректи) і доступ до закритих корпоративних мереж із внутрішніми стендами. Чого VPN не робить: не дає анонімності й не шифрує весь шлях — після VPN-сервера трафік іде до сайту звичайним чином, захищений хіба що власним TLS. Для AQA VPN виступає у двох ролях: без нього тести часто просто не достукаються до внутрішнього середовища, але водночас він сам — джерело флаку, бо додає затримку (трафік робить гак) і власну точку відмови. Якщо тести падають по таймауту саме з увімкненим VPN — це серйозний кандидат у підозрювані, а не «магія мережі».
Як за одним IP можуть жити десятки HTTPS-сайтів? Що таке SNI?
Сервер розрізняє домени за іменем, яке клієнт повідомляє в запиті — це віртуальний хостинг. Для звичайного HTTP імʼя їде в заголовку Host, але з HTTPS є проблема: сертифікат треба підібрати ще до того, як зашифрований канал встановлено і будь-які заголовки взагалі відправлено. Тому в TLS існує розширення SNI (Server Name Indication): клієнт повідомляє потрібне імʼя хоста прямо під час TLS-рукостискання, і сервер обирає правильний сертифікат та віртуальний хост. Практичний наслідок для тестів: якщо звертатися до сервера напряму за IP, SNI не передасть очікуване імʼя — можна потрапити не на той віртуальний хост або зловити помилку перевірки сертифіката, бо сертифікат виданий на імʼя, а не на IP.
Що відбувається, коли ти відкриваєш https://app.example.com/login? Розклади по етапах.
Спершу браузер перетворює імʼя на адресу: DNS-резолв із кешу або повним рекурсивним обходом (root — TLD — авторитетний сервер), свіжість визначає TTL. Далі за отриманим IP і портом 443 (бо схема https) відкривається TCP-зʼєднання трикроковим рукостисканням SYN / SYN-ACK / ACK. Поверх TCP проходить TLS-рукостискання, де клієнт через SNI повідомляє імʼя хоста — критично для віртуального хостингу. Лише тепер летить власне HTTP-запит GET /login і повертається відповідь. Якщо на шляху стоїть проксі чи VPN — трафік іде крізь них, додаючи затримку й, можливо, змінюючи вміст. Сильна відповідь підкреслює висновок для AQA: кожна ланка — потенційне джерело затримки та флаку, і розуміння цього ланцюжка дозволяє діагностувати повільний чи мигаючий тест прицільно, а не навмання.
Тест періодично падає по таймауту на першому кроці. Як зʼясувати, який саме мережевий шар гальмує?
Треба розкласти час запиту по етапах, а не гадати. Найпростіший інструмент — curl із форматом виводу таймінгів: curl -w з плейсхолдерами time_namelookup, time_connect, time_appconnect, time_starttransfer показує окремо DNS-резолвінг, TCP-рукостискання, завершення TLS і час до першого байта відповіді. Важливо памʼятати, що всі значення відлічуються від старту запиту наростаючим підсумком, тому кожне наступне включає попереднє — дивитись треба на прирости між сусідніми. Типові знахідки: «холодний» DNS зʼїдає час першого запиту (кеш порожній, TTL вичерпано), рукостискання довге через далекий сервер чи VPN-гак, порт закритий — зʼєднання взагалі не встановлюється (перевіряється nc -zv host 443). Далі рішення підбирається під шар: запас у таймаутах на встановлення зʼєднання, hosts-привʼязка до конкретного стенда, перехоплення мережі в тесті замість залежності від нестабільного зовнішнього сервісу.
Три кейси, які показують мережевий шар у роботі AQA: розкладання часу відкриття сторінки на DNS / TCP / TLS через curl, боротьба з address already in use та 127.0.0.1 vs 0.0.0.0 при піднятті сервера під тест, і відтворення повільної мережі через перехоплення й throttling у Playwright. Скрізь — що дивитися і чому.
Кейс 1. Розкладаєш flaky-таймаут на шари через curl
Тест періодично падає по таймауту на першому кроці, а в застосунку жодної помилки. Перш ніж звинувачувати код, треба зрозуміти, ЯКА саме ланка гальмує: резолвінг імені, TCP-рукостискання, TLS чи вже відповідь бекенда. curl вміє відлічити кожен шар окремо:
curl -w "dns=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} ttfb=%{time_starttransfer}\n" \
-o /dev/null -s https://app.example.com/login
dns=0.031 connect=0.052 tls=0.108 ttfb=0.216
Що дивитися і чому:
- Значення наростають від старту.
connectуже міститьdns,tlsміститьconnectі так далі. Тому дивись не на абсолютні числа, а на різницю між сусідніми:connect − dns— це власне TCP-рукостискання,tls − connect— обмін ключами TLS,ttfb − tls— час, поки бекенд готував відповідь. - Великий
dns. «Холодний» резолвінг першого запиту додається до відкриття сторінки. Якщо тестове середовище нещодавно змінило IP, а десь у ланцюжку живе старий запис із довгим TTL — стукаєш за застарілою адресою. Повториdig +noall +answer app.example.comі глянь TTL та реальний IP. - Розрив на
connect. Порт закритий або зайнятий рукостисканням — а не бекенд. Перевір досяжність порту напряму:nc -zv app.example.com 443. - Великий розрив
tls − connect, а прирістttfb − tlsмалий. Проблема в TLS-рукостисканні (сертифікат, SNI), а не в застосунку — бекенд після рукостискання відповів швидко. - VPN у грі. Якщо
dns/connectстрибають саме коли ввімкнено VPN — трафік робить гак через VPN-сервер і додає RTT. Це кандидат у підозрювані, а не «магія мережі».
Висновок: якщо запас у таймауті менший за холодне DNS + рукостискання, тест зрізає ще живий запит. Це не баг застосунку — це занижений таймаут.
Кейс 2. address already in use і 127.0.0.1 vs 0.0.0.0 у CI
Багато e2e-наборів піднімають локальний сервер під тест на фіксованому порту. Дві типові пастки живуть саме тут.
Перша — порт зайнятий попереднім прогоном, що не завершився:
Error: listen EADDRINUSE: address already in use 127.0.0.1:3000
Хто тримає порт — видно локально:
lsof -i :3000
Друга пастка тонша: 127.0.0.1:3000 слухає лише loopback — «сам до себе», тобто видно лише всередині тієї ж машини чи контейнера. А 0.0.0.0:3000 слухає всі інтерфейси й доступний ззовні контейнера. Плутанина між ними — типова причина «у мене працює, а в CI ні»: тест у сусідньому контейнері не достукається до сервера, прив'язаного до loopback.
У Playwright обидві проблеми лікуються конфігом webServer:
// playwright.config.ts (фрагмент)
export default defineConfig({
use: { baseURL: 'http://localhost:3000' },
webServer: {
command: 'npm run start -- --host 0.0.0.0 --port 3000',
url: 'http://localhost:3000/health',
reuseExistingServer: !process.env.CI,
timeout: 60_000,
},
});
Що дивитися і чому:
url, а не фіксована пауза. Playwright опитуєhttp://localhost:3000/health, поки той не відповість, і лише тоді стартує тести. Це очікування за умовою — сервер може «прогріватися» довше на повільному CI, а тест не зривається завчасно.--host 0.0.0.0у контейнері. Прив'язка до всіх інтерфейсів, щоб раннер достукався. Локально ж127.0.0.1цілком достатньо.reuseExistingServer: !process.env.CI. Локально перевикористовуєш уже піднятий сервер (не ловишEADDRINUSEміж прогонами), а в CI щоразу піднімаєш чистий — прямий вияв ізоляції стану між тестами.localhostрезолвиться в loopback через файл hosts і працює навіть без DNS. Але не покладайся на це для доступу ЗЗОВНІ контейнера — там потрібна прив'язка до0.0.0.0.
Кейс 3. Відтворюєш повільну мережу перехопленням і throttling
Flaky-поведінка на таймінгах часто не відтворюється на швидкій машині розробника. Щоб зловити її свідомо, мережу треба або сповільнити, або замокати. Обидва інструменти вбудовані у Playwright.
Перехоплення прибирає залежність від нестабільного зовнішнього сервісу — перехоплення відбувається всередині браузера через page.route:
test('UI не розсипається, коли API повільний і бекенд падає', async ({ page }) => {
// штучна затримка перед фейковою відповіддю — імітуємо високий RTT
await page.route('**/api/user', async (route) => {
await new Promise((r) => setTimeout(r, 2000));
await route.fulfill({
status: 200,
contentType: 'application/json',
body: JSON.stringify({ id: 1, name: 'Test User' }),
});
});
// рідкісний стан — падіння бекенда 500
await page.route('**/api/orders', (route) => route.fulfill({ status: 500 }));
await page.goto('/dashboard');
await expect(page.getByText('Test User')).toBeVisible();
await expect(page.getByText('Не вдалося завантажити')).toBeVisible();
});
Що дивитися і чому:
- Затримка vs пропускна здатність. Штучний
setTimeoutпередfulfillімітує саме затримку (latency) — те, від чого страждають застосунки з купою дрібних API-викликів: кожен платить свій RTT, і вони складаються. Для важких файлів картина інша — там впираєшся в пропускну здатність, і мокати треба обсяг, а не паузу. - Патерн маршруту.
**/api/userмає ловити саме той запит, що робить фронтенд. Звір із реальним шляхом у Network — інакше перехоплення мовчки не спрацює, а тест «зелений» через хибну причину. - Очікування за умовою.
toBeVisible()чекає появу елемента, а не фіксовані мілісекунди. Штучні2000мс на бекенді — контрольований подразник; фіксовані паузи в самому тесті — те, що першим зрізає перевірку на повільнішому CI. - Емуляція мережі як інструмент. Той самий ефект дає throttling у DevTools: штучно піднімаєш затримку чи обрізаєш смугу й перевіряєш, чи не розсипаються тести й UI на повільному зв'язку — це спосіб відтворити флак, який на швидкій машині не виникає ніколи.
IP-адреси та адресація
- Знаю, що IP-адреса — числовий ідентифікатор вузла, за яким пакети знаходять дорогу; розумію різницю IPv4 (32 біти, октети 0–255) і IPv6 (128 біт, hex-групи, скорочення
::). - Памʼятаю ключові адреси: loopback (
127.0.0.1/::1),localhost, приватні діапазони (10.0.0.0/8,172.16.0.0/12,192.168.0.0/16),0.0.0.0як «усі інтерфейси». - Розумію різницю
127.0.0.1:3000(лише всередині машини/контейнера) vs0.0.0.0:3000(усі інтерфейси) — типова причина «у мене працює, а в CI ні». - Можу прочитати CIDR (
/16— кількість фіксованих старших біт префікса) і пояснити, що приватні адреси не маршрутизуються в інтернеті, а назовні їх випускає NAT.
DNS та резолвінг
- Можу пояснити, що DNS перекладає імена в IP, і що непрямість «імʼя ↔ адреса» дає балансування, зміну IP без зміни імені та віртуальний хостинг.
- Знаю типи записів:
A(IPv4),AAAA(IPv6),CNAME(alias),NS(авторитетні сервери),MX(пошта),TXT(довільний текст, верифікація). - Можу описати рекурсивний резолвінг: stub → рекурсивний резолвер → кореневі → TLD
.com→ авторитетний сервер, і що root/TLD дають referral, а не адресу. - Розумію кеш (браузер/ОС/резолвер) і TTL, і чому старий запис із довгим TTL чи «холодний» резолвінг першого запиту роблять тести flaky.
- Знаю, що файл hosts жорстко привʼязує домен до IP в обхід DNS — зручно спрямувати тести на стенд, але легко забути й отримати загадкову поведінку.
Порти, домен vs IP
- Можу пояснити, що порт — 16-бітне число (0–65535) для конкретного сервісу; знаю діапазони IANA й що фактичний ephemeral-діапазон залежить від ОС.
- Памʼятаю типові порти: 80 (HTTP), 443 (HTTPS), 22 (SSH), 53 (DNS), 25 (SMTP), 3306 (MySQL), 5432 (PostgreSQL), 6379 (Redis), 27017 (MongoDB), 8080.
- Розумію синтаксис
host:порті що для стандартних схем порт мається на увазі (80/443), а dev-порт8080треба вказувати явно; знаю причинуaddress already in useу CI. - Можу пояснити, що звʼязок «домен ↔ IP» не «один до одного» (балансування, віртуальний хостинг, CDN) і чому звертання за IP ламає віртуальний хост чи перевірку сертифіката; сервер розрізняє хости за
Host/ SNI.
TCP, UDP і транспорт
- Можу пояснити, що TCP дає надійний упорядкований потік байтів (перевідправка, порядок, контроль потоку), і знаю різницю TCP vs UDP (гарантії проти швидкості); HTTP/3 — це QUIC поверх UDP.
- Можу описати трикрокове рукостискання SYN → SYN-ACK → ACK і що для HTTPS зверху ще TLS-рукостискання — кілька round-trips до першого байта.
- Розумію, чому перший запит «холодний» і повільніший за наступні (keep-alive, мультиплексування HTTP/2), і чому тісні таймаути дають мигання тестів.
Затримка, проксі, VPN
- Можу розвести затримку (latency, RTT, мс) і пропускну здатність (bandwidth, Mbps): дрібні запити страждають від затримки, великі файли — від смуги; знаю, навіщо throttling у браузері.
- Можу розрізнити forward proxy (з боку клієнта) і reverse proxy (перед серверами: балансування, TLS, кеш; nginx, HAProxy) та пояснити принцип перехоплювального проксі й
page.routeу Playwright. - Можу пояснити, що робить VPN (тунель, підміна видимої адреси, доступ до закритих мереж) і чого НЕ робить (не анонімізує, не шифрує весь шлях), і що він сам додає затримку й точку відмови.
- Можу простежити відкриття
https://app.example.com/login(DNS → TCP на443→ TLS із SNI → HTTP на/login) і розкласти час по шарах черезcurl -w(time_namelookup,time_connect,time_appconnect,time_starttransfer).
Сервіс піднято на 127.0.0.1:3000. Локально тести проходять, а в CI падають з «connection refused». Чому найімовірніше?
Питання
Чим IPv4 відрізняється від IPv6 і чому взагалі зʼявився IPv6?