Перейти до змісту

Мережевий фундамент — Mermaid-схеми

Усі схеми цього файлу — візуалізація концепцій із network_foundation.md. Рендеруються в будь-якому Markdown-переглядачі з підтримкою Mermaid (GitHub, Obsidian, VSCode).


1. Огляд Інтернету — від браузера до сервера

graph LR
    A[🖥️ Браузер] -->|DNS-запит| B[DNS Resolver]
    B -->|IP-адреса| A
    A -->|TCP + HTTP| C[🌐 Інтернет]
    C -->|пакети| D[Router ISP]
    D -->|маршрутизація| E[Router Datacenter]
    E -->|пакети| F[🖧 Веб-сервер]
    F -->|HTTP відповідь| C
    C -->|відповідь| A

2. Повний маршрут запиту: Клієнт → Router → ISP → Сервер

graph TD
    Browser[Браузер\n192.168.1.10] -->|HTTP GET /| HomeRouter[Домашній роутер\nNAT: замінює IP]
    HomeRouter -->|Публічний IP клієнта| ISP[ISP\nInternet Provider]
    ISP -->|BGP маршрутизація| InternetCore[Магістральні вузли\nInternet backbone]
    InternetCore -->|До цільової AS| DatacenterRouter[Маршрутизатор датацентру]
    DatacenterRouter -->|До сервера| LB[Load Balancer\nнеобов'язково]
    LB -->|Round-robin| Server[🖧 Цільовий сервер\n203.0.113.10:443]
    Server -->|HTTP Response| DatacenterRouter
    DatacenterRouter -->|Зворотній маршрут| Browser

3. DNS-резолюція — покроково

sequenceDiagram
    participant Browser as Браузер
    participant Cache as Локальний кеш ОС
    participant Resolver as DNS Resolver\n(провайдер / 8.8.8.8)
    participant Root as Root DNS Server
    participant TLD as TLD Server (.com)
    participant Auth as Authoritative DNS\n(github.com)

    Browser->>Cache: github.com → IP?
    Cache-->>Browser: Немає (кеш порожній)
    Browser->>Resolver: github.com → IP?
    Resolver->>Root: github.com → IP?
    Root-->>Resolver: Запитай TLD для .com
    Resolver->>TLD: github.com → IP?
    TLD-->>Resolver: Запитай ns1.p16.dynect.net
    Resolver->>Auth: github.com → IP?
    Auth-->>Resolver: 140.82.121.4 (TTL=60s)
    Resolver-->>Browser: 140.82.121.4
    Note over Browser,Cache: Браузер кешує результат на TTL секунд
    Browser->>Browser: З'єднання до 140.82.121.4:443

4. TCP — Three-Way Handshake + HTTP + Teardown

sequenceDiagram
    participant C as Клієнт (Браузер)
    participant S as Сервер (Nginx)

    Note over C,S: Фаза 1 — TCP Three-Way Handshake
    C->>S: SYN (seq=100)
    S-->>C: SYN-ACK (seq=200, ack=101)
    C->>S: ACK (ack=201)
    Note over C,S: З'єднання встановлено ✓

    Note over C,S: Фаза 2 — HTTP обмін
    C->>S: HTTP GET /products/ (заголовки + тіло)
    Note over S: Nginx обробляє, Django генерує відповідь
    S-->>C: HTTP 200 OK + HTML (Content-Length: 4200)

    Note over C,S: Фаза 3 — Завершення з'єднання
    C->>S: FIN
    S-->>C: ACK
    S->>C: FIN
    C-->>S: ACK
    Note over C,S: З'єднання закрито

5. HTTP Request/Response Lifecycle

sequenceDiagram
    participant U as 👤 Користувач
    participant B as Браузер
    participant DNS as DNS
    participant S as Сервер

    U->>B: Вводить https://shop.com/cart/
    B->>DNS: shop.com → IP?
    DNS-->>B: 93.184.216.34
    B->>S: TCP + TLS Handshake
    Note over B,S: Шифрований канал встановлено
    B->>S: GET /cart/ HTTP/1.1\nHost: shop.com\nCookie: sessionid=abc
    Note over S: Серверна логіка:\n1. Читає sessionid\n2. Знаходить юзера\n3. Запитує БД\n4. Рендерить HTML
    S-->>B: HTTP/1.1 200 OK\nContent-Type: text/html\n\n<html>...</html>
    B->>U: Відображає сторінку кошика

6. HTTPS / TLS Handshake

sequenceDiagram
    participant C as Клієнт (Браузер)
    participant S as Сервер (Nginx + SSL cert)
    participant CA as Certificate Authority\n(Let's Encrypt)

    Note over C,S: TCP з'єднання вже встановлено
    C->>S: ClientHello (TLS версія, cipher suites, random_C)
    S-->>C: ServerHello + SSL Certificate (підписаний CA)
    C->>CA: Перевірка підпису сертифікату
    CA-->>C: Сертифікат валідний ✓
    C->>S: Pre-master secret (зашифрований публічним ключем сервера)
    Note over C,S: Обидві сторони генерують session key
    C->>S: Finished (перший зашифрований пакет)
    S-->>C: Finished (підтвердження)
    Note over C,S: Всі наступні дані шифруються session key
    C->>S: HTTP GET / (тепер зашифровано)
    S-->>C: HTTP 200 OK + HTML (зашифровано)

7. Браузер → Бекенд → База даних (повний стек)

graph TD
    Browser[🖥️ Браузер] -->|HTTPS запит| Nginx[Nginx\nReverse Proxy :443]
    Nginx -->|Статичний файл?| Static[(📁 Файлова система\n/static/ /media/)]
    Static -->|PNG CSS JS| Nginx
    Nginx -->|Динамічний запит\nUnix Socket| WSGI[uWSGI / Gunicorn\nПроцес-менеджер]
    WSGI -->|WSGI environ dict| Django[🐍 Django Application]
    Django -->|SQL запит\nORM| PG[(PostgreSQL)]
    PG -->|Рядки даних| Django
    Django -->|HttpResponse HTML/JSON| WSGI
    WSGI -->|HTTP байти| Nginx
    Nginx -->|HTTPS відповідь| Browser

    style Browser fill:#4A90D9,color:#fff
    style Nginx fill:#2C7A2C,color:#fff
    style WSGI fill:#8B5E3C,color:#fff
    style Django fill:#0C4B33,color:#fff
    style PG fill:#336791,color:#fff

8. Socket-комунікація

graph LR
    subgraph Сервер
        S_App[Програма\nDjango/FastAPI] -->|socket.bind\nport 8000| S_Socket[Server Socket\n0.0.0.0:8000]
        S_Socket -->|socket.listen| Queue[Черга з'єднань]
        Queue -->|socket.accept| Conn[Активне з'єднання\nConn Socket]
        Conn -->|recv / send| S_App
    end

    subgraph Клієнт
        C_App[Браузер /\nHTTP клієнт] -->|socket.connect\n93.184.1.1:8000| C_Socket[Client Socket\nephemeral port]
        C_Socket -->|send / recv| C_App
    end

    Conn <-->|TCP байти| C_Socket

9. REST API Flow — повний цикл

sequenceDiagram
    participant App as 📱 Мобільний додаток
    participant Auth as Auth Middleware
    participant Router as URL Router
    participant View as API View
    participant DB as База даних

    App->>Auth: POST /api/login/ {"username": "...", "password": "..."}
    Auth-->>App: 200 OK {"token": "eyJhbGc..."}

    App->>Auth: GET /api/products/ + Header: Authorization: Bearer eyJhbGc...
    Note over Auth: Перевірка JWT токену
    Auth->>Router: Request + request.user (автентифікований)
    Router->>View: ProductListView.get(request)
    View->>DB: SELECT * FROM products WHERE active=true
    DB-->>View: 150 рядків продуктів
    View-->>Auth: JsonResponse([...], status=200)
    Auth-->>App: 200 OK [{"id":1, "name":"..."}, ...]

    App->>Auth: POST /api/cart/items/ {"product_id": 5, "qty": 2}
    Auth->>Router: CartItemCreateView.post(request)
    Router->>View: Валідація + збереження
    View->>DB: INSERT INTO cart_items ...
    DB-->>View: OK, id=42
    View-->>Auth: JsonResponse({"id": 42}, status=201)
    Auth-->>App: 201 Created {"id": 42}

10. Клієнт-серверна архітектура — концептуальний огляд

graph TB
    subgraph Клієнти
        Browser[🖥️ Веб-браузер]
        Mobile[📱 Мобільний додаток]
        CLI[⌨️ CLI / curl]
    end

    subgraph Internet[Інтернет]
        DNS_S[DNS Server]
        Router_I[Маршрутизатори]
    end

    subgraph Server[Серверна інфраструктура]
        Nginx_S[Nginx :80/:443]
        App[Python Backend\nDjango / FastAPI]
        DB_S[(PostgreSQL)]
        Cache_S[(Redis Cache)]
        Worker[Celery Workers]
    end

    Browser -->|HTTPS| Nginx_S
    Mobile -->|HTTPS| Nginx_S
    CLI -->|HTTP| Nginx_S

    Browser <-->|DNS lookup| DNS_S

    Nginx_S --> App
    App <--> DB_S
    App <--> Cache_S
    App -->|Task queue| Worker
    Worker <--> DB_S

11. Packets та маршрутизація IP

flowchart LR

    classDef layer fill:#E3F2FD,stroke:#1E88E5,color:#000
    classDef router fill:#FFF3E0,stroke:#FB8C00,color:#000
    classDef endpoint fill:#E8F5E9,stroke:#43A047,color:#000

    subgraph PACKET["TCP/IP Packet"]
        direction TB

        ETH["Ethernet Header\nMAC addresses"]:::layer

        IP["IP Header\nsrc/dst IP"]:::layer

        TCP["TCP Header\nports + sequence"]:::layer

        DATA["Payload\nHTTP data"]:::layer
    end

    Browser["🌍 Browser"]:::endpoint

    R1["Home Router"]:::router

    ISP["ISP Router"]:::router

    Core["Core Router"]:::router

    Alt["Alternative Route"]:::router

    Server["🖥️ Server"]:::endpoint

    Browser --> R1

    R1 --> ISP

    ISP --> Core

    ISP --> Alt

    Core --> Server

    Alt --> Server

Довідкова таблиця протоколів

graph TD
    subgraph OSI [Рівні мережі спрощено]
        L7[L7 Прикладний\nHTTP HTTPS DNS FTP SMTP]
        L4[L4 Транспортний\nTCP UDP]
        L3[L3 Мережевий\nIP ICMP]
        L2[L2 Канальний\nEthernet WiFi MAC]
        L1[L1 Фізичний\nДроти Оптика Радіо]
    end
    L7 --> L4 --> L3 --> L2 --> L1

    style L7 fill:#4A90D9,color:#fff
    style L4 fill:#2C7A2C,color:#fff
    style L3 fill:#8B5E3C,color:#fff
    style L2 fill:#6B4C9A,color:#fff
    style L1 fill:#555,color:#fff