SebWeo.com
В предыдущей статье мы говорили о WebSockets — технологии, позволяющей создавать интерактивные чаты в браузере. Но WebSocket — это лишь верхушка айсберга. Под капотом браузера, веб-сервера или любой сетевой программы работает фундаментальный механизм операционной системы — сетевой сокет.
Если вы когда-нибудь настраивали Nginx и видели ошибку «Address already in use«, или удивлялись, что такое файл .sock в Linux — эта статья для вас. Сегодня мы спустимся на уровень ниже и разберемся, как компьютеры на самом деле общаются между собой.
В простейшем понимании, сетевой сокет (Network Socket) — это программная конечная точка (endpoint) для приема или отправки данных в компьютерной сети. Это абстракция, которую операционная система предоставляет программам, чтобы те могли сказать: «Я хочу отправить данные туда» или «Я хочу слушать данные отсюда«.
Чтобы создать соединение через интернет, сокет должен иметь уникальный адрес, состоящий из двух частей:
192.168.1.1).80 для веб-сервера).Я люблю использовать аналогию с многоквартирным домом:
Когда вы создаете сокет, вы должны выбрать «правила общения», то есть протокол транспортного уровня. Их два, и они кардинально разные.
| Характеристика | TCP (Transmission Control Protocol) | UDP (User Datagram Protocol) |
|---|---|---|
| Главная фишка | Надежность. Гарантирует доставку. | Скорость. «Выстрелил и забыл». |
| Соединение | Устанавливает устойчивый канал (Handshake, рукопожатие). | Без установки соединения. |
| Порядок данных | Гарантирует правильный порядок пакетов (1, 2, 3…). | Пакеты могут приходить вразнобой или теряться. |
| Где используется | Веб-сайты (HTTP), почта, файлы, WebSockets. | Видеостриминг, онлайн-игры (FPS), DNS. |
Интересный факт: весь интернет, который мы привыкли видеть (сайты, API), построен на TCP-сокетах, потому что нам важно, чтобы страница загрузилась полностью, без потерянных кусков.
Если вы настраивали связку Nginx + PHP-FPM, вы могли видеть такую строку в конфигурации: fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;.
Что это за файл .sock? Это Unix-сокет. Он используется для общения программ внутри одного компьютера.
127.0.0.1), потому что ядру ОС не нужно заворачивать данные в сетевые пакеты, считать контрольные суммы и гонять их через сетевой стек.
Чтобы почувствовать, как это работает, давайте создадим простейший TCP-сервер на Python. Он будет использовать низкоуровневую библиотеку socket, которая является прямым интерфейсом к системным вызовам ОС.
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. Это база, на которой стоит вся ваша веб-разработка.
Кожа младенца – тонкая и нежная. Еще не справляется с защитой организма от внешних факторов.…
Представьте себе телефонный разговор. Вы звоните другу, он поднимает трубку, и вы можете говорить одновременно,…
Долгое время планшеты воспринимались исключительно как устройства для потребления контента: посмотреть YouTube, полистать ленту новостей…
Вы внесли правки в CSS, исправили критический баг в JavaScript, загрузили файлы на сервер и…
Представьте, что вы каждое утро приходите в одно и то же кафе и спрашиваете бариста:…
Очень многие недооценивают то, что у них есть, и переоценивают то, чего у них нет…