← Назад к вопросам

Что происходит на порту при запуске приложения?

2.0 Middle🔥 171 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что происходит на порту при запуске приложения?

Порт — это виртуальная конечная точка сетевого соединения, которая используется операционной системой для идентификации и маршрутизации сетевого трафика. При запуске приложения происходит несколько ключевых этапов работы с портом.

Этапы работы портов при запуске

1. Создание сокета и привязка к порту

Когда приложение запускается, оно создаёт сокет — объект для обмена данными по сети. После создания сокета приложение привязывает его к определённому порту с помощью системного вызова bind().

import socket

# Создаём серверный сокет
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Привязываем сокет к порту 8000
server_socket.bind(('localhost', 8000))

# Указываем, что готовы принимать соединения
server_socket.listen(5)

print('Сервер запущен на порту 8000')

2. Проверка доступности портов

Операционная система проверяет, не занят ли указанный порт другим процессом. Если порт занят, приложение получит ошибку Address already in use. Порты 0-1023 — привилегированные, для их использования нужны права администратора.

3. Слушание входящих соединений

После успешной привязки к порту приложение переходит в режим прослушивания (listen). Операционная система создаёт очередь входящих соединений с размером, указанным в параметре функции (обычно 5-128 соединений).

from fastapi import FastAPI
import uvicorn

app = FastAPI()

@app.get('/hello')
async def hello():
    return {'message': 'Hello World'}

if __name__ == '__main__':
    uvicorn.run(app, host='0.0.0.0', port=8000)

Состояния портов

Порт может находиться в различных состояниях:

  • LISTEN — порт слушает входящие соединения
  • ESTABLISHED — активное соединение
  • TIME_WAIT — ожидание перед полным закрытием соединения
  • CLOSE_WAIT — ожидание закрытия со стороны приложения

Обработка ошибок при запуске

import socket
import sys

def start_server(host, port):
    try:
        server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        server.bind((host, port))
        server.listen(5)
        print(f'Сервер слушает на {host}:{port}')
    except OSError as e:
        print(f'Ошибка: порт {port} занят или недоступен')
        sys.exit(1)

start_server('127.0.0.1', 8000)

SO_REUSEADDR — это опция, которая позволяет переиспользовать порт, находящийся в состоянии TIME_WAIT, что полезно при перезагрузке приложения.

Лучшие практики

  • Используйте динамические порты (1024-65535) если возможно
  • Устанавливайте SO_REUSEADDR для быстрого перезапуска
  • Обрабатывайте исключения при привязке к порту
  • Логируйте информацию о запущенном сервере
  • Используйте переменные окружения для номера порта в продакшене