Что может привести к тому, что контрольные суммы заголовков IP не будут рассчитываться для дейтаграмм UDP?

Я пытаюсь отправить дейтаграммы UDP из UdpClient в Windows XP на устройство, но оно не отвечает. Когда я смотрю на этот трафик в Wireshark, я вижу, что мои исходящие пакеты плохие, потому что все контрольные суммы их IP-заголовков равны 0x0000.

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

Я могу нормально пинговать свое устройство с обеих сетевых карт, поэтому я предполагаю, что мой код C# делает что-то неправильно, но я не уверен, что именно. Есть ли что-то, что вы можете сделать неправильно в .NET 4 в Windows XP с помощью UdpClient, чтобы вызвать это?


person John    schedule 11.07.2012    source источник


Ответы (2)


Вы видите пустую контрольную сумму, потому что Windows выполняет аппаратную разгрузку вычисления контрольной суммы. Это будет выполняться процессором сетевой карты (NIC). Захват пакета с помощью анализатора пакетов покажет пакет до того, как он будет обработан вашей сетевой картой. Вы можете отключить разгрузку на странице свойств устройства в диспетчере устройств:

введите здесь описание изображениявведите здесь описание изображения

В любом случае протокол UDP определяет контрольную сумму как необязательную, а ноль — это допустимое значение контрольной суммы. Это сделано для того, чтобы устройства с низкой вычислительной мощностью могли пропустить вычисление контрольной суммы. Контрольная сумма обычно заполняется первым сетевым узлом, обрабатывающим пакет (например, маршрутизатором). Даже если он остается равным нулю, ваше устройство все равно должно принимать пакет, поскольку он действителен.

EDIT: я только что понял, что вы говорите о заголовке IP, а не о заголовке UPD. Это относится к обоим, за исключением того, что контрольная сумма заголовка IP не является обязательной (и будет рассчитана вашей сетевой картой).

person Allon Guralnek    schedule 11.07.2012
comment
Думаю, я выберу ответ с картинками. - person John; 11.07.2012
comment
Если я отключу TCP Checksum Offload или UDP Checksum Offload, Wireshark покажет ошибку проверки контрольной суммы. У меня это работает после отключения IPv4 Checksum Offload на вкладке Advanced на картинке выше. Я использую сборку Windows 10 18363.1139. - person Wenhe Qi; 09.11.2020

Похоже проблема с драйвером. Попробуйте отключить разгрузку контрольной суммы в свойствах драйвера.

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

Для подтверждения запустите wireshark в отдельном поле, чтобы убедиться, что контрольная сумма равна нулю или не равна нулю.

Если контрольные суммы в конце концов в порядке, то, вероятно, это проблема с брандмауэром. Убедитесь, что у вас есть правило брандмауэра на локальном компьютере, разрешающее обратный трафик.

person Ben    schedule 11.07.2012
comment
@john, спасибо, что было правильно - проблема с брандмауэром или драйвером? - person Ben; 13.07.2012