vyvchy
    Теми розділу

    03 · Веб і мережі для AQA

    DNS, IP, порти та мережа

    Зміст

    Коли автотест виконує page.goto('https://app.example.com/login'), за одним рядком стоїть кілька шарів, і кожен ламається окремо: імʼя треба перетворити на адресу, до адреси достукатися, на машині знайти потрібний сервіс, а поверх усього встановити зʼєднання. Якщо будь-яка ланка спрацьовує повільно або нестабільно, тест «мигає» (flaky) без жодної помилки в продуктовому коді.

    Ця глава — повний виклад теми на сайті, інші глави посилаються сюди по мережеву механіку. Мета одна: називати шар, на якому впав прогін, замість «щось із мережею». Побічна — розібрати чотири перекази, що звучать переконливо й розсипаються при першій звірці: «рекурсивний резолвер зобовʼязаний відповісти», «TTL — це симетричний компроміс», «DNS ходить по UDP, а на TCP переходить», «проксі буває прямий і зворотний». Далі в тексті вони пронумеровані в цьому ж порядку.

    IP-адреса: куди насправді йде запит

    IP-адреса (IP address) — числовий ідентифікатор вузла в мережі: саме за нею пакети знаходять дорогу до потрібного компʼютера. Але адреса веде лише до машини — що робити далі, вирішує вже порт.

    IPv4 використовує 32 біти, які записують як чотири десяткові октети від 0 до 255. IPv6 використовує 128 біт і записується як вісім груп по чотири шістнадцяткові цифри; провідні нулі в групі опускають, а один ланцюжок нульових груп згортають до :: — саме один, двічі в адресі він стояти не може.

    93.184.216.34
    2001:0db8:85a3:0000:0000:8a2e:0370:7334
    2001:db8:85a3::8a2e:370:7334

    Два класи адрес AQA бачить щодня:

    Адреса / діапазонЩо це
    127.0.0.1, ::1loopback — «ця сама машина»: трафік не виходить у мережу, а розвертається всередині
    10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16приватні мережі: у публічному інтернеті не маршрутизуються

    Запис /16 — це CIDR-нотація: число після скісної риски каже, скільки старших біт адреси фіксовані як префікс мережі, а решта відводиться під адреси вузлів. Назовні приватні адреси випускає NAT (Network Address Translation) — підміна приватної адреси на публічну адресу роутера.

    Багато вузлів сьогодні двостекові (dual-stack): мають і IPv4-, і IPv6-адресу. Клієнт пробує спочатку IPv6, а наступну спробу запускає з паузою, і паузу зроблено навмисно — «connection attempts SHOULD NOT be made simultaneously»; щойно одна вдалася, решту SHOULD скасувати. Для тестів це джерело плаваючих таймингів: на кривій IPv6-мережі перше зʼєднання «думає» довше, доки клієнт зробить на другу адресу.

    Чому localhost іноді підводить

    Класична підозра — «localhost резолвиться то в IPv4, то в IPv6». Резолв тут якраз однозначний: користувачі «may assume that IPv4 and IPv6 address queries for localhost names will always resolve to the respective IP loopback address», а бібліотекам резолву приписано SHOULD завжди повертати адресу loopback. За іменем доступні обидві адреси — і 127.0.0.1, і ::1.

    Пастка в іншому: яке сімейство адрес клієнт спробує першим. Двостековий клієнт шле обидва запити, причому AAAA першим, і якщо відповіді прийшли не в тому порядку, SHOULD перечекати паузу, щоб перевага лишилася за IPv6. Тому якщо застосунок слухає лише 127.0.0.1, а клієнт пішов на ::1, зʼєднання «незрозуміло чому» не встановлюється. Рятує явна адреса в конфігу — або прослуховування обох сімейств на сервері.

    // явна адреса замість імені прибирає питання, яке сімейство клієнт вибере першим
    export default defineConfig({
      use: { baseURL: 'http://127.0.0.1:3000' },
    });

    Порти: багато сервісів на одній адресі

    На машині одночасно працюють десятки програм, тож самої адреси мало. Порт (port) — 16-бітне число від 0 до 65535, яким TCP ідентифікує сервіси застосунків і веде кілька окремих потоків між тими самими хостами.

    Пара «адреса + порт» називається сокетом (socket), і головне тут — що зʼєднання визначає пара сокетів, локальний і віддалений. Саме тому браузер тримає багато паралельних зʼєднань до одного сервера: кожне унікальне четвіркою «джерело-IP : джерело-порт → призначення-IP : призначення-порт», а тимчасовий (ефемерний) порт клієнту видає операційна система.

    Порти прийнято ділити на діапазони:

    ДіапазонНазва за класифікацією IANA
    0–1023системні, вони ж well-known
    1024–49151користувацькі, вони ж registered
    49152–65535динамічні, вони ж private або ephemeral

    Фактичний ефемерний діапазон залежить від операційної системи, тож на цільовій машині його варто перевіряти, а не брати з таблиці. Типові порти, які AQA бачить постійно: 80 (HTTP), 443 (HTTPS), 22 (SSH), 53 (DNS), 3306 (MySQL), 5432 (PostgreSQL), 6379 (Redis), 27017 (MongoDB), 8080 (альтернативний HTTP і dev-сервери). Для стандартних схем порт можна не писати — мається на увазі типовий (80 для http, 443 для https), а нестандартний треба вказувати явно.

    Порт як компонент адреси розбирає глава «URL і кодування», як частину (origin) — «CORS і політика одного походження», а скільки зʼєднань браузер відкриває насправді — «HTTP/2 і HTTP/3: еволюція протоколу».

    Наша практика (не канон). Далі — те, як це виглядає в командах, з якими ми працювали; окремого стандарту під це немає. Сервіс, піднятий на 127.0.0.1:3000, видно лише всередині тієї самої машини чи , а піднятий на 0.0.0.0:3000 — на всіх інтерфейсах; плутанина між цими двома адресами і є типовою причиною «у мене працює, а в CI ні». Другий сюжет того ж класу: фіксований порт у тесті, зайнятий попереднім незавершеним прогоном, дає address already in use — тому фреймворки або підбирають вільний порт динамічно, або вимагають чистого стану між прогонами.

    DNS: від імені до адреси

    Люди мислять іменами, мережа маршрутизує за числами. DNS (Domain Name System) — розподілена ієрархічна система, що перекладає одне в інше; формально вона складається з простору імен із ресурсними записами, серверів імен і резолверів.

    Простір імен — дерево, де доменне імʼя вузла є послідовністю міток від нього до кореня, яку читають зліва направо: від найконкретнішої до найзагальнішої. Сервер імен тримає повні дані лише про частину дерева — свою зону, для якої він авторитетний; решту може мати в кеші й у відповіді позначає, звідки вона взялася. Зберігає DNS не тільки адреси:

    Тип записуЩо зберігає
    AIPv4-адресу для імені
    AAAAIPv6-адресу для імені
    CNAMEканонічне імʼя для псевдоніма
    NSавторитетні сервери зони
    MXпоштові сервери домену
    TXTдовільні текстові рядки

    Ланцюг резолюції

    Бібліотека резолюції операційної системи — це stub-резолвер: сам ієрархію він не обходить, а перекладає тягар на рекурсивний сервер імен у своїй або сусідній мережі.

    Авторитетний example.comTLD-сервери .comКореневі сервериРекурсивний резолверЗастосунок (stub)Авторитетний example.comTLD-сервери .comКореневі сервериРекурсивний резолверЗастосунок (stub)IP для app.example.com?Хто веде зону .com?Питай TLD-сервери .comХто веде example.com?Питай авторитетні сервериIP для app.example.com?A-записадресаАвторитетний example.comTLD-сервери .comКореневі сервериРекурсивний резолверЗастосунок (stub)Авторитетний example.comTLD-сервери .comКореневі сервериРекурсивний резолверЗастосунок (stub)IP для app.example.com?Хто веде зону .com?Питай TLD-сервери .comХто веде example.com?Питай авторитетні сервериIP для app.example.com?A-записадреса

    Тепер перший переказ. «Рекурсивний резолвер зобовʼязаний повернути кінцеву відповідь» — не так. Нерекурсивний режим must реалізувати кожен сервер імен, а рекурсивний названо optional: сервер may обмежити коло клієнтів і взагалі free to refuse надавати рекурсію. Та й серед допустимих рекурсивних відповідей джерело перелічує не лише відповідь чи name error, а й A temporary error indication. Справжня різниця режимів інша: рекурсивний сервер повертає помилку або відповідь, але ніколи не відсилання. Прикладний висновок — тимчасова помилка резолюції є легальною відповіддю, яку прогін має вміти пережити.

    Кеш, TTL і файл hosts

    Ходити щоразу по всьому ланцюжку дорого, тому відповіді кешуються: кеш відповідає з памʼяті попередніх результатів і так прибирає мережеву й навантаження на сервери імен, а для повносервісного резолвера локальний кеш із протуханням даних — нормативна вимога (MUST). Кешувати можна й негативні результати на кшталт «імені не існує».

    TTL (Time To Live) — межа того, скільки запис дозволено тримати в кеші, перш ніж відкинути. І тут другий переказ: TTL часто подають як симетричний вибір «великий — менше навантаження, малий — швидше перемикання». Джерело асиметричне: короткий TTL мінімізує , нульовий його забороняє, але «реалії продуктивності інтернету» дають орієнтир should be on the order of days for the typical host. Виняток названо окремо — якщо зміну можна передбачити, TTL знижують перед нею, а після повертають до колишнього значення. Тобто малий TTL є інструментом запланованого переїзду, а не станом за замовчуванням.

    Наслідок для AQA прямий: якщо стенд нещодавно змінив адресу, а десь у ланцюжку живе старий запис із довгим TTL, прогін стукає за застарілою адресою й падає без жодної причини в застосунку — і чекати доводиться саме TTL. Дрібніший наслідок теж коштує зелених прогонів: час резолвінгу першого запиту додається до часу відкриття сторінки, тож «холодний» DNS буває причиною випадкового перевищення .

    Локальна таблиця хостів (файл hosts) виглядає як спосіб це обійти, але формулювання специфікації варте уваги: вузол може мати таку таблицю «as a backup or supplement to the DNS», а питання пріоритету джерело лишає питанням конфігурації, а не сталим правилом. Практично: «я прописав у hosts, отже точно піде туди» — припущення, а не гарантія.

    Транспорт: UDP, TCP і 512 байтів

    Третій переказ: «DNS ходить по UDP на порт 53, а на TCP переходить для великих відповідей». Тут майже кожне слово має джерело — але не те, на яке зазвичай посилаються. RFC 1034 переваги транспорту не віддає взагалі: запити «are carried in UDP datagrams or over TCP connections». Перевагу дають інші документи — RFC 1035 називає датаграми переважнішими «due to their lower overhead and better performance», RFC 1123 формулює це як «UDP is preferred over TCP for queries». Далі три уточнення, які й ламають переказ:

    • Порт 53 — той самий для обох транспортів, а не «порт 53 — це UDP».
    • Обрізання нормовано. Повідомлення через UDP обмежене 512 байтами; довше обрізають із виставленим бітом TC, і якщо секція Answer обрізана, запитувач, який уміє TCP, SHOULD повторити запит по TCP.
    • Передача зони — вимога, а не «перехід». UDP «is not acceptable for zone transfers», а TCP «is always used for full zone transfers (using AXFR)».

    Чинну ж модальність задає RFC 7766, який оновлює обидва старі документи: «All general-purpose DNS implementations MUST support both UDP and TCP transport», а вимогу «спершу UDP» послаблено — резолвер MAY обрати транспорт із локальних міркувань. Наслідок буквальний: якщо в мережі стенду DNS-over-TCP заблоковано (типова «оптимізація» фаєрвола), великі відповіді не доходять, і джерело прямо називає результат — «resolution failure and/or application-level timeouts». У звіті це виглядає як таймаут застосунку, а причина лежить у конфігурації мережі.

    Домен і адреса: чому це не один до одного

    до адреси не взаємно однозначна, і кожен бік цієї несиметричності має наслідок для тестів.

    • Один домен → багато адрес. Вузол із кількома інтернет-адресами просто має кілька A-записів.
    • Багато доменів → одна адреса. Заголовок Host несе хост і порт із цільового URI й дає origin-серверу змогу розрізняти ресурси, обслуговуючи запити для кількох імен. Це і є віртуальний хостинг; користувацький агент MUST згенерувати Host, якщо не передає ту саму інформацію псевдозаголовком :authority.
    • Той самий домен → різні вузли в різних місцях. CDN (Content Delivery Network) — мережа проміжних серверів ближче до користувача, які тримають копії даних і віддають їх із найближчого вузла; CDN як спільний кеш розбирає глава «Кешування».

    Практичний висновок: звертання напряму за адресою замість домену може не потрапити на потрібний віртуальний хост і ламає перевірку сертифіката — клієнт MUST переконатися, що особа сервісу відповідає origin-серверу з URI. Сертифікати розбирає глава «HTTPS, TLS і безпека».

    TCP: надійний потік і ціна рукостискання

    Знайти адресу замало — дані треба ще й доставити. TCP (Transmission Control Protocol) дає застосункам надійний потік байтів зі збереженням порядку, і саме тому HTTP/1.1 та HTTP/2 працюють поверх нього: вебу потрібна впевненість, що HTML, JSON і зображення прийдуть цілими й у правильній послідовності.

    За цими словами стоять механізми. Потік їде сегментами, кожен окремою IP-датаграмою; втрати виявляються за номерами послідовності, помилки — за контрольними сумами, а виправляє їх повторна передача. Кожен байт має номер, тож підтвердження накопичувальне: ACK на X означає, що отримано всі октети до X, не включаючи сам X. Понад це TCP керує потоком і перевантаженням, щоб не завалити ні , ні мережу.

    ВластивістьTCPUDP
    Зʼєднаннявстановлюється рукостисканнямнемає
    Надійність доставкитак, із повторною передачеюні
    Порядокзбереженийне гарантований
    Накладні витративищінижчі
    Затримка на стартібільшамінімальна

    Ціну видно на старті. Перш ніж передати хоч байт корисних даних, TCP встановлює зʼєднання тристороннім (handshake): одна сторона ініціює, інша відповідає, і кроків саме три, бо підтвердження й власний SYN сервера обʼєднані в одне повідомлення.

    Клієнт  ── SYN ─────────────▶  Сервер     (хочу зʼєднатися)
    Клієнт  ◀───── SYN-ACK ──────  Сервер     (згоден, і я теж хочу)
    Клієнт  ── ACK ─────────────▶  Сервер     (підтверджую, працюємо)

    У цьому обміні сторони повідомляють одна одній початкові номери послідовності. Для HTTPS поверх нього накладається ще й рукостискання TLS, тож до першого корисного байта встигає пройти кілька обмінів «туди-назад»: механіку TLS розбирає глава «HTTPS, TLS і безпека», а рукостискання як стадію шляху запиту — «Життєвий цикл запиту». Виняток серед версій HTTP — HTTP/3: він побудований на QUIC поверх UDP, і надійність та впорядкування там реалізовані власними засобами QUIC.

    Затримка проти пропускної здатності

    Дві характеристики каналу, які постійно плутають, а вони про різне.

    Затримка (latency) — час, за який пакет даних долає шлях від джерела до призначення; її ж рахують як час від запиту користувача до повернення відповіді. Міряють її зазвичай від машини-запитувача до машини-відповідача і назад, тобто як round-trip delay: формально це інтервал від відправлення джерелом першого біта пакета до отримання ним останнього біта відповіді. (bandwidth) — міра того, скільки інформації може пройти крізь зʼєднання за заданий проміжок часу; вимірюють кратними бітам за секунду.

    Що це незалежні осі, видно з самого TCP: там існує добуток «пропускна здатність × затримка», і коли він великий, зʼявляються проблеми продуктивності — мережу з такими шляхами називають «long, fat network». Більшої пропускної здатності не досить: на таких шляхах вікно приймача обмежує обсяг непідтверджених даних, який TCP може відправити, щоб тримати «трубу» заповненою. Для тестів різниця прикладна:

    • Дії з багатьма дрібними запитами страждають від затримки. Затримка одного ресурсу здається дрібницею, але сторінка — це багато запитів; що їх більше, то дужче вона бʼє по користувацькому досвіду.
    • Завантаження великих файлів упирається в іншу характеристику. Фаза Receiving визначається сукупністю пропускної здатності мережі та розміру файла.
    • Перший запит платить більше. У його затримку входять DNS-пошук, TCP-рукостискання й узгодження TLS; наступні дешевші, бо зʼєднання вже встановлене — саме тому HTTP тримає його відкритим (keep-alive) і перевикористовує.
    • Не плутай мережеву затримку з дисковою. Дискова — час від отримання запиту сервером до повернення відповіді, у панелі це фаза Waiting; як на неї реагують очікування в тестах, розбирає глава «Практичні сценарії AQA: флак і синхронізація».

    Посередники: проксі, шлюз, тунель

    Четвертий переказ — «посередники бувають прямі й зворотні». HTTP називає три поширені форми (intermediary) — вузла, через який запити задовольняються «through a chain of connections», — і терміна forward proxy в специфікації немає взагалі.

    ФормаВизначальна ознака
    Проксі (proxy)агент пересилання, якого обирає клієнт — зазвичай локальними правилами конфігурації
    Шлюз (gateway), він же reverse proxyпосередник, який поводиться як origin-сервер для вихідного зʼєднання, а всередину пересилає запити іншим серверам
    Тунель (tunnel)сліпий ретранслятор між двома зʼєднаннями, який повідомлень не змінює

    Клієнт

    Проксі
    обрав клієнт

    Шлюз
    назовні = origin-сервер

    origin-сервер

    Клієнт

    Проксі
    обрав клієнт

    Шлюз
    назовні = origin-сервер

    origin-сервер

    Різниця не в тому, «з якого боку стоїть» вузол, а в тому, хто його обрав і як він поводиться. обирає клієнт — типово, щоб звести запити організації через спільного посередника заради безпекових сервісів, сервісів анотації або спільного кешу. назовні виглядає як origin-сервер, тому за ним живуть кешування-прискорювач та розділення або балансування навантаження між машинами: балансувальник тут є окремим випадком шлюзу, а не «ще одним видом проксі». в HTTP-обміні не бере участі взагалі й зникає, коли обидва кінці ретрансльованого зʼєднання закрито. Той самий вузол може перемикатися між ролями — і навіть бути origin-сервером — залежно від конкретного запиту.

    Окремий клас — вузли нижчих рівнів стека, що фільтрують або перенаправляють трафік без відома й дозволу відправника. Такий interception proxy відрізняється від звичайного проксі саме тим, що його не обирає клієнт, і специфікація оцінює його різко: на рівні протоколу він «indistinguishable (at a protocol level) from an on-path attacker». Уразливий він і сам — коли покладається на хост і порт як на ключ спільного кешу, не перевіривши, що перехоплене зʼєднання йде на валідну адресу цього хоста. Для AQA це робоча гіпотеза: якщо тест поводиться в офісній мережі інакше, ніж удома, між ним і сервером цілком може стояти вузол, якого ніхто не обирав.

    Два практичні хвости. 502 і 504 за означенням віддає сервер, що діє «as a gateway or proxy», тобто зламалася ланка за посередником, а 503 каже про сам сервер — значення кодів розбирає глава «HTTP статус-коди». І оскільки проксі бачить увесь трафік, він може його не лише передавати, а й інспектувати та змінювати: на цьому будується , вбудоване й у фреймворки автотестів — глава «Перехоплення й мокання мережі».

    Наостанок термін, який побутове означення зміщує. VPN (Virtual Private Network) — загальний термін для використання публічних або приватних мереж, щоб створити групи користувачів, відокремлені від решти й здатні спілкуватися між собою так, ніби вони в приватній мережі; наскрізне шифрування джерело називає посиленням цього відокремлення, а не визначальною ознакою. Тому корпоративний VPN дає доступ до внутрішніх стендів не тим, що «щось шифрує», а тим, що робить машину частиною такої групи.

    Тротлінг і діагностика мережевого шару

    Мережу можна не лише спостерігати, а й керовано псувати. (throttling) у панелі інструментів розробника емулює нижчий клас зʼєднання, задаючи швидкість завантаження, швидкість віддачі й мінімальну затримку. Пресети різняться між браузерами й змінюються між версіями Chrome, тож для відтворюваних умов надійніше задати власний профіль із фіксованими значеннями, ніж покладатися на назву пресета. Поруч живе режим Offline — дешева перевірка деградації: чи повідомляє застосунок про втрату мережі. Саму панель, її колонки й HAR розбирає глава «DevTools: вкладка Network і дебаг».

    Коли ж треба зрозуміти, який шар гальмує, час запиту розкладають змінними --write-out у 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

    time_namelookup — резолвінг імені, time_connect — встановлення TCP-зʼєднання, time_appconnect — завершення TLS, time_starttransfer — прихід першого байта. Усі значення відлічуються від старту запиту, тому кожне наступне включає попереднє: дивитися треба на різниці між сусідніми. Так «тест падає з таймауту» перетворюється на діагноз — імʼя не резолвиться, зʼєднання не встановлюється або сервер довго думає. конкретного інструмента розбирає розділ про автоматизацію.

    Наша практика (не канон). Канону під це немає — далі досвід команд. Тротлінг оголює стани завантаження (чи є спінер, чи не «моргає» порожній екран) і відтворює гонки, яких на швидкому каналі просто не встигає статися — класика тут кнопка, що лишається активною, поки запит іще летить, і дає подвійне надсилання. Звідси й ставлення до падінь на повільному профілі: тест там не «флакне» — він просто ще не впав, бо очікування в ньому недостатньо привʼязані до подій.

    Типові помилки

    • Виглядає як «рекурсивний резолвер зобовʼязаний дати відповідь», а насправді рекурсія — сервіс optional, сервер free to refuse її надавати, а тимчасова помилка резолюції є легальною відповіддю.
    • Виглядає як «DNS ходить по UDP, а на TCP переходить», а насправді обидва транспорти обовʼязкові (MUST support both), порт 53 у них спільний, а передача зони по TCP — вимога, а не запасний варіант.
    • Виглядає як «localhost — це просто 127.0.0.1», а насправді за іменем доступні обидві адреси loopback, і двостековий клієнт віддає перевагу IPv6: сервіс, що слухає лише IPv4, для нього мовчить.
    • Виглядає як «проксі буває прямий і зворотний», а насправді форм три — проксі, шлюз і тунель, — і розрізняє їх не бік, а те, хто вузол обрав і як він поводиться.
    • Виглядає як «канал широкий, отже швидкий», а насправді пропускна здатність і затримка незалежні: канал буває водночас «товстим» і «довгим».
    • Виглядає як «прописав у hosts — отже точно піде туди», а насправді таблиця хостів є резервом або доповненням до DNS, а пріоритет джерела лишається питанням конфігурації вузла.

    Підсумок

    1. Адреса веде до машини, порт — до сервісу на ній, а зʼєднання однозначно визначає пара сокетів, а не один бік.
    2. DNS — не миттєвий довідник, а система з кешем: TTL вирішує, чи побачить прогін новий стенд, і «холодна» резолюція входить у час першого відкриття сторінки.
    3. TCP платить рукостисканням за надійність і порядок, тож перший запит до хоста завжди дорожчий за наступні — і ця плата потрапляє в кожен таймаут.
    4. Затримка й пропускна здатність — різні осі: перша ламає сценарії з багатьма дрібними запитами, друга — завантаження великих файлів.
    5. Посередник визначається не боком, з якого стоїть, а тим, хто його обрав; вузол, якого клієнт не обирав, протокольно невідрізненний від на шляху.

    Можливі питання

    • «Що відбувається після того, як користувач увів адресу й натиснув Enter?» Питання-парасолька. Тут слухають, чи назвете шари по черзі — резолвінг імені, зʼєднання за адресою й портом, рукостискання, запит — і чи не поплутаєте їхній порядок.
    • «Чим порт відрізняється від адреси і що таке сокет?» Перевіряють базу адресації. Сильна відповідь називає порт номером сервісу, сокет — парою «адреса + порт», а зʼєднання — парою сокетів.
    • «Що таке TTL і чому тест може стукати не на той стенд?» Дивляться, чи звʼязуєте теорію з практикою: кеш резолвера, строк життя запису й висновок, що після зміни адреси доводиться чекати, а не «перезапустити тест».
    • «Чим затримка відрізняється від пропускної здатності?» Класика на плутанину. Очікують не лише означення, а й приклад, де вони розходяться: багато дрібних запитів проти одного великого файла.
    • «Тест падає з таймауту в CI, локально зелений. Ваші дії?» Міні-кейс, у якому слухають порядок: спершу шар (резолвінг, зʼєднання, очікування сервера), потім мережа середовища (посередник, заблокований транспорт, VPN), і лише тоді код тесту.

    Джерела

    IP-адреса: куди насправді йде запит

    Чому localhost іноді підводить

    Порти: багато сервісів на одній адресі

    DNS: від імені до адреси

    Домен і адреса: чому це не один до одного

    TCP: надійний потік і ціна рукостискання

    Затримка проти пропускної здатності

    Посередники: проксі, шлюз, тунель

    Тротлінг і діагностика мережевого шару

    Пояснення

    «Поясни» працює з власним API-ключем Anthropic: запит іде з вашого браузера прямо до Anthropic.

    Свій API-ключ (BYOK)

    Вставте власний ключ Anthropic — пояснення працюватиме на реальній моделі. Ключ зберігається лише у вашому браузері (localStorage), нікуди не надсилається, крім api.anthropic.com, і не логується.