Поскольку при записи в сокет заголовки пакета собираются в другом месте, нежели ваши пользовательские данные, поэтому для объединения в сетевой пакет устройству требуется возможность «собрать», по крайней мере, для получения заголовки и данные.
Кроме того, чтобы избежать необходимости считывания данных процессором (и, следовательно, заполнения его кеша ненужными данными, которые больше никогда не понадобятся), сетевой карте также необходимо генерировать свои собственные контрольные суммы IP и TCP (я предполагаю, TCP здесь, потому что 99% ваших массовых передач данных будет TCP). Это нормально, потому что в настоящее время они все могут.
Что я не уверен, так это то, как все это взаимодействует с TCP_CORK.
Большинство протоколов имеют свои собственные заголовки, поэтому гипотетический протокол выглядит следующим образом:
Клиент: Отправить запрос
Сервер: отправьте несколько метаданных; отправить данные файла
Таким образом, мы имеем тенденцию иметь серверное приложение, собирающее некоторые заголовки в памяти, выполняющее write (), сопровождаемое операцией, подобной sendfile (). Я полагаю, что в этом случае заголовки все еще копируются в буфер ядра.