Итак. Исходная ситуация. Есть пять серверов, построенных на материнских платах Supermicro. Описываю модель материнской платы и модель сетевого адаптера (все адаптеры интегрированы в мать), а также тип операционной системы, стоящей на компьютере:
сервер 1 и сервер 2:
мать - P4DMS-6GM.
NIC1 - Intel PRO/100 S Server Adapter (82550).
NIC2 - Intel PRO/1000 XT Network Connection (i82544GC).
OS - сервер 1 - Win2k3, сервер 2 - Win2k
сервер 3:
мать - X5DMS-6GM.
NIC1 - Intel PRO/100 PCI Adapter (82551).
NIC2 - Intel PRO/1000 MT Network Connection (i82545EM).
OS - Win2k3
сервер 4:
мать - X5DP8-G2.
NIC1 - Intel PRO/1000 MT Dual Port Server Adapter (i82546EB).
NIC2 - Intel PRO/1000 MT Dual Port Server Adapter (i82546EB).
OS - Win2k3
сервер 5:
мать - X6DA8-G2.
NIC1 - Intel PRO/1000 MT Dual Port Server Adapter (i82546EB).
NIC2 - Intel PRO/1000 MT Dual Port Server Adapter (i82546EB).
OS - Win2k3
На компьютерах стояли драйвера сетевых адаптеров, поставлявшихся вместе с материнскими платами. И вот, значит, решил я обновить все драйвера, стоявшие на серверах. Установив сначала драйвера на сервер 2 и погоняв их немного, я установил их на все остальные серверы. И вот тут начались проблемы. Через некоторое время пользователи стали сообщать мне, что у них стали отваливаться сетевые диски, пропадать сетевое окружение, а в логи серверов стали кучей сыпаться ошибки (с интервалом 30 - 60 минут) службы браузера о том, что она не может получить список резервных браузеров (ошибки 8032 и 8021) с контроллера домена. Это происходило на всех серверах, кроме сервера 2 - он является контроллером домена (и это, кстати, наш самый старый сервер - ему уже около года). Вот в этом сервере журнал был девственно красив - одни лишь информационные сообщения о старте - стопе системы - прям мечта любого сисадмина! В конечном итоге, проверив все, я все-таки пришел к выводу, что дело не в службе браузера, а в самой сети, и, как это не печально, возможно, в самих адаптерах или драйверах ФИРМЫ ИНТЕЛ (о боги, простите меня за глумление над вами). Опускаю полторы недели упорного сниффинга и исследований. Вот что я выяснил:
В серверных сетевых адаптерах интел используются аппаратные механизмы подсчета контрольной суммы заголовков IP и TCP, а также аппаратный механизм фрагментации TCP пакетов. И эти механизмы не всегда работают корректно.
Случай первый. Обычная рабочая станция testerver с Realtek 8139 по Fast Ethernet качает файл с сервера. При этом на них обоих запущен Microsoft Network Monitor. Результаты сохраняются в файлы. Затем в каждом файле находится одинаковая сессия TCP, фильтруется, и уже эти результаты в виде файлов я представляю Вам. Причем не имеет значения, какая это мать, какой адаптер работает на сервере, и какая текущая версия драйвера. В этой ситуации все адаптеры (по крайней мере, стоящие у нас) и драйверы, действуют одинаково. Все аппаратные механизмы включены по умолчанию.
http://dmaltk.narod.ru/t-8-ta.cap - со стороны Testserver
http://dmaltk.narod.ru/t-8-8a.cap - со стороны Север 2
MAC адрес "Сервер 2"=003048249093
MAC адрес "Testserver"=000C6E3129C9
Сравнив эти два файла, видим интересную картину в кадре №2 в t-8-8a.cap. Контрольная сумма IP заголовка равна 0, а должна быть равна 0xFD12. Т.е. в отправленном пакете в IP заголовке контрольная сумма равна 0. Кошмар! Ошибка! Неверно сформированный пакет ушел в сеть! Но не будем торопиться. Посмотрим, как этот пакет принял Testserver. Смотрим пакет №2 в файле t-8-ta. Оказывается, в заголовке IP, принятом Testserver, записано правильное значение контрольной суммы - 0xFD12. Это как же получается? Вычислением контрольной суммы занимается адаптер. В тоже время, копия пакета передается наверх - драйверу и операционной системе (и в таком виде он попадает в NetMon). И в этой копии IP checksum равна 0. А в реальном пакете, который уходит в сеть, адаптер все-таки правильно заносит значение контрольной суммы. Не знаю, почему операционная система игнорирует неправильно заполненное поле IP checksum и кто тут виноват - Intel или Microsoft. Так работает функция аппаратного вычисления контрольной суммы IP заголовка во всех исходящих от Сервер 2 пакетах. Это видно, если t-8-8a.cap отфильтровать по отправитель:Сервер 2, получатель: Testserver, IP checksum: exists.
Рассмотрим далее пакет №2 в t-8-8a.cap, а конкретно поле контрольной суммы TCP заголовка. Он тоже рассчитывается аппаратно адаптером. И что мы видим? Самостоятельно рассчитав контрольную сумму, NetMon кричит - Ошибка!!! Контрольная сумма равна 0x4BCA, а должна быть 0x7DB3. А теперь посмотрим, что принял сетевой адаптер на Testserver. Контрольная сумма равна 0x7DB3. Что ж, все правильно. Testserver не сбрасывает сессию и отвечает на принятый пакет, файл и дальше продолжает копироваться... Но мне кажется, что столь вольготное обращение со стандартами TCP/IP разработчиков из Intel, которые делают такие вещи, или разработчиков Microsoft, у которых операционная система пропускает мимо ушей такие трюки, неправильно и недопустимо.
А вот теперь я перехожу непосредственно к ошибке, приведшей ко всем моим проблемам. К сожалению, я тогда не догадался запустить NetMon на Сервер 2, поэтому здесь представлен содержащий ошибку файл, только со стороны Testserver, ну да это неважно. Вот по этой ссылке его можно скачать: http://dmaltk.narod.ru/12.cap. Обратите внимание - пакет №1 - запрос на NBT сессию Testserver к Сервер 2. В пакете №2 Сервер 2 возвращает положительный ответ. Но контрольная сумма TCP заголовка не совпадает с той, которую рассчитывает операционная система на Testserver. Поэтому Testserver отбрасывает этот пакет, как непригодный, и ждет, пока Сервер 2 не ретранслирует ошибочный пакет. Но Сервер 2 считает, что пакет отправлен успешно, поэтому ничего не предпринимает и ждет ответа от Testserver. Не дождавшись ответа от Testserver Сервер 2 через 3 секунды повторно передает свой положительный ответ. Но и в этот раз контрольная сумма TCP заголовка рассчитана неверно, и Testserver опять сбрасывает плохой пакет. Наконец, у него "не выдерживает терпение", и он через 3 секунды еще раз повторяет свой запрос на установление NBT сессии. Получив запрос, Сервер 2 на этот раз даже высылает подтверждение того (пакет №5), что он успешно получил запрос, и, обратите внимание - здесь правильно рассчитаны IP и TCP заголовки!!! И еще через шесть с половиной секунд присылает ответ. И снова TCP контрольная сумма рассчитана неверно, так что пакет опять Testserver'ом отбрасывается как непригодный. Наконец, у Testserver'а кончается таймаут на установление NBT сессии, и пакетом №7 он Сервер 2 посылает куда подальше. Таким образом, просидев ровно! 10 секунд перед монитором, я вижу на экране сообщение Windows "Timeout semaphore has expired". Т.о. я сделал вывод, что в алгоритме расчета контрольной суммы TCP заголовка определенных исходящих пакетов есть ошибка. Отключив в конце концов именно этот механизм, я вернул сеть в исходное состояние.
Вот что я еще должен сказать. С IP заголовком исходящих пакетов так обращаются все гигабитные адаптеры - 82544GC, 82545EM и 82546EB, вне зависимости от версии драйвера. А вот с ошибкой контрольной суммы TCP в исходящих пакетах NBT Positive Session Responce неверно работает только 82544GC именно в последней версии драйверов.
Дальше можно только предполагать. Положим, начиная с 82544 инженеры Intel внедряли аппаратные механизмы расчета контрольных сумм, улучшая от чипа к чипу работу таких механизмов. И в программном обеспечении, наверное, поначалу даже и не включали такие опции, потому что раньше таких опций я с свойствах адаптера не видел. а выпустив несколько поколений чипов и драйверов, они наконец отладили эти механизмы и полностью их включают по умолчанию в последних версиях своих драйверов. Только ошибки эти в старых чипах остались и всплывают при полном включении аппаратных методов. Ведь тот же драйвер на 82545 и 82546 работает стабильно. А в старых версиях драйвера, наверное, не задействовались аппаратные механизмы, и расчет контрольных сумм выполнялся операционной системой, как в случае простых адаптеров. Вот здесь лежат два файла, в которых тот же файл качается между двумя обычными рабочими станциями:
http://dmaltk.narod.ru/t-6-ta.cap - трафик на приемнике
http://dmaltk.narod.ru/t-6-6a.cap - трафик на передатчике.
И, наконец, для общего развития

http://dmaltk.narod.ru/t-9-ta.cap - трафик на приемнике
http://dmaltk.narod.ru/t-9-9a.cap - трафик на передатчике.
Посмотрите на пакет №10 в t-9-9a.cap и посмотрите, как он принимается на удаленной стороне.

