9.8. Порты¶
IP-адрес указывает, какому хосту предназначен пакет. Современный хост одновременно выполняет множество программ — веб-браузер, чат-клиент, видеозвонок, задачу резервного копирования — и каждая из них параллельно отправляет и принимает пакеты. У уровня IP нет способа их различать; он просто передаёт каждый приходящий пакет «хосту». Что-то должно решать, какой пакет какой программе принадлежит.
Ответ — это номер порта. Каждый пакет на транспортном уровне несёт два дополнительных поля помимо заголовка IP: исходный порт и порт назначения. Каждый из них — 16-битное целое число, так что на хост приходится 65535 возможных номеров портов. В сочетании с IP-адресом порт идентифицирует одну конкретную конечную точку внутри хоста — конкретный обмен данными конкретной программы.
Множество программ совместно используют один IP-адрес; порт назначения направляет каждый приходящий пакет нужной программе.¶
9.8.1. Общеизвестные порты¶
Первые 1024 номера портов по соглашению зарезервированы для стандартных служб. Несколько из тех, что встретятся читателю:
22 — SSH (протокол Secure Shell, используемый для зашифрованного удалённого входа).
53 — DNS, система доменных имён (Domain Name System, рассматривается на странице Имена и DNS).
80 — HTTP, протокол передачи гипертекста (Hypertext Transfer Protocol) — незашифрованный протокол веба.
123 — NTP, сетевой протокол времени (Network Time Protocol; то, как устройства устанавливают свои часы по серверу времени).
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. Прослушивание против обмена данными¶
Роль, которую играет порт, зависит от того, на какой стороне обмена он находится. Два различных случая:
Прослушивающий порт принадлежит программе, которая хочет принимать незапрошенные соединения. Программа говорит 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 — соединённый, надёжный, упорядоченный поток).