Порты и сокеты: почему у одного компьютера тысячи дверей
У вашего компьютера один сетевой адрес, но через него одновременно идут почта, видео и сотня вкладок. Кто их не путает? Ответ — в номерах дверей, о которых вы не подозревали.
Адрес приводит письмо к нужному дому. Но в доме сотня квартир — и без номера квартиры письмо не дойдёт. В сети роль квартиры играет порт.
IP-адрес — это здание. Порт — конкретная дверь в нём. Сокет — это уже состоявшийся разговор через эту дверь.
Проблема одного адреса
У вашего компьютера в сети один IP-адрес. Но прямо сейчас он, скорее всего, делает кучу вещей сразу: грузит страницы в нескольких вкладках, проверяет почту, играет музыку из стриминга, обновляет мессенджер. Все эти потоки данных приходят на один и тот же адрес. Почему же ответ для почты не попадает по ошибке в окно видео?
Потому что одного адреса мало. Нужен ещё один уровень адресации — порт.
Порт — это номер двери
Порт — это просто число от 0 до 65535, которое уточняет, какому именно приложению или сервису предназначены данные. Если IP-адрес — это многоквартирный дом, то порт — номер квартиры. Письмо приходит на адрес дома (IP), а порт говорит, в какую дверь его занести.
Когда пакет приходит на компьютер, система смотрит на номер порта и отдаёт данные тому приложению, которое этот порт «слушает». Браузер ждёт ответы на своих портах, почтовый клиент — на своих. Никто никого не путает.
Знаменитые номера дверей
Часть портов закреплена за стандартными службами по всеобщему соглашению — их называют хорошо известными:
| Порт | Кто за ним |
| 80 | Веб по HTTP |
| 443 | Веб по HTTPS (защищённый) |
| 53 | DNS, поиск адресов по именам |
| 25 | Отправка электронной почты |
Поэтому, открывая сайт, вы по умолчанию стучитесь в дверь 80 или 443 — браузер подставляет эти порты сам, вы их просто не видите в адресной строке.
А что тогда сокет
Здесь часто путаются, но разница простая. Порт — это номер двери, абстрактный адрес. Сокет — это уже открытое соединение, конкретный канал связи между двумя сторонами.
Сокет однозначно описывается четвёркой: адрес и порт одной стороны плюс адрес и порт другой. Именно эта комбинация делает каждый разговор уникальным. Можно открыть десять вкладок одного сайта — у каждой будет свой сокет: адрес сервера и его порт одинаковы, но порт на вашей стороне у каждой вкладки свой. Так система и различает потоки.
Аналогия: порт — это телефонный номер, а сокет — конкретный состоявшийся звонок между двумя номерами. Номер один, но звонков через него может идти много, и каждый — отдельный.
Откуда берутся ваши порты
Серверы слушают известные порты (80, 443) — чтобы клиенты знали, куда стучаться. А вот ваша сторона при подключении получает временный порт из верхнего диапазона, выданный системой на этот разговор. Закрыли вкладку — порт освободился и вернётся в общий пул. Поэтому тысячи одновременных соединений уживаются на одном компьютере: дверей-портов десятки тысяч.
Зачем это знать
Понятие порта объясняет массу повседневных вещей: почему «открыть порт» нужно для игрового сервера, что значит «порт занят» при запуске программы, как файрвол «закрывает порты» от чужих. А идея сокета — фундамент любого сетевого приложения: каждый чат, игра и сайт под капотом открывает и закрывает сокеты.
Так что за скромным «один компьютер — один адрес» прячется здание с десятками тысяч дверей, и в каждую может идти свой независимый разговор. Именно эта многодверность и позволяет одной машине делать в Сети сотню дел одновременно, ничего не перепутав.