Сокет простыми словами: что это, какие бывают виды и как работает соединение

Сокет — это точка, через которую программа выходит в сеть. Одно слово означает сразу три разные вещи, и первым делом разводим их: сетевой сокет, разъём под процессор и розетку. Дальше простыми словами: чем сокет отличается от порта, чем TCP отличается от UDP, при чём тут WebSocket и откуда берётся ошибка «Address already in use». Плюс рабочий сервер на Python в пятнадцать строк, который запускается сегодня вечером.
Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 2417 статей автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3077 экспертных мнений Подписаться на Телеграм-канал
Обложка: Сокет простыми словами: что это, какие бывают виды и как работает соединение

Слово «сокет» гуглят три разных человека. Первый собирает компьютер и хочет понять, влезет ли новый процессор в материнскую плату. Второй читает чужой код и споткнулся о строчку «откройте сокет на порту 8080». Третий пришёл из электрики, где английское socket означает розетку.

Эта статья для второго. Разберём сетевой сокет: что это такое, из чего он состоит, какие бывают виды, что происходит внутри соединения и почему у новичков вылезает загадочное «Address already in use». Плюс покажем рабочий сервер на Python, который влезает в пятнадцать строк.

Но сначала разведём три значения слова, чтобы вы за десять секунд поняли, туда ли попали.

Если вы только начинаете разбираться, как программы общаются между собой, полезно сперва прочитать наш материал «Что такое API простыми словами». Сокеты и API живут на соседних этажах одной конструкции, и вместе они укладываются в голове куда легче.

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

А если хочется освоить ремесло системно, загляните в подборку курсов по backend-разработке: именно там сокеты перестают быть теорией и становятся рабочим инструментом.

CheckroiCheckroiПодборка курсов по Backend-разработке117 курсов • 23 школыСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить

Три сокета, которые называются одним словом

Рой-сетевой инженер объясняет, чем отличаются три разных сокета

Английское socket переводится и как «гнездо», и как «разъём», и как «розетка». В русский технический язык оно приехало сразу в трёх ролях, и между собой эти роли никак не связаны. Отсюда и путаница: человек ищет одно, а выдача подсовывает другое.

Какой сокет Что это такое Где встречается
Сетевой (программный) Точка, через которую программа отправляет и принимает данные по сети. Задаётся парой «IP-адрес + порт» Программирование, серверы, чаты, онлайн-игры, мессенджеры
Процессорный Физический разъём на материнской плате, куда вставляется процессор: LGA1700 у Intel, AM4 и AM5 у AMD Сборка и апгрейд компьютера
Электрический Розетка, а в наборах инструментов ещё и торцевая головка гаечного ключа Электрика, инструменты, прямая калька с английского

Как понять, какой сокет ваш. Если рядом стоят буквенно-цифровые обозначения вроде LGA1700, AM4 или AM5, речь про железо. Узнать сокет своего процессора можно бесплатной утилитой CPU-Z или в спецификации на сайте производителя платы. Если же сокет «открывают», «слушают», «закрывают» и он живёт на каком-то порту, перед вами программная штука, и дальше как раз про неё.

Проверка на один вопрос. Сокет, который выбирают под процессор, всегда железный. Сокет, у которого есть номер порта, всегда программный.

Если вы всё-таки про процессорный сокет

Коротко, чтобы не пришлось искать отдельно. Процессорный сокет задаёт, какие процессоры подойдут вашей материнской плате. У Intel это линейка LGA, где контактные ножки расположены на самой плате, у AMD — платформы AM4 и AM5. Процессор с чужим сокетом физически не встанет, переходников не существует.

Посмотреть свой сокет можно тремя способами: через бесплатную утилиту CPU-Z на вкладке CPU, в описании модели процессора на сайте производителя или в характеристиках материнской платы. При апгрейде смотреть нужно на оба устройства сразу: совпадение сокета обязательно, но плате может понадобиться ещё и обновление прошивки.

На этом про железо всё. Дальше в статье слово «сокет» означает только первый вариант из таблицы.

Что такое сетевой сокет простыми словами

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

Представьте многоквартирный дом. У дома есть уличный адрес, по нему письмо доезжает до нужного здания. Но в доме сотня квартир, и без номера квартиры почтальон не поймёт, кому отдать конверт. IP-адрес работает как адрес дома, порт указывает номер квартиры, а сокет — это уже открытый почтовый ящик, в который можно положить письмо и из которого можно его достать.

Главная ценность сокета в том, что программист не разбирается в тонкостях протоколов. Он не режет данные на пакеты, не считает контрольные суммы, не переспрашивает потерянное. Он отдаёт строку в сокет на одной машине и забирает её из сокета на другой.

Сокет, порт и IP-адрес: кто есть кто

Это тройка, которую путают чаще всего, поэтому разложим её по полочкам.

IP-адрес — это адрес устройства в сети, например 77.88.55.88. Он отвечает на вопрос «до какого компьютера доехать».

Порт — это число от 1 до 65535. Он отвечает на вопрос «какой программе на этом компьютере отдать данные». Порты до 1024 считаются привилегированными и закреплены за известными службами: за портом 80 стоит обычный веб, за 443 защищённый, за 22 удалённый доступ по SSH. Для своих экспериментов берите что-нибудь свободное выше 1024, например 8080 или 5555.

Сокет — это пара «IP-адрес + порт» плюс сам объект, через который идёт чтение и запись. Причём у установленного соединения таких пар две: своя на стороне клиента и своя на стороне сервера. Именно эта четвёрка чисел и отличает одно соединение от всех остальных.

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

Где живёт сокет на самом деле

Многим кажется, что сокет — это что-то внутри провода или сетевой карты. На деле это объект в памяти вашего процесса, которым управляет операционная система. Когда программа создаёт сокет, система выдаёт ей дескриптор: небольшое число, по которому она потом узнаёт, о каком именно соединении идёт речь.

В мире Unix действует принцип «всё есть файл», и сокет ведёт себя почти как открытый файл: в него пишут, из него читают, его закрывают. Отличие в том, что на другом конце сидит другая программа, иногда за тысячи километров.

Канал основателя Checkroi Вани Буявца3 700 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединиться

Зачем нужны сокеты, если есть HTTP и готовые библиотеки

Резонный вопрос человека, который уже умеет дёргать чужой сервис одной строчкой кода. Если библиотека сама сходит по адресу и вернёт ответ, зачем спускаться ниже?

Ответ в том, что сокеты лежат этажом ниже всего остального. HTTP работает поверх TCP, TCP работает через сокеты. Когда вы отправляете запрос удобной библиотекой, внутри неё всё равно происходят те же connect, send и recv. Разница только в том, что кто-то написал их за вас.

Спускаться на уровень сокетов имеет смысл в четырёх случаях.

  • Нужен свой протокол. Датчик отправляет четыре байта с температурой раз в секунду, и заворачивать их в полноценный веб-запрос с заголовками расточительно.
  • Нужна связь в обе стороны. В классической схеме сервер отвечает только когда его спросили. Чат, игра и живое табло так не работают.
  • Нужна скорость. В играх и трансляциях лишние сотни миллисекунд на установку соединения заметны человеку.
  • Что-то сломалось. И вот это встречается чаще всего: соединения зависают, упираются в лимиты, рвутся по таймауту. Разобраться в этом, не понимая, что происходит уровнем ниже, не выйдет.

То есть писать сокеты руками каждый день вам, скорее всего, не придётся. А вот читать чужие ошибки про них придётся почти наверняка.

Как работает сокет: жизненный цикл соединения

Концепт: два дома соединены светящейся трубой связи через пронумерованные почтовые ящики

Набор функций для работы с сокетами придумали в Калифорнийском университете в начале восьмидесятых, и с тех пор он почти не поменялся. Его называют сокетами Беркли, и именно этот набор лежит в основе сетевых библиотек Python, Java, Go, C# и практически любого языка. Выучив логику один раз, вы узнаете её везде.

Разберём по шагам, кто что делает.

Шаг 1: сервер готовит место

Сервер вызывает socket() и получает пустой, ещё ни с чем не связанный сокет. Затем bind() привязывает его к конкретному адресу и порту: «я занимаю порт 8080 на этой машине». После этого listen() переводит сокет в режим ожидания, и система начинает складывать входящие подключения в очередь. Занятые порты, кстати, удобно смотреть прямо из терминала: нужное есть в подборке основных команд Linux.

Шаг 2: клиент стучится

Клиент тоже вызывает socket(), но bind() ему обычно не нужен: свободный порт система подберёт сама. Вместо этого он вызывает connect() и указывает, к какому адресу и порту хочет подключиться.

Шаг 3: трёхстороннее рукопожатие

Если речь про TCP, соединение открывается не мгновенно. Стороны обмениваются тремя служебными пакетами: клиент шлёт SYN («хочу соединиться»), сервер отвечает SYN-ACK («слышу, тоже готов»), клиент подтверждает ACK («принято»). Это и есть трёхстороннее рукопожатие. Только после него канал считается установленным.

Шаг 4: сервер принимает клиента

Сервер вызывает accept() и достаёт подключение из очереди. Тут случается момент, который многих сбивает с толку: accept возвращает новый, отдельный сокет персонально для разговора с этим клиентом. Исходный слушающий сокет остаётся на посту и продолжает принимать следующих. Поэтому один сервер спокойно держит тысячи параллельных собеседников.

Шаг 5: обмен данными

Дальше обе стороны используют send() и recv() (в Python это sendall() и recv()). Данные уходят в буфер операционной системы, оттуда в сеть, на том конце снова в буфер и только потом в программу.

Шаг 6: закрытие

Когда разговор окончен, вызывается close(). Соединение разбирается, дескриптор освобождается. Но порт освобождается не сразу: какое-то время он проводит в состоянии TIME_WAIT, дожидаясь опоздавших пакетов. Именно из-за этого при быстром перезапуске сервера вылезает ошибка про занятый адрес, и ниже мы разберём, что с ней делать.

CheckroiCheckroiПодборка курсов по сетевым технологиям22 курса • 11 школСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить

Виды сокетов

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

TCP-сокеты, они же потоковые

Обозначаются как SOCK_STREAM. Это сокеты с гарантией: данные дойдут целиком, в том же порядке, в каком их отправили, а потерянные куски система отправит повторно сама. За гарантию приходится платить рукопожатием перед началом и небольшими накладными расходами на подтверждения.

На TCP работает почти всё, что вы видите каждый день: загрузка сайтов, почта, мессенджеры, передача файлов.

UDP-сокеты, они же дейтаграммные

Обозначаются как SOCK_DGRAM. Работают по принципу «отправил и забыл»: соединение не устанавливается, доставка не гарантируется, порядок тоже. Зато быстро и без задержки на рукопожатие.

Такой размен выгоден там, где свежие данные важнее полных. В онлайн-игре потерянный пакет с координатами игрока проще выбросить, чем ждать его повторной отправки: за это время уже придут новые координаты. По той же причине на UDP работают голосовые звонки, видеотрансляции и служба доменных имён.

Параметр TCP-сокет UDP-сокет
Установка соединения Нужна, через рукопожатие Не нужна
Гарантия доставки Есть, потери переотправляются Нет
Порядок данных Сохраняется Может нарушиться
Скорость Ниже из-за подтверждений Выше
Формат данных Непрерывный поток байтов Отдельные пакеты
Типичные задачи Сайты, почта, файлы, чаты Игры, звонки, стримы, DNS

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

Unix-сокеты для программ на одной машине

Если две программы работают на одном компьютере, гонять данные через сетевой стек расточительно. Для этого есть Unix-сокеты (доменные сокеты). Вместо пары «адрес и порт» у них путь в файловой системе, например /tmp/app.sock, и данные не выходят за пределы машины.

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

Сырые сокеты

SOCK_RAW дают прямой доступ к пакетам, минуя обычную обработку протоколов. На них построены утилиты диагностики сети и инструменты анализа трафика. Для запуска почти всегда нужны права администратора, и в обычной разработке они не встречаются.

Отдельно про IPv4 и IPv6

Кроме типа сокета указывают ещё и семейство адресов. AF_INET означает привычные адреса вида 192.168.1.1, а AF_INET6 — длинные шестнадцатеричные адреса нового формата, которых хватит на любое количество устройств. Логика работы не меняется, отличается только запись адреса, поэтому в учебных примерах спокойно берите первый вариант.

WebSocket и обычный сокет: в чём разница

Это второе место, где новички регулярно спотыкаются. Слова похожи, поэтому кажется, что WebSocket — это просто «сокет для браузера». Связь есть, но сущности разные.

WebSocket — это протокол поверх TCP, придуманный специально для браузеров. Обычный сокет браузер открыть не может: страница живёт в песочнице и в сеть напрямую не ходит. WebSocket решает эту проблему хитро: соединение начинается как обычный HTTP-запрос, а затем стороны договариваются «дальше говорим иначе» и переключают уже открытый канал в двусторонний режим.

Разница с обычным HTTP принципиальная. В классическом вебе инициатива всегда у браузера: он спросил, сервер ответил, соединение закрылось. Сервер не может первым что-то прислать. С WebSocket канал остаётся открытым, и сервер шлёт данные сам, когда ему есть что сказать. Отсюда живые котировки, уведомления и чаты без перезагрузки страницы.

Параметр Обычный TCP-сокет WebSocket HTTP-запрос
Кто может использовать Любая программа Браузер и сервер Любой клиент
Кто начинает разговор Любая сторона Любая после подключения Только клиент
Время жизни канала Пока не закроют Пока не закроют Один запрос и ответ
Формат данных Поток байтов Сообщения с границами Запрос и ответ
Типичная задача Серверы, обмен между сервисами Живые обновления на странице Загрузка страниц и API

Рядом часто упоминают библиотеку Socket.IO. Это надстройка над WebSocket, а не самостоятельный протокол: она добавляет автоматическое переподключение, комнаты и запасной вариант связи, если WebSocket по каким-то причинам не работает.

Отдельно эту технологию почти не преподают, она идёт довеском к бэкенду или фронтенду. Программы, где она заявлена явно, собраны в подборке курсов с WebSocket.

Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 700 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

Где вы уже пользуетесь сокетами каждый день

Полезно увидеть знакомые вещи в новом свете. Всё, что перечислено ниже, работает на тех самых сокетах.

Браузер. Вы открыли сайт, браузер поднял TCP-соединение до сервера на порту 443, обменялся ключами шифрования и запросил страницу. На одну страницу таких соединений уходит несколько десятков: под картинки, шрифты и скрипты.

Мессенджер. Приложение держит постоянное соединение с сервером, поэтому сообщение прилетает мгновенно, а не после того, как телефон сам сходит и спросит.

Онлайн-игра. Позиции игроков летают короткими пакетами по UDP по несколько десятков раз в секунду. Потерянный пакет никто не переспрашивает, вместо него просто приходит следующий.

Ваш собственный сайт на хостинге. Веб-сервер общается с обработчиком кода и с базой данных обычно через Unix-сокеты, потому что все трое живут на одной машине.

Даже разработчик, который никогда не писал bind руками, всю карьеру работает на конструкции из этой статьи.

CheckroiCheckroiПодборка курсов по Python463 курса • 45 школСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить

Первый сервер и клиент на Python

Теория укладывается в голове, когда вы её запустили. Соберём эхо-сервер: он принимает строку и возвращает её обратно. В Python модуль socket встроенный, устанавливать ничего не нужно.

Файл server.py:

import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(("127.0.0.1", 8080))
server.listen()
print("Жду подключений на 8080")

while True:
    conn, addr = server.accept()
    print("Подключился", addr)
    data = conn.recv(1024)
    conn.sendall(b"Ты прислал: " + data)
    conn.close()

Файл client.py:

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("127.0.0.1", 8080))
client.sendall("Привет, сокет".encode("utf-8"))
print(client.recv(1024).decode("utf-8"))
client.close()

Запустите сначала сервер, потом в другом окне терминала клиент. В окне клиента появится ответ, а в окне сервера строчка про подключение. Поздравляем, вы только что подняли сеть между двумя программами.

Разберём непонятное. AF_INET означает «работаем по обычным интернет-адресам четвёртой версии». SOCK_STREAM означает «нужен TCP». Адрес 127.0.0.1 — это localhost, то есть сам ваш компьютер: удобно, когда клиент и сервер запущены на одной машине. Число 1024 в recv задаёт, сколько байтов забрать за один раз.

Отдельно обратите внимание на строку с setsockopt и флагом SO_REUSEADDR. Она разрешает занять порт, который ещё дожидается в состоянии TIME_WAIT, и избавляет вас от самой популярной ошибки новичка. Без неё перезапустить сервер сразу после остановки не получится.

Логика одинаковая во всех языках. В Go это пакет net, в Java это классы ServerSocket и Socket, в Node.js модуль net. Названия отличаются, последовательность создать, привязать, слушать, принять остаётся той же.

Сколько клиентов выдержит один сервер

Учебный пример выше умеет говорить только с одним собеседником: пока сервер занят первым клиентом, второй ждёт в очереди. Для настоящей работы этого мало, и тут появляется первая серьёзная развилка.

По умолчанию сокеты блокирующие. Вызов recv честно останавливает программу и ждёт данных сколько потребуется. Пока он ждёт, ничего другого не происходит. Обойти это можно тремя способами.

  • Отдельный поток на каждого клиента. Самый понятный вариант и хороший учебный шаг. Упирается в память: тысяча клиентов означает тысячу потоков, и операционная система начинает тратить больше сил на переключение между ними, чем на саму работу.
  • Неблокирующий режим и опрос. Сокет переводят в режим, где вызовы возвращаются мгновенно, а программа сама спрашивает систему, по каким соединениям появились данные. Механизмы называются select, poll и epoll, и именно на последнем построены современные веб-серверы.
  • Асинхронный код. Надстройка над предыдущим пунктом, где сложность спрятана в библиотеку. В Python это asyncio, в Node.js асинхронность встроена изначально.

Есть и жёсткие потолки. Число одновременно открытых сокетов ограничено лимитом дескрипторов на процесс: по умолчанию в Linux это часто 1024, и лимит поднимается настройкой системы. А число исходящих соединений к одному и тому же адресу упирается в диапазон свободных портов, то есть примерно в 65 тысяч.

Ориентир по порядку величин. Схема «поток на клиента» комфортно живёт до нескольких сотен соединений. Дальше нужен epoll или асинхронность, и тогда десятки тысяч клиентов на одной машине становятся нормой.

Пять ошибок новичка и что означают их тексты

Рой спокойно разбирается с типовыми ошибками соединения по чек-листу

Первые грабли у всех одинаковые, и в статьях-объяснялках их обычно не разбирают. Держите список того, обо что вы споткнётесь на этой неделе.

Ошибка 1: Address already in use

Порт занят. Либо где-то фоном висит старая копия вашего сервера, либо предыдущее соединение сидит в TIME_WAIT. Лечится флагом SO_REUSEADDR из примера выше или сменой порта. Найти виновника можно командой lsof -i :8080.

Ошибка 2: Connection refused

Вы достучались до машины, но на этом порту никто не слушает. Обычно значит, что сервер не запущен или запущен на другом порту. Отличайте от таймаута: refused означает, что машину нашли, но дверь закрыта, а таймаут означает, что до машины вообще не доехали, и виноват скорее фаервол или сеть.

Ошибка 3: программа замирает на recv или accept

Ничего не сломалось. По умолчанию сокеты блокирующие: вызов честно ждёт данных и не отдаёт управление, пока они не придут. Если ждать не хочется, ставьте таймаут через settimeout() или переходите к неблокирующему режиму, где программа успевает заниматься другими делами.

Ошибка 4: сообщения слипаются или приходят кусками

Самая коварная. TCP передаёт поток байтов, а границ между сообщениями в нём нет. Отправили три коротких сообщения подряд, а на том конце они пришли одной строкой. Отправили одно длинное, и оно приехало двумя кусками. Границы придумывает ваш код: например, ставит перенос строки в конце сообщения или пишет его длину в первых четырёх байтах.

Как всё-таки разделить сообщения

Раз TCP границ не ставит, их ставит ваш код, и вариантов ровно три.

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

Длина в начале. Первыми идут четыре байта с длиной сообщения, дальше само сообщение. Получатель читает четыре байта, узнаёт, сколько ждать, и добирает ровно столько. Способ надёжный и работает с любыми данными, включая картинки.

Готовый формат. Взять протокол, где вопрос уже решён: тот же WebSocket отдаёт сообщения целиком, потому что границы прописаны в его спецификации.

Новичкам стоит начинать с первого варианта и переезжать на второй, как только в обмене появляются не только строки.

Ошибка 5: на localhost работает, у друга нет

Адрес 127.0.0.1 доступен только вашему компьютеру. Чтобы сервер слушал внешние подключения, привязывайте его к 0.0.0.0. Дальше начинается сетевая часть: белый IP-адрес, проброс порта на роутере и разрешение в фаерволе. Для учебных задач проще протестировать в пределах домашней сети.

Как посмотреть свои сокеты руками

Сокеты перестают быть абстракцией, когда вы видите их списком. Несколько команд, которые стоит знать.

  • ss -tulpn — современный способ увидеть все слушающие сокеты в Linux и то, какие программы их держат.
  • netstat -an — то же самое, работает и в Windows, и в macOS.
  • lsof -i :8080 — кто именно занял конкретный порт.
  • nc localhost 8080 — подключиться к своему серверу вручную и что-нибудь ему написать, без всякого клиентского кода.

Запустите учебный сервер и посмотрите на него через ss -tulpn. Увидеть собственную программу в списке слушающих полезнее любого объяснения: обычно после этого тема щёлкает окончательно.

Кому сокеты нужны на работе

Честный ответ: напрямую их пишут реже, чем кажется. Большинство задач закрывают фреймворки и библиотеки, внутри которых те же accept и recv. Но понимание уровня ниже отличает специалиста, который чинит проблему, от специалиста, который её гуглит.

  • Бэкенд-разработчик — настраивает веб-серверы, разбирается с зависшими соединениями и лимитами, поднимает живые обновления через WebSocket. Подробности профессии собрали в материале «Как стать backend-разработчиком».
  • Сетевой инженер — читает состояния соединений и диагностирует, где теряются пакеты.
  • Специалист по информационной безопасности — анализирует трафик и понимает, какие порты открыты наружу.
  • Разработчик встраиваемых систем — учит датчик отправлять показания на сервер по TCP.
  • Геймдев — строит обмен состоянием между игроками, чаще всего поверх UDP.

По деньгам ориентир такой: у бэкендеров сетевая часть входит в базовые требования уже на уровне джуна. Сколько за это платят, мы разбирали в обзоре зарплат backend-разработчиков.

С чего начать изучать сокеты

План на пару вечеров, который переводит тему из «читал» в «делал».

  • Вечер первый. Запустите эхо-сервер и клиент из этой статьи. Поменяйте порт, поменяйте текст ответа, посмотрите на сокет через ss -tulpn.
  • Вечер второй. Научите сервер держать нескольких клиентов сразу: сначала через потоки, потом попробуйте вариант без них.
  • Вечер третий. Соберите чат на двоих в терминале и придумайте, как разделять сообщения в потоке байтов.
  • Вечер четвёртый. Перепишите обмен на UDP и понаблюдайте, что меняется.
  • Вечер пятый. Сделайте страницу с живым счётчиком на WebSocket.

Язык для старта не принципиален, но Python экономит силы: модуль встроенный, кода мало, ошибки читаемые. Если вы только выбираете первый язык, посмотрите курсы по Python, а сетевую часть добавите вторым шагом.

Если сжать статью до одного абзаца: сокет — это пара «адрес и порт» плюс объект, через который программа читает и пишет. Всё остальное сводится к двум вопросам: какой протокол выбрать и как обозначить границы сообщений.

Где научиться сетевому программированию

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

КурсШколаСтоимость со скидкойВ рассрочкуДлитель­ностьОбзор курса от Checkroi
Нейросети для рабочих задач
Перейти на сайт курса
SkillboxSkillbox31 290 ₽2608 ₽/мес.1 месяцОбзор курса
Нейросети. Практический курс
Перейти на сайт курса
SkillboxSkillbox74 900 ₽6242 ₽/мес.3 месяцаОбзор курса
Нейросети для каждого: как решать рабочие задачи быстрее
Перейти на сайт курса
НетологияНетология57 000 ₽2763 ₽/мес.6 недельОбзор курса
Программирование для анализа данныхSkyproSkypro134 640 ₽5500 ₽/мес.12 месяцевОбзор курса
Профессия «Python-разработчик»
Перейти на сайт курса
SkillboxSkillbox157 335 ₽5987 ₽/мес.10 месяцевОбзор курса
Профессия «Fullstack-разработчик на PHP»
Перейти на сайт курса
SkillboxSkillbox166 715 ₽5378 ₽/мес.12 месяцевОбзор курса
Frontend-разработчик с нуля
Перейти на сайт курса
НетологияНетология123 700 ₽5385 ₽/мес.10 месяцевОбзор курса
Fullstack-разработчик на Python
Перейти на сайт курса
НетологияНетология161 200 ₽7125 ₽/мес.21 месяцОбзор курса
Профессия «Разработчик игр на Unity с нуля»
Перейти на сайт курса
SkillboxSkillbox130 521 ₽3679 ₽/мес.10 месяцевОбзор курса
PHP-разработчик с нуля до PRO
Перейти на сайт курса
SkillboxSkillbox114 876 ₽4176 ₽/мес.7 месяцевОбзор курса

Больше программ — в полном каталоге курсов по программированию и IT

Если хочется сначала посмотреть на смежные темы, у нас есть разборы «Что такое CDN» и «Коды ответов сервера». Обе статьи про тот же слой сети, только с другой стороны.

Часто задаваемые вопросы

Что такое сокет простыми словами?

Сокет — это точка, через которую программа отправляет и принимает данные по сети. Он задаётся парой «IP-адрес плюс порт»: адрес говорит, до какого компьютера доехать, а порт — какой именно программе на нём отдать данные. Программист просто пишет байты в сокет и читает их оттуда, а всю доставку берёт на себя операционная система.

Чем сокет отличается от порта?

Порт — это просто число от 1 до 65535, оно существует само по себе. Сокет — это живой объект внутри работающей программы, который к этому порту привязан. Порт можно назвать, а сокет нужно создать. Грубо говоря, порт — номер квартиры, а сокет — открытый почтовый ящик в ней.

Сокет — это программа или деталь компьютера?

Зависит от того, о каком сокете речь. Сетевой (программный) сокет — это объект в памяти процесса, никакого железа. Процессорный сокет — это физический разъём на материнской плате под процессор: LGA1700 у Intel, AM4 и AM5 у AMD. Слова одинаковые, а сущности не связаны между собой.

Как узнать сокет своего процессора?

Тремя способами: через бесплатную утилиту CPU-Z на вкладке CPU, в описании модели процессора на сайте производителя или в характеристиках материнской платы. При апгрейде сверяйте сокет и у процессора, и у платы сразу — переходников между разными сокетами не существует.

В чём разница между TCP- и UDP-сокетом?

TCP-сокет даёт гарантию: данные дойдут целиком и в правильном порядке, потерянное отправится повторно. Но перед обменом нужно рукопожатие, и это занимает время. UDP-сокет работает по принципу «отправил и забыл»: быстрее, но без гарантий доставки и порядка. Если сомневаетесь, берите TCP.

Чем WebSocket отличается от обычного сокета?

WebSocket — это протокол поверх TCP, придуманный для браузеров, потому что страница не может открыть обычный сокет напрямую. Соединение начинается как HTTP-запрос, а потом переключается в двусторонний режим и остаётся открытым. Ещё одно отличие: WebSocket отдаёт сообщения целиком, а обычный TCP-сокет — сплошной поток байтов без границ.

Зачем нужны сокеты, если есть HTTP-запросы?

HTTP работает поверх TCP, а TCP работает через сокеты, то есть они лежат этажом ниже. Спускаться на этот уровень имеет смысл, когда нужен свой протокол, связь в обе стороны, максимальная скорость или когда что-то сломалось и надо понять, почему соединения зависают.

Нужно ли знать сокеты веб-разработчику?

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

С какого языка проще начать изучать сокеты?

С Python: модуль socket встроенный, ставить ничего не нужно, рабочий сервер помещается в пятнадцать строк, а сообщения об ошибках читаемые. Логика везде одинаковая, поэтому потом вы узнаете её и в Go, и в Java, и в Node.js. Начать можно с курсов по Python.

Что означает ошибка «Address already in use»?

Порт уже занят. Либо фоном висит старая копия вашего сервера, либо предыдущее соединение ещё сидит в состоянии TIME_WAIT и не отпустило порт. Лечится флагом SO_REUSEADDR при создании сокета или сменой порта. Найти, кто занял порт, помогает команда lsof -i :8080.

Сколько сокетов может открыть одна программа?

Упирается в два лимита. Первый — количество дескрипторов на процесс: в Linux по умолчанию часто 1024, и он поднимается настройкой системы. Второй — диапазон свободных портов, около 65 тысяч исходящих соединений к одному адресу. На практике схема «поток на клиента» живёт до нескольких сотен соединений, а с epoll или асинхронностью одна машина держит десятки тысяч.

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!