Ответ 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 и абстрактных классах С++, но применяется на сетевом уровне, а не в слое языка программирования.