Підступна війна росії проти України. Орієнтовні втрати ворога
(станом на 07.08.2026)
1455420
осіб
439
літаків
354
гелікоптерів
12247
танків
25098
ББМ
47522
артилерія
1550
ППО
2008
РСЗВ
131068
машин
34
кораблі і катери

Сетевые сокеты (Network Sockets): фундамент интернета 🌐 | Глубокое погружение

29/11/2025

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

Если вы когда-нибудь настраивали Nginx и видели ошибку “Address already in use“, или удивлялись, что такое файл .sock в Linux — эта статья для вас. Сегодня мы спустимся на уровень ниже и разберемся, как компьютеры на самом деле общаются между собой.

 

Что такое сокет в операционной системе?

В простейшем понимании, сетевой сокет (Network Socket) — это программная конечная точка (endpoint) для приема или отправки данных в компьютерной сети. Это абстракция, которую операционная система предоставляет программам, чтобы те могли сказать: “Я хочу отправить данные туда” или “Я хочу слушать данные отсюда“.

Чтобы создать соединение через интернет, сокет должен иметь уникальный адрес, состоящий из двух частей:

  1. IP-адрес: Адрес компьютера в сети (например, 192.168.1.1).
  2. Порт: Числовой идентификатор конкретной программы на этом компьютере (например, 80 для веб-сервера).

Я люблю использовать аналогию с многоквартирным домом:

  • IP-адрес — это адрес самого дома (улица, номер). Почтальон знает, куда нести письмо.
  • Порт — это номер квартиры. Без него письмо дойдет до дома, но не найдет конкретного получателя.
  • Сокет — это дверь в квартиру. Именно через нее жилец (программа) получает и передает “посылки” (данные).

 

Два главных игрока: TCP vs UDP

Когда вы создаете сокет, вы должны выбрать “правила общения”, то есть протокол транспортного уровня. Их два, и они кардинально разные.

Характеристика TCP (Transmission Control Protocol) UDP (User Datagram Protocol)
Главная фишка Надежность. Гарантирует доставку. Скорость. “Выстрелил и забыл”.
Соединение Устанавливает устойчивый канал (Handshake, рукопожатие). Без установки соединения.
Порядок данных Гарантирует правильный порядок пакетов (1, 2, 3…). Пакеты могут приходить вразнобой или теряться.
Где используется Веб-сайты (HTTP), почта, файлы, WebSockets. Видеостриминг, онлайн-игры (FPS), DNS.

Интересный факт: весь интернет, который мы привыкли видеть (сайты, API), построен на TCP-сокетах, потому что нам важно, чтобы страница загрузилась полностью, без потерянных кусков.

 

Отдельный вид искусства: Unix Domain Sockets

Если вы настраивали связку Nginx + PHP-FPM, вы могли видеть такую строку в конфигурации: fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;.

Что это за файл .sock? Это Unix-сокет. Он используется для общения программ внутри одного компьютера.

  • Скорость: Это намного быстрее обычных TCP-сокетов (даже на 127.0.0.1), потому что ядру ОС не нужно заворачивать данные в сетевые пакеты, считать контрольные суммы и гонять их через сетевой стек.
  • Безопасность: Так как это файл, вы можете настроить права доступа (chmod/chown) так, чтобы только Nginx мог “писать” в сокет PHP.

 

Практика: “слушаем” порт на Python

Чтобы почувствовать, как это работает, давайте создадим простейший TCP-сервер на Python. Он будет использовать низкоуровневую библиотеку socket, которая является прямым интерфейсом к системным вызовам ОС.

Код сервера (server.py)
import socket
# Создаем TCP/IP сокет
# AF_INET = IPv4
# SOCK_STREAM = TCP
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Привязываем сокет к адресу и порту
# localhost означает, что сервер доступен только на этом компьютере
server_address = ('localhost', 10000)
print(f'Запуск сервера на {server_address[0]} порт {server_address[1]}')
server_socket.bind(server_address)
# Начинаем слушать (ждем входящие звонки)
server_socket.listen(1)
while True:
    print('Жду соединения...')
    # accept() блокирует выполнение, пока кто-то не подключится
    # connection - это НОВЫЙ сокет специально для этого клиента
    connection, client_address = server_socket.accept()    
    try:
        print(f'Подключился клиент: {client_address}')        
        while True:
            # Получаем данные (по 16 байт)
            data = connection.recv(16)
            if data:
                print(f'Получено: {data.decode()}')
                # Отправляем данные обратно (Эхо-сервер)
                connection.sendall(data)
            else:
                print(f'Больше нет данных от {client_address}')
                break            
    finally:
        # Обязательно закрываем соединение ("кладем трубку")
        connection.close()

Когда вы запустите этот код, ваша ОС откроет порт 10000 и будет ждать. Вы можете подключиться к нему даже через браузер (хотя он не поймет ответа) или через команду telnet localhost 10000.

 

Вывод: все есть файл (или сокет)

В мире Unix/Linux есть поговорка: “Все есть файл”. Сетевой сокет — это лучшая иллюстрация этого принципа. Для программы это просто дескриптор, в который можно писать и из которого можно читать, а операционная система берет на себя всю магию доставки этих байтов на другой конец света.

Понимание разницы между TCP, UDP и Unix-сокетами позволяет вам принимать правильные архитектурные решения. Например, выбирать Unix-сокеты для локального соединения базы данных или понимать, почему для видеозвонков лучше подходит UDP. Это база, на которой стоит вся ваша веб-разработка.

 

Категорії:

Перегляди 665
розкажіть друзям:

Напишіть тут свою думку/питання

Ваша пошта не публікуватиметься. Обов’язкові поля позначені *