Ответ 1
В чем разница между "сетью с нулевой копией" и "байпасом ядра"? Это две фразы, означающие одно и то же, или разные? Является ли ядро обходной техникой, используемой в "сетях с нулевой копией", и это отношения?
TL; DR - это разные понятия, но вполне вероятно, что нулевая копия поддерживается в API-интерфейсе обхода ядра.
Пользовательский обход
Этот способ коммуникации также должен быть рассмотрен. Возможно, это возможно для транзакций DMA-to-DMA, которые вообще не связаны с процессором. Идея состоит в том, чтобы использовать splice()
или аналогичные функции, чтобы избежать пользовательского пространства вообще. Обратите внимание, что при использовании splice()
весь поток данных не требуется обходить пространство пользователя. Заголовки могут считываться в пространстве пользователя, а данные передаются непосредственно на диск. Наиболее распространенным падением этого является splice()
который не выполняет выгрузку контрольной суммы.
Нулевая копия
Концепция нулевой копии заключается только в том, что сетевые буферы фиксируются на месте и не перемещаются. Во многих случаях это не очень полезно. Большинство современных сетевых устройств поддерживает разброс сборок, а также знает дескрипторы буфера и т.д. Идея заключается в том, что сетевое оборудование понимает физические указатели. Дескриптор буфера обычно состоит из,
- Указатель данных
- длина
- Следующий дескриптор буфера
Преимущество состоит в том, что заголовки сети не должны существовать бок о бок, а заголовки IP, TCP и приложений могут физически отличаться от данных приложения.
Если контроллер не поддерживает это, заголовки TCP/IP должны предшествовать пользовательским данным, чтобы они могли быть заполнены перед отправкой на сетевой контроллер.
zero copy также подразумевает некоторую настройку MMU для ядра пользователя, чтобы страницы были общими.
Обход ядра
Конечно, вы можете обойти ядро. Это то, что pcap и другое программное обеспечение сниффера делали в течение некоторого времени. Тем не менее, трудно увидеть случай, когда пользовательское пространство будет иметь определенную победу, если оно не привязано к конкретному оборудованию. Некоторые контроллеры сети могут иметь поддержку рассеяния в контроллере, а другие - нет.
Для выполнения байпаса ядра существуют различные инкарнации интерфейсов ядра.
Сложить это вместе...
Это две фразы, означающие одно и то же, или разные?
Они разные, как мы надеемся, объясняют.
Является ли ядро обходной техникой, используемой в "сетях с нулевой копией", и это отношения?
Это наоборот. Обход ядра может использовать нулевую копию и, скорее всего, будет поддерживать ее, поскольку буферы полностью контролируют приложение. Кроме того, между ядром и пользовательским пространством отсутствует обмен памяти (это означает, что не нужно использовать общие страницы MMU и любые эффекты кэша /TLB, которые могут вызывать). Поэтому, если вы используете обход ядра, часто будет полезно поддерживать нулевую копию; так что сначала вещи могут казаться одинаковыми.
Если доступен DMA с распределением рассеяния (большинство современных контроллеров), пользовательское пространство или ядро могут использовать его. нулевая копия в этом случае не так полезна.
Ссылка:
- Техническая справка о OnLoad, системе байпаса ширины ширины полосы.
- PF Ring на 2.6.32, если настроено
- Управление буферными сетями ядра Linux Дэвидом Миллером. Это дает представление о том, как управлять заголовками/трейлерами протоколов в ядре.