Re[3]: Сетевое программирование
От: Pzz Россия https://github.com/alexpevzner
Дата: 26.08.25 08:32
Оценка:
Здравствуйте, mrTwister, Вы писали:

Pzz>>Я тут подумал, и у меня в голове нарисовался след. учебный план.


T>Про маршрутизацию не хватает: OSPF, BGP


Боюсь, столько не впихнуть.

Я имел ввиду затронуть маршрутизацию по префиксам (и прочие там классы сетей) в разговоре об различии между MAC и IP адресами, но мне кажется, сильно дальше этого идти не обязательно.
Re[4]: Сетевое программирование
От: mrTwister Россия  
Дата: 26.08.25 08:37
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Я имел ввиду затронуть маршрутизацию по префиксам (и прочие там классы сетей) в разговоре об различии между MAC и IP адресами, но мне кажется, сильно дальше этого идти не обязательно.


Не знаю, не уверен. Весь интернет работает на BGP. Это максимально фундаментальная технология, которая буквально находится в основе всего современного IT. И при этом про нее почти никто ничего не знает.
лэт ми спик фром май харт
Re[5]: Сетевое программирование
От: Pzz Россия https://github.com/alexpevzner
Дата: 26.08.25 08:55
Оценка:
Здравствуйте, mrTwister, Вы писали:

Pzz>>Я имел ввиду затронуть маршрутизацию по префиксам (и прочие там классы сетей) в разговоре об различии между MAC и IP адресами, но мне кажется, сильно дальше этого идти не обязательно.


T>Не знаю, не уверен. Весь интернет работает на BGP. Это максимально фундаментальная технология, которая буквально находится в основе всего современного IT. И при этом про нее почти никто ничего не знает.


Может это не такое уж и обязательное знание, если о нём почти никто ничего не знает?

Я тоже, должен признаться, мало чего знаю про BGP...
Re: Сетевое программирование
От: __kot2  
Дата: 26.08.25 09:33
Оценка:
LVV>Но практика вызывает у меня вопросы.
LVV>Непонятно, с чего начинать и чем заканчивать.
LVV>Ну, писание клиента и сервера — это понятно.
LVV>Но студенты зададут вопрос: а зачем nginx, IIS и проие всякие апачи, если сервер надо писать самим7
но сервера же не только для веб-страниц бывают. игрушки и всякие телеграммы имеют вполне себе самописные сервера.
Re[3]: Сетевое программирование
От: Janus Россия  
Дата: 26.08.25 09:50
Оценка:
Здравствуйте, Pzz, Вы писали:


J>>Модель osi . 90% программистов очень далеки от ее понимания.


Pzz>Она слишком академичная. Стек TCP/IP плохо на неё ложится.


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

Если студент в последствии попадет в авиацию, море и прочие конторы, где много пропитанных протоколов , хорошее знание osi тоже лишнем не будет
... Хорошо уметь читать между строк. Это иногда
приносит большую пользу
Re[4]: Сетевое программирование
От: Pzz Россия https://github.com/alexpevzner
Дата: 26.08.25 09:54
Оценка:
Здравствуйте, Janus, Вы писали:

Pzz>>Она слишком академичная. Стек TCP/IP плохо на неё ложится.


J>Это смотря как его подать Когда я учился в институте, у нас был преподаватель фанат OSI.

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

На каком уровне OSI находится IP-level VPN, который использует HTTPS для авторизации, а потом уходит в WebSocket, используя его в качестве транспорта для пакетов?

J>Если студент в последствии попадет в авиацию, море и прочие конторы, где много пропитанных протоколов , хорошее знание osi тоже лишнем не будет


Ну, наверное умение работать в авиации, это отдельный навык. Требующий, например, умения выживать при сильно формализованном процессе.
Re[5]: Сетевое программирование
От: Stanislaw K СССР  
Дата: 26.08.25 11:16
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>На каком уровне OSI находится IP-level VPN, который использует HTTPS для авторизации, а потом уходит в WebSocket, используя его в качестве транспорта для пакетов?


Любой впн находится в квантовой суперпозиции, являясь одновременно и транспортом и пэйлоадом, независимо от хендшейка и мнения наблюдателя.
Все проблемы от жадности и глупости
Re[6]: Сетевое программирование
От: Pzz Россия https://github.com/alexpevzner
Дата: 26.08.25 11:17
Оценка:
Здравствуйте, Stanislaw K, Вы писали:

Pzz>>На каком уровне OSI находится IP-level VPN, который использует HTTPS для авторизации, а потом уходит в WebSocket, используя его в качестве транспорта для пакетов?


SK>Любой впн находится в квантовой суперпозиции, являясь одновременно и транспортом и пэйлоадом, независимо от хендшейка и мнения наблюдателя.


Тут важно, чтобы от него не отваливался какой-нибудь кусок под воздействием недоброго взгляда наблюдателя.
Re[4]: Сетевое программирование
От: Skorodum Россия  
Дата: 26.08.25 11:51
Оценка: +1
Здравствуйте, Pzz, Вы писали:

Pzz>Я имел ввиду затронуть маршрутизацию по префиксам (и прочие там классы сетей)

"Классы сетей" уже несколько десятилетий как не используются Classless Inter-Domain Routing появился в 1993 году. Такие архаичные термины не стоит и упоминать т.к. это тупиковая ветвь эволюции.
Re[2]: Сетевое программирование
От: Skorodum Россия  
Дата: 26.08.25 12:03
Оценка: 19 (1) +1
Здравствуйте, Pzz, Вы писали:

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

Если начинать с низов, то как минимум надо показать и объяснить что такое tcpdump, traceroute, ip a & co, wireshark.
Looking glass сервисы и AS. DHCP и прочее DNS с HTTP это уже самая верхушка сетевого айсберга.
Re[3]: Сетевое программирование
От: Skorodum Россия  
Дата: 26.08.25 12:07
Оценка: +1
Здравствуйте, Pzz, Вы писали:

Pzz>Она слишком академичная. Стек TCP/IP плохо на неё ложится.

Прекрасно ложится, просто не для каждого уровня есть отдельный протокол.
Re[6]: Сетевое программирование
От: Stanislav V. Zudin Россия  
Дата: 26.08.25 12:29
Оценка:
Здравствуйте, Marty, Вы писали:

LVV>>Но про программирование в винде аж 5 глав подряд написано.


M>Ну, в винде есть дополнительная пачка функций WSA*, может про них? А так, API беркли сокетов точно такое же, только, как уже сказал, ioctl по другому называется, и нет poll (когда я активно с сетью возился, его не особо было и линупсах и прочих бздях). Сейчас, наверное, уже подвезли.


poll'а нет, зато есть overlapped и I/O completion ports
_____________________
С уважением,
Stanislav V. Zudin
Re[7]: Сетевое программирование
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 26.08.25 12:35
Оценка: +1
Здравствуйте, Stanislav V. Zudin, Вы писали:

M>>Ну, в винде есть дополнительная пачка функций WSA*, может про них? А так, API беркли сокетов точно такое же, только, как уже сказал, ioctl по другому называется, и нет poll (когда я активно с сетью возился, его не особо было и линупсах и прочих бздях). Сейчас, наверное, уже подвезли.


SVZ>poll'а нет, зато есть overlapped и I/O completion ports



И тут АПИ уже начинают сильно различаться
Маньяк Робокряк колесит по городу
Re[5]: Сетевое программирование
От: Janus Россия  
Дата: 26.08.25 13:01
Оценка:
Здравствуйте, Pzz, Вы писали:


Pzz>На каком уровне OSI находится IP-level VPN, который использует HTTPS для авторизации, а потом уходит в WebSocket, используя его в качестве транспорта для пакетов?

Это вопрос из серии как рассматривает самолет летчик и пассажир .
Есть еще L2TPv3 на каком уровне OSI он находится ?


J>>Если студент в последствии попадет в авиацию, море и прочие конторы, где много пропитанных протоколов , хорошее знание osi тоже лишнем не будет


Pzz>Ну, наверное умение работать в авиации, это отдельный навык. Требующий, например, умения выживать при сильно формализованном процессе.


дело не формализации. Любое сетевое взаимодействие можно описать моделью osi . Обсуждая с коллегами проприетарную сеть (протокол) вы поймете друг друга
... Хорошо уметь читать между строк. Это иногда
приносит большую пользу
Re[7]: Сетевое программирование
От: Stanislaw K СССР  
Дата: 26.08.25 13:36
Оценка:
Здравствуйте, Pzz, Вы писали:

SK>>Любой впн находится в квантовой суперпозиции, являясь одновременно и транспортом и пэйлоадом, независимо от хендшейка и мнения наблюдателя.


Pzz>Тут важно, чтобы от него не отваливался какой-нибудь кусок под воздействием недоброго взгляда наблюдателя.


Энтропия. используй её с толком.
Все проблемы от жадности и глупости
Re[6]: Сетевое программирование
От: mrTwister Россия  
Дата: 26.08.25 14:56
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Может это не такое уж и обязательное знание, если о нём почти никто ничего не знает?


Может быть, не знаю. Но для меня странно, что доставка пакетов из точки А в точку Б на другом конце света объясняется магией и это всем ок

Pzz>Я тоже, должен признаться, мало чего знаю про BGP...


Да я сам не так давно в эту тему начал погружаться и был в шоке от своей некомпетентности. Я понял, что вообще не понимал, как работает интернет и очень мне бы хотелось, чтобы про BGP мне рассказали еще в университете. Благо его придумали 36 лет назад, это не какая-то новомодная технология
лэт ми спик фром май харт
Re: Сетевое программирование
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 26.08.25 15:02
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>В общем, основной вопрос: чего давать в лабах.


А у вас то кейс какой? Системный или прикладной? Есть у студентов курс типа "сети" или это первое знакомство?

Если прикладной, то нужно смотреть адресацию, http api udp tcp dns, таймауты-обрывы. Минимально протоколы, фокус на различные задачи — передача файлов, чат, восстановление после обрыва, итд.
Здесь можно писать хоть на чем, абы работало.

Если системный — то это протоколы, сокеты и подобные вещи. Тут нужно чтото низкоуровневое, вещи типа nodejs не сгодятся.

Если курса по сетям не было, то нужно дать какую то картину мира tcp/ip osi/iso адресация порты итд, что бы могли это попробовать при помощи утилит — ping, tracert, ifconfig, route, netstat итд.
Тут я бы потратил 2 лабы чисто на докер и похожие вещи, что бы люди могли соорудить сеть и попробовать на ней разные инструменты. Если с докером тупик, то нужно чтото другое, мб ssh, telnet
Уже после этого приступать к тем самым сокетам.

Вы можете давать студентам какие то заготовки хоть на Go, что бы они дорабатывали под конкретную лабу. В этом случае вы можете увеличить объем задания, т.к. студенты будут стартовать "с трамплина"
Re[7]: Сетевое программирование
От: Pzz Россия https://github.com/alexpevzner
Дата: 26.08.25 15:20
Оценка:
Здравствуйте, mrTwister, Вы писали:

Pzz>>Может это не такое уж и обязательное знание, если о нём почти никто ничего не знает?


T>Может быть, не знаю. Но для меня странно, что доставка пакетов из точки А в точку Б на другом конце света объясняется магией и это всем ок


Ну почему магией? Маршрутом...

Pzz>>Я тоже, должен признаться, мало чего знаю про BGP...


T>Да я сам не так давно в эту тему начал погружаться и был в шоке от своей некомпетентности. Я понял, что вообще не понимал, как работает интернет и очень мне бы хотелось, чтобы про BGP мне рассказали еще в университете. Благо его придумали 36 лет назад, это не какая-то новомодная технология


А что в Интернете придумали не несколько десятков лет назад?
Re: Сетевое программирование
От: student__  
Дата: 27.08.25 08:06
Оценка: 19 (1)
Здравствуйте, LaptevVV, Вы писали:
LVV>Но студенты зададут вопрос: а зачем nginx, IIS и проие всякие апачи, если сервер надо писать самим7

Типа, зачем программировать, когда всё уже сделано до нас? Ну не программируйте, ПТУ по настройке nginx на соседней улице.

LVV>1. С++. Стандартной библиотеки нет.


База — это сокеты на С.

LVV>Но у меня 100500 книжек по программированию на основе сокетов.


Если про UNIX речь, классика — книги Стивенсона.
Но впрочем, и в винде API сокетов — перепев из юниксового API.

LVV>В точ числе и Ntnlink-сокеты.


Это всё внутрилинуксовая хрень, для программирования сетей не нужно.

LVV>Ну, тоже лучше питона, но менее приятно, чем Go


да, нафиг этот JS выкинуть из головы

LVV>В общем, основной вопрос: чего давать в лабах.


1) Пишем UDP клиент-сервер. Размыкаем кабель. Видим, что сообщение пропущено, и сетевому стеку пофиг.
Пишем TCP клиент-сервер. Размыкаем кабель. Видим, что сообщение НЕ пропущено, потому что сетевому стеку НЕ пофиг.

2) Первый вариант сервера — однопоточный, с мультиплексированием I/O.
Второй вариант сервера — многопоточный, работа с каждым клиентом в отдельном потоке.

3) Пишем сервер для ооочень большого количества клиентов (epoll), нагружаем.
Re[2]: Сетевое программирование
От: PlushBeaver  
Дата: 27.08.25 14:06
Оценка: 19 (1)
Здравствуйте, student__, Вы писали:

__>Здравствуйте, LaptevVV, Вы писали:

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

__>Типа, зачем программировать, когда всё уже сделано до нас? Ну не программируйте, ПТУ по настройке nginx на соседней улице.


То есть учиться программировать сокеты нужно из любви к искусству?
Потому что в голове преподавателя нарисован такой образ сетевого программиста?

Изучение чего угодно действительно начинается с предпосылок для применения и с границ применимости.
Формируется навык: выбирать подходящие средства для реализации сетевого взаимодействия.
(2LaptevVV) Студентам я бы изложил так.

Программирование на сокетах нужно:
* Для реализации кастомных протоколов, которые нужны:
* * Когда оверхед слишком большой:
* * * по доле служебных полей в трафике (никакой HTTP в 64 бита CAN не влезет);
* * * по тяжести разбора (реализация DHCP и TFTP в PXE);
* * * по риску багов в реализации (регулярно находят CVE в реализациях HTTP/2).
* * Когда схема работы отличается от "запроса-ответа": однонаправленная передача (телеметрия) или multicast (service discovery).
* Для реализации стандартных протоколов, которая может потребоваться:
* * Если её нет под нужную платформу или под какие-то требования (Pzz уже выступал).
* * Чтобы эффективно читать данные без промежуточных структур (сотни тысяч сообщений Netflow/sFlow в секунду).
* Для передачи дескриптора между процессами в *nix (SCM_RIGHTS), которое нужно:
* * Чтобы разделить управляющий процесс и воркеров (как в том же Nginx);
* * ЧТобы обновлять или перезапускать программу без разрыва существующих соединений (как nginx -s reload).
* Для оптимизации производительности с помощью ОС-специфичных средств (recvmmsg/sendmmsg, SO_ATTACH_FILTER, управление буфером).

Границы применимости:
* Сокетов может не быть в микроконтроллере без ОС. (Более экзотический случай: когда мы уже работаем в обход ядра.)
* Обычные (не AF_PACKET) сокеты не предназначены для обработки транзитного трафика на неопределенные адреса, т. е. в задачах файерволов и т. п.
* Производительность сокетов принципиально ограничена копированием между ядром и userspace, системными вызовами и производительностью ядра. (А как тогда? DPDK, eBPF.)

Аналогично есть причины изучать протоколы, диагностику сети и сокетов.
Какие из причин релевантны для студентов в рамках дисциплины — зависит от специальности и учебной программы.
Например, нашему "Управлению в технических системах" упомянутый в теме BGP напрочь не нужен, а "Вычислительным машинам, системам и сетям" — обязателен (хотя это уже не сетевое программирование).

__>1) Пишем UDP клиент-сервер. Размыкаем кабель. Видим, что сообщение пропущено, и сетевому стеку пофиг.

__>Пишем TCP клиент-сервер. Размыкаем кабель. Видим, что сообщение НЕ пропущено, потому что сетевому стеку НЕ пофиг.

Видим, что send/sendto отрабатывает одинаково успешно, данные одинаково не приходят.
Тут-то и начинается настоящая лаба с инспекцией системы и трафика
Правда, всё еще непонятно, зачем для этого уметь программировать сокеты.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.