Categories: Технологии

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

В предыдущей статье мы говорили о 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. Это база, на которой стоит вся ваша веб-разработка.

 

Recent Posts

Обзор WordPress 7.0 «Armstrong»: Новая эра ИИ и масштабная перестройка Core-архитектуры

20 мая 2026 года официально состоялся релиз долгожданной мажорной версии WordPress 7.0 «Armstrong», названной в…

1 неделя ago

History Hijacking: Почему Google наказывает за «сломанную» кнопку Назад и как защитить сайт с помощью CSP

Каждый владелец сайта и SEO-специалист ведет ежедневную упорную борьбу за удержание пользователя на страницах вебресурса.…

2 недели ago

Интернет-магазин без лишнего функционала: как не переплатить за разработку на старте

Многие предприниматели сталкиваются с одной и той же проблемой. После утверждения бюджета разработка затягивается, появляются…

2 недели ago

Как выбрать детские бутсы для футбольной секции и не ошибиться с типом подошвы

Футбольная секция быстро показывает, насколько обувь подходит ребенку. Если пара скользит, давит или плохо цепляется…

2 недели ago

Флагманский смартфон: почему стоит купить Samsung Galaxy S26 Ultra

Компания Samsung — один из лидеров на рынке электроники. Ее смартфоны выделяются надежностью, качественными дисплеями,…

2 недели ago

Глагол dar в испанском языке: значение, спряжение и особенности использования

Испанский язык привлекает миллионы людей своей мелодичностью, эмоциональностью и относительной простотой изучения. Одним из важнейших…

3 недели ago