Как разгрузка сетевого адаптера TCP делает контрольную сумму TCP недействительной?
PCAP tcpdump, экспортированный и исследуемый на другой машине с wireshark, показывает много недопустимых сообщений контрольной суммы TCP. Это известное и задокументированное явление при использовании функции разгрузки TCP: https://wiki.wireshark.org/TCP_Checksum_Verification
Единственное, что неясно - почему контрольная сумма неверна?
Контрольные суммы TCP рассчитываются по всему сегменту TCP с помощью псевдозаголовка и с использованием значения временной контрольной суммы всех нулей в процессе вычисления контрольной суммы ( http://www.tcpipguide.com/free/t_TCPChecksumCalculationandtheTCPPseudoHeader-2.htm). Затем псевдоголовок отбрасывается. В чем разница?
2 ответа
Сегмент TCP расположен в оперативной памяти компьютера. Он содержит все поля, необходимые для сегмента TCP.
Когда используется разгрузка контрольной суммы TCP, это происходит при передаче сегмента:
ОС заполняет каждое поле в сегменте TCP в памяти, КРОМЕ контрольной суммы. Поле контрольной суммы не вычисляется ОС, оно содержит все данные, которые были ранее в этом месте памяти.
Теперь инструменты захвата пакетов, такие как Wireshark, захватывают содержимое этой области памяти, которая содержит сегмент TCP без вычисленной контрольной суммы.
Когда ОС отправляет сегмент на NIC, аппаратное обеспечение NIC затем выполняет вычисление контрольной суммы и помещает вычисленную контрольную сумму в конкретное поле сегмента TCP. Эта контрольная сумма никогда не видна ОС или средством захвата.
Именно по этой причине Wireshark сообщает об этих ошибках.
Потому что контрольная сумма рассчитывается сетевой картой, а не операционной системой.
Вики-страница, на которую вы ссылались, объясняла это:
Если вы перехватываете данные на недавнем сетевом адаптере Ethernet, вы можете увидеть много таких "ошибок контрольной суммы". Это связано с тем, что разгрузка контрольной суммы TCP часто реализуется на этих сетевых картах и, следовательно, для пакетов, передаваемых машиной. Контрольная сумма не будет рассчитываться до тех пор, пока оборудование NIC не отправит пакет, еще долго после того, как ваш инструмент захвата перехватит пакет из сетевого стека.