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

StackOverflow https://stackoverflow.com/questions/366257

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top