Все, что должен знать разработчик с ++ о сетевом программировании?

Поэтому я много занимаюсь высокопроизводительным сетевым программированием, используя Boost :: Asio (или, если хотите, только Asio), и достаточно хорошо понимаю основы протоколов TCP и UDP. Мне интересно, хотя, потому что я все еще не считаю себя экспертом в области сетевых технологий, несмотря на свои знания, что является хорошим способом сформулировать основы того, что должны знать сетевые программисты, особенно для тех, кто пытается повысить производительность своих крупных сетевых базирующихся Приложения?

Существует большое эссе о программистах и ​​о том, что они должны знать о памяти (см. Ниже), поэтому мне интересно, собрал ли кто-то что-то подобное для работы в сети.

Что каждый программист должен знать о памяти

14.12.2008 07:03:10
1 ОТВЕТ
РЕШЕНИЕ

Некоторые пули указывают на то, что вы должны знать:

  • Как и почему TCP работает ... 3-х сторонние рукопожатия, подтверждение, задержка подтверждения, Nagling, протокол скользящего окна. Для каждой из этих функций есть конкретная причина ... и все они могут нарушить производительность вашего приложения, если с ним обращаться неправильно.
  • UDP multicast ... даже если вы никогда не думаете, что будете его использовать, вам нужно знать, почему он существует, чтобы вы могли принимать обоснованные решения при проектировании систем.
  • Фрагментация IP и влияние MTU.
  • Двоичная сериализация и упорядочение сетевых байтов (даже если вы просто собираетесь использовать протобуферы Google, приятно понять, почему они эффективны).
  • Сериализация Ascii и создание сообщений (что \r\n\r\nозначает HTTP?)
  • Различные модели диспетчеризации ввода-вывода: предварительная обработка в стиле Apache, потоковое соединение, однопотоковая обработка на основе событий, обработка рабочих потоков и т. Д.
  • Влияние уязвимости переполнения буфера в сетевом приложении
  • Проектирование на основе протокола, в отличие от проектирования на основе API или библиотеки
  • асинхронные против синхронных протоколов. Многие высокопроизводительные системы являются асинхронными. HTTP является синхронным, если вы не используете конвейерную обработку, и даже в этом случае существует множество ограничений на то, что возможно ... например, нет неправильных ответов.

Обновление: Что означает проект на основе протокола?

Рассмотрим HTTP, протокол Интернета. Apache, IIS, Lighttpd, Firefox, Opera, WebKit и т. Д. Все эти части программного обеспечения говорят на HTTP. Вполне возможно, что никто из них не делится кодом для этого. Недостатком, конечно же, является повышенная вероятность ошибок из-за чистого объема кода. Есть множество минусов:

  • Любая программа может общаться через HTTP, независимо от языка реализации
  • Легкие / встроенные среды могут выбирать подмножество протокола, а не использовать все это
  • Можно оптимизировать обработчик протокола для конкретных ситуаций. Невозможно оптимизировать библиотеку, не жертвуя общностью.
  • Разнообразие различных реализаций заставляет поставщиков библиотек устранять ошибки (а не просто устранять их, потому что все используют одну и ту же библиотеку).
  • Для пользователей HTTP нет организационной или договорной нагрузки, нет лицензионных сборов.

При разработке сетевого протокола вы можете создать несколько API-интерфейсов, каждый из которых предназначен для конкретных случаев использования. Или вы можете построить один, решать только вам. Компоненты сетевого программного обеспечения могут быть обновлены независимо друг от друга. По сути, все, что вы слышите, хорошо для интерфейсов Java / C # и абстрактных классов C ++, но применяется на сетевом уровне, а не на уровне языка программирования.

14
14.12.2008 17:26:46
Спасибо, отличный список. Можете ли вы рассказать об этом подробнее? «Дизайн на основе протокола, в отличие от дизайна на основе
ApplePieIsGood 14.12.2008 14:22:53
Ах, понял, это имеет смысл. Благодарю за разъяснение. Любая рекомендация о том, где прочитать об этих вещах? Помимо многотомной серии книг по TCP, что-нибудь более сжатое и ориентированное на разработчиков?
ApplePieIsGood 14.12.2008 17:30:32
Извините, я не знаю ни одного справочного материала для этого ... это все самородки, которые я подобрал на работе.
Tom 14.12.2008 18:05:00
Нельзя забывать стратегии реализации сервера (1 процесс на соединение, 1 поток на соединение и т. Д.) И обработку всех возможных сценариев в приложении клиент-сервер. Все это покрыто сетевым программированием в Unix amazon.com/Unix-Network-Programming-Addison-Wesley-Professional/…
Reginaldo 10.06.2009 18:55:18