Как использовать разгрузку контрольной суммы TCP с сокетами RAW - PullRequest
1 голос
/ 07 июля 2011

(с использованием Linux)

Создание TCP пакетов с использованием raw sockets - оказывается, что вычисление контрольной суммы является узким местом для меня в высокопроизводительных сетях.Поскольку сетевые адаптеры поддерживают разгрузку контрольной суммы, а ethtool также говорит, что она включена, я надеялся, что смогу использовать разгрузку контрольной суммы.

Но кажется, что контрольная сумма не вычисляется, когда я использую необработанные сокеты.Есть ли способ включить разгрузку контрольной суммы tcp с использованием необработанных сокетов?

Редактировать:

На самом деле поведение моей машины / NIC (Thinkpad x201) не похоже наслишком логично: при отправке пакетов с обычными сокетами tcp все контрольные суммы неверны, как на петлевом интерфейсе, так и между компьютерами.Как ни странно, другая машина молча доставляет пакеты, хотя?

Edit2: Хорошо, теперь я только что посмотрел на пакеты не на той машине, разгрузка работает.Но когда я оставляю поле tcp_checksum 0, оно не заполняется, оно просто остается равным 0.

1 Ответ

0 голосов
/ 13 августа 2011

У меня такая же проблема: отправил TCP или UDP-пакет в необработанном сокете, но не могу воспользоваться сетевым адаптером, чья контрольная нагрузка-разгрузка включена. Хотелось бы, чтобы была функция типа setsockopt () или ioctl (), которая разрешает выгрузку контрольных сумм в необработанном сокете.

На вопрос, почему wireshark показывает пакеты с ошибками контрольной суммы, но хост-приемник все равно принимает все пакеты, причина в том, что wireshark (через winpcap и т. Д., Если в Windows) перехватывает пакеты до того, как пакеты достигли сетевой карты ОС. Пакеты не имеют полей контрольной суммы, правильно заполненных ОС или приложением - для этого предназначена функция разгрузки контрольной суммы на сетевой плате.

Вопрос в том, как включить NIC для выгрузки контрольной суммы в необработанном сокете.

...