9.8. Порти

IP-адреса вказує, якому хосту призначений пакет. Сучасний хост одночасно запускає багато програм – веббраузер, клієнт чату, відеодзвінок, завдання резервного копіювання – і кожна з них паралельно надсилає та отримує пакети. IP-рівень не може їх розрізнити; він просто передає кожен пакет, що надходить, «хосту». Щось повинно вирішувати, який пакет належить якій програмі.

Номер порту – це відповідь. Кожен пакет на транспортному рівні містить два додаткових поля понад IP-заголовок: порт джерела та порт призначення. Кожне є 16-бітним цілим числом, тому на хост припадає 65535 можливих номерів портів. У поєднанні з IP-адресою порт ідентифікує одну конкретну кінцеву точку всередині хосту – конкретну розмову конкретної програми.

A single host box on the right with an IP address labelled at the top. Three programs inside the host are labelled "HTTP server", "video call", "chat client", each connected to a different port number labelled 80, 5004, and 4321 respectively. Three arrows arrive at the host from the network, each tagged with a destination port; each arrow lands on the matching program.

Багато програм спільно використовують одну IP-адресу; порт призначення направляє кожен пакет, що надходить, до потрібної програми.

9.8.1. Добре відомі порти

Перші 1024 номери портів зарезервовані за домовленістю для стандартних служб. Кілька з них, які зустрінуться читачу:

  • 22 – SSH (протокол Secure Shell, що використовується для зашифрованого віддаленого входу).

  • 53 – DNS, система доменних імен (описана на Імена та DNS).

  • 80 – HTTP, протокол передачі гіпертексту – незашифрований протокол вебу.

  • 123 – NTP, мережевий протокол часу (як пристрої синхронізують свої годинники з сервером часу).

  • 443 – HTTPS, HTTP поверх TLS (Transport Layer Security, стандартна обгортка шифрування для інтернет-протоколів) – протокол, що стоїть за кожною вебсторінкою, яка показує значок замка в браузері.

Ця домовленість уможливлює підключення браузера до http://example.com без зазначення порту – він припускає 80, оскільки це загальновідомий порт для HTTP. Камера, що підключається до вебсервера, робить те саме.

Вище 1024 номери портів є необмеженими, і будь-яка програма може їх зайняти. Сервери баз даних (5432 для PostgreSQL, 3306 для MySQL), сервери застосунків і спеціальні протоколи – усі вони розміщуються десь у верхньому діапазоні.

9.8.2. Ефемерні порти

Сервери прослуховують відомий порт. Клієнти використовують інший порт на своєму кінці, що вибирається заново для кожного вихідного з’єднання.

Коли камера підключається до вебсервера на порту 443, розмова відбувається між

camera IP : <some-port>     <-->     server IP : 443

<some-port> – це ефемерний порт: MicroPython вибирає невикористаний номер з верхнього діапазону, використовує його протягом з’єднання і звільняє після. Скрипту не потрібно знати, який номер було обрано; рівень сокетів обробляє це автоматично.

9.8.3. Прослуховування vs. розмова

Роль порту залежить від того, на якій стороні розмови він перебуває. Два окремих випадки:

  • Прослуховуючий порт належить програмі, яка хоче отримувати небажані з’єднання. Програма повідомляє MicroPython «будь-які вхідні пакети, адресовані мені на порту 80, – мої» і чекає. Так роблять сервери.

  • Підключений порт належить програмі, яка хоче ініціювати розмову. Програма вибирає (або просить MicroPython вибрати) ефемерний порт, надсилає пакет з ним як вихідним портом і відомим портом сервера як портом призначення, та використовує ту саму пару портів для решти розмови.

Одна програма може одночасно виконувати обидві ролі, утримуючи різні порти для кожної. Камера може прослуховувати порт 8000 для вхідних HTTP-з’єднань від інтерфейсу конфігурації і одночасно підтримувати вихідне HTTPS-з’єднання з віддаленим сервером на порту 443. Дві ролі не заважають одна одній – кожна розмова ідентифікується повним кортежем (src IP, src port, dst IP, dst port), і жодні дві розмови не мають однакового кортежу.

9.8.4. Що надають порти

Маючи порти, транспортний рівень нарешті може вирішити проблему доставки між програмами. Пакет тепер містить достатньо інформації, щоб бути доставленим не лише до потрібного хосту (IP-адреса), а й до потрібного сокета всередині цього хосту (номер порту).

Наступні дві сторінки охоплюють два варіанти, які транспортний рівень пропонує поверх цієї адресації: UDP (User Datagram Protocol – кожен пакет незалежний, без гарантій) і TCP (Transmission Control Protocol – підключений, надійний, впорядкований потік).