Что означает, что сетевое приложение «слушает» порт?

Ответ

Когда говорят, что сетевое приложение "слушает" порт (listens on a port), это означает, что оно зарезервировало за собой определённый порт на сетевом интерфейсе компьютера и ожидает входящие TCP/IP соединения от клиентов.

Этот процесс состоит из нескольких стандартных шагов с использованием системных вызовов (API сокетов):

  1. Создание сокета (socket). Приложение запрашивает у операционной системы (ОС) конечную точку для коммуникации.

  2. Привязка сокета к адресу и порту (bind). Сокет связывается с конкретным IP-адресом и номером порта (например, 192.168.1.5:8080). С этого момента ОС считает данный порт занятым этим процессом.

  3. Перевод в режим прослушивания (listen). Приложение сообщает ОС, что сокет готов принимать входящие соединения. ОС создает очередь для запросов на подключение, если приложение занято обработкой текущего клиента.

  4. Принятие соединений (accept). Приложение входит в блокирующий режим ожидания. Как только клиент пытается подключиться, вызов accept возвращает новый сокет, через который будет происходить обмен данными с этим конкретным клиентом.

Пример на Python с использованием модуля socket:

import socket

# 1. Создание TCP-сокета
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2. Привязка к адресу и порту
server_socket.bind(('127.0.0.1', 8080))

# 3. Перевод в режим прослушивания (очередь на 5 соединений)
server_socket.listen(5)

print("Сервер слушает порт 8080...")

# 4. Принятие входящего соединения
client_socket, address = server_socket.accept()
print(f"Получено соединение от {address}")

# ... дальнейшая работа с client_socket ...

client_socket.close()
server_socket.close()

Ключевые моменты:

  • Занятый порт: Попытка слушать уже занятый порт вызовет ошибку Address already in use.
  • Привилегированные порты: Порты с номерами ниже 1024 (например, 80 для HTTP, 443 для HTTPS) требуют прав администратора (root) для прослушивания.