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