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

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

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

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

Ответ 1

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

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

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

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

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

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