Сетевое программирование
От: LaptevVV Россия  
Дата: 23.08.25 12:05
Оценка:
Случился тут форс-мажор — некому преподавать
Дали мне.
Я в этом деле практически полный чайник.
Поэтому обращаюсь к народу за помощью.

Пара книжек есть: Таненбаум и Олиферы.
Вроде все, что там без программирования нужно рассказать — там есть.

Но практика вызывает у меня вопросы.
Непонятно, с чего начинать и чем заканчивать.
Ну, писание клиента и сервера — это понятно.
Но студенты зададут вопрос: а зачем nginx, IIS и проие всякие апачи, если сервер надо писать самим7

1. С++. Стандартной библиотеки нет.
Но у меня 100500 книжек по программированию на основе сокетов.
Последнее новье — https://www.piter.com/collection/kompyutery-i-internet/product/setevoe-programmirovanie-ot-osnov-do-prilozheniy
Но там этих сокетов — как собак нерезаных.
В точ числе и Ntnlink-сокеты.
Хорошая книжка^ https://www.piter.com/collection/all/product/linux-api-ischerpyvayuschee-rukovodstvo
Там 6 глав про сокеты и как-то стройненько.

А библиотеки: ASIO, POCO и еще что-то было.

2. Python. Есть стандартные (?) библиотеки (разного уровня — вплоть до сокетов)
Есть неплохая книжка про сетевое программиррование на Python
https://bhv.ru/product/setevoe-programmirovanie-na-python/
И вроде неплохо все изложено. Но а) Питон — осваивать придется самому
б) все равно неясно, что в качестве лаб давать.

3. Go. Есть стандартная библиотека
На русском практически ничего нет.
На английском довольно много. И есть документация.

Для меня — число психологически предпочтительнее Питона, но что давать в лабах — понятия не имею.

4. JS/TS + Node.JS
Ну, тоже лучше питона, но менее приятно, чем Go

В общем, основной вопрос: чего давать в лабах.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
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 . Предыдущая версия .
Re[2]: Сетевое программирование
От: LaptevVV Россия  
Дата: 24.08.25 16:49
Оценка:
PB>Вы не написали цели курса.
Дык как я могу цель обозначить, если я еще сам полный чайник.
Но студенты — программные инженеры.
И, ИМХО, про сокеты знать просто обязаны.
Тем более, практически в каждой вакансии сетевое программирование есть.
Спасибо за развернутую конкретику
Огромное спасибо за свой курс — обязательно посмотрю.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Сетевое программирование
От: Skorodum Россия  
Дата: 02.09.25 09:21
Оценка: 40 (1)
Здравствуйте, LaptevVV, Вы писали:

Кстати, одно время был популярным такой вопрос на собеседованиях "What happens when you type a URL into your browser?"
Он такой широкий, что его можно свести хоть к классическому "а вот если бы у рыбы была шерсть, у не были бы блохи, а блохи...".
Есть полезные коллективные ответы (посмотрите на количество звезд у проекта). В этом проекте советую посмотреть разделы:

DNS lookup
ARP process
Opening of a socket
TLS handshake
If a packet is dropped
HTTP protocol
HTTP Server Request Handle


Если важна актуальность, чтобы мотивировать студентов, то в России сейчас как никогда актуальны такие термины "VPN", "DPI".
Лет 15-20 назад тема была очень популярна в журнале "Хакер" (наверное, запрещенные по нынешним временам статьи).

Идея простой лабораторной по IP сетям: взять машину с двумя физичискими картами (на ноутах обычно есть Ethernet + WiFi), настроить разные подсети на интерфейсах, настроить этот хост как маршрутизатор (в Линуксе легко). Подключиться к разным интерфейсам с других компьютеров (IP адреса вручную) и проверить что, трафик ходит. На хосте-маршрутизаторе перехватить трафик в tcpdump/whireshark. Задачи со звездочкой:
* Добавить DHCP сервера
* сделать тоже самое виртуальных машинах
* сделать тоже самое в докере.

Дальше можно писать свои сервисы и шифровать трафик, опять смотреть его в tcpdump/whireshark.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.