Re: Сетевое программирование
От: PlushBeaver  
Дата: 24.08.25 10:22
Оценка: 38 (1)
LVV>Но практика вызывает у меня вопросы.
LVV>Непонятно, с чего начинать и чем заканчивать.
LVV>Ну, писание клиента и сервера — это понятно.
LVV>Но студенты зададут вопрос: а зачем nginx, IIS и проие всякие апачи, если сервер надо писать самим7

Студенты зададут другой вопрос: зачем писать сервер самим, если есть "nginx, IIS и прочие апачи".
Для большинства задач "сетевое программирование" — это писать хэндлеры HTTP/gRPC-запросов.
Можно жизнь прожить и про сокеты не узнать.
Обычно сети изучают снизу-вверх, поэтому смысл готовых серверов понятен — скрыть всю сложность, которую изучали перед этим, если задача позволяет.
Различать, когда позволяет и не позволяет, вы как раз должны научить.

Вы не написали цели курса.

Если под сетевым программированием понимать сокеты, то базовый уровень, который я ожидал бы на собеседовании:

* TCP и UDP (stream vs datagram sockets, строго говоря) с точки зрения того, что каждый из них уникального предлагает, и где это нужно.
* Работа с потоком TCP. Фрейминг сообщений. Обязательно давать задачу, где это вылезет (я использовал передачу файлов).
* Умение прочитать и описать протокол обмена, а затем реализовать его. Endianness, работа с битами. Проверки того, что прислали!
* Тайм-ауты, асинхронная двусторонняя коммуникация (когда каждая сторона может инициировать отправку). Хороший пример — чат. Можно на потоках, можно сразу с мультиплексором.

Продвинутый уровень работы с сокетами:

* Raw-сокеты — прикольная вещь для студентов, можно экспериментировать с протоколами низких уровней.
* Асинхронные сокеты, мультиплексирование. Здесь дело не в API, а в том, что теперь надо для каждого соединения явно выделить состояние протокола, которое раньше могло просто жить на стеке потока.
* Мультиплексирующие библиотеки: ASIO, libuv (из нативных). Async/await в Python и Node.JS — это, вообще говоря, следующий уровень, использование корутин фактически. Go позволяет тоже поработать с мультиплексором, но это будет неидеоматично, хотя и удобно. Тут большой простор для творчества в зависимости от того, что понимают студенты.
* ОС-специфичные вещи: SCM_RIGHTS, recvmmsg — обязательно в привязке к задачам, это позвоялет крутые вещи сделать и не особо сложно.

Начинать надо с инструментов диагностики и исследования:
ip, ss (Linux) или ipconfig, route, netsh (Windows),
ping, traceroute (tracert), dig (nslookup).
Но самое главное — Wireshark.
Он позволит для всех протоколов, которые рассматриваются на лекциях, детально посмотреть, как они работают на практике.
Также, поскольку на лабах надо делать две стороны взаимодействия, то удобно, когда одна уже есть готовая: netcat и какой-нибудь web-сервер (да хоть python -m http.server).
Если затронете безопасность, то еще openssl s_client/s_server, когда дело до этого дойдет.

Go как язык кажется самым удобным.
Довольно близко к сишному интерфейсу, но при этом меньше отвлекающих деталей, и главное, падает с понятными стектрейсами, в отличие от C.
Python и Node.JS для обучения плохи своей однопоточностью и более толстыми обертками: студенты не поймут ни проблем в многопоточном сервере, ни управления буфером.
Вижу много резюме тех, кто работал через сокеты Qt, но для меня это, скорее, красный флаг, что человек глубоко не погружался.

Вот курс, который я когда-то сделал и вел: http://uit.mpei.ru/study/courses/int/. Дисклемер: сейчас-то я понимаю, что там есть неудачные моменты и даже грубые ошибки в лекциях, но лабораторная часть может быть полезна. В литературе обратите внимание на Стивенса и http://beej.us/guide/bgnet.
Отредактировано 24.08.2025 10:26 PlushBeaver . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.