Сколько накладных расходов накладывает SSL?

Я знаю, что нет единого жесткого ответа, но есть ли общая приблизительная оценка порядка для шифрования накладных расходов на SSL по сравнению с незашифрованной связью сокетов? Я говорю только об обработке обработки и времени проводки, не считая обработки на уровне приложений.

Обновить

Существует вопрос о HTTPS по сравнению с HTTP , но мне интересно смотреть ниже в стеке.

(Я заменил фразу «порядок величины», чтобы избежать путаницы, я использовал ее как неофициальный жаргон, а не в формальном смысле CompSci. Конечно, если бы я имел в виду это формально, как истинного выродка, я бы думал о бинарных, а не десятичная дробь! 😉

Обновить

По запросу в комментарии предположим, что мы говорим о сообщениях хорошего размера (диапазон 1k-10k) по постоянным соединениям. Таким образом, настройка соединения и накладные расходы пакетов не являются существенными проблемами.

Порядок величины: ноль.

Другими словами, вы не увидите, что ваша пропускная способность сокращается наполовину или что-то в этом роде, когда вы добавляете TLS. Ответы на «повторяющийся» вопрос в значительной степени зависят от производительности приложений и того, как это сопоставляется с накладными расходами SSL. Этот вопрос специально исключает обработку приложений и пытается сравнить только SSL-протокол SSL. Хотя имеет смысл сделать глобальный взгляд на производительность при оптимизации, это не то, о чем спрашивает этот вопрос.

Основными издержками SSL являются рукопожатие. Здесь происходит дорогостоящая асимметричная криптография. После переговоров используются относительно эффективные симметричные шифры. Вот почему очень полезно включить сеансы SSL для вашего HTTPS-сервиса, где сделано много соединений. Для долговременного подключения этот «конечный эффект» не столь значителен, и сеансы не так полезны.


Вот интересный анекдот. Когда Google переключил Gmail на использование HTTPS, дополнительных ресурсов не требовалось; нет сетевого оборудования, нет новых хостов. Это только увеличило загрузку процессора примерно на 1%.

Я второй @erickson: чистое ограничение скорости передачи данных незначительно. Современные процессоры достигают пропускной способности крипто / AES в несколько сотен Мбит / с. Поэтому, если вы не находитесь в системе с ограниченными ресурсами (мобильный телефон), TLS / SSL достаточно быстр, чтобы перемещать данные.

Но имейте в виду, что шифрование значительно упрощает кэширование и балансировку нагрузки. Это может привести к огромному снижению производительности.

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

Например, нам пришлось отказаться от требования шифрования для доступа к некоторым из наших внутренних веб-приложений – они, где рядом с непригодными для использования в Китае.

Предполагая, что вы не считаете настройку соединения (как указано в обновлении), это сильно зависит от выбранного шифра. Накладные расходы на сеть (с точки зрения пропускной способности) будут незначительными. На процессорные ресурсы будут преобладать криптография. На моем мобильном Core i5 я могу зашифровать около 250 МБ в секунду с RC4 на одном ядре. (RC4 – это то, что вы должны выбрать для максимальной производительности.) AES медленнее, обеспечивая «только» около 50 МБ / с. Таким образом, если вы выберете правильные шифры, вам не удастся удержать одно текущее kernel, занятое криптозатратами, даже если у вас есть полностью используемая линия 1 Гбит. [ Изменить : RC4 нельзя использовать, поскольку он больше не защищен. Однако аппаратная поддержка AES теперь присутствует во многих процессорах, что делает AES-шифрование очень быстрым на таких платформах.]

Однако установление соединения отличается. В зависимости от реализации (например, поддержка ложного запуска TLS), он добавит круговые поездки, что может вызвать заметные задержки. Кроме того, дорогая криптография имеет место при первом установлении соединения (вышеупомянутый процессор может принимать только 14 подключений на kernel ​​в секунду, если вы глупо использовали 4096-битные ключи и 100, если используете 2048-битные ключи). При последующих подключениях предыдущие сеансы часто используются повторно, избегая дорогого криптования.

Итак, подведем итог:

Передача по установленному соединению:

  • Задержка: почти нет
  • Процессор: незначительный
  • Полоса пропускания: незначительная

Первое подключение:

  • Задержка: дополнительные круглые поездки
  • Полоса пропускания: несколько килобайт (сертификаты)
  • ЦП на клиенте: средний
  • Процессор на сервере: высокий

Последующие объекты связи:

  • Задержка: дополнительный раунд (не уверен, что один или несколько, может быть зависимым от реализации)
  • Полоса пропускания: незначительная
  • Процессор: почти нет
  • Единство: streamовое видео в реальном времени
  • Socket.io + Node.js Запрос на перекрестный запрос заблокирован
  • Что значит связать сокет многоадресной рассылки (UDP)?
  • NetworkStream.ReadAsync с маркером отмены никогда не отменяет
  • Невозможно присвоить запрошенный адрес: JVM_Bind
  • Официальные причины для «Программного обеспечения прерывания соединения: ошибка записи сокета»
  • Могут ли сокеты TCP и UDP использовать один и тот же порт?
  • Как исправить java.net.SocketException: Неработающая труба?
  • Как найти полное имя хоста текущего компьютера в C (имя хоста и информация о домене)?
  • Как вы дросселируете пропускную способность соединения сокета в C?
  • Что представляет собой самый большой размер безопасного пакета UDP в Интернете?
  • Давайте будем гением компьютера.