2009-12-14 2 views
1

Я использую pylibnet для создания и отправки UDP-пакетов. Таким образом, у UDP-пакетов, которые я построил, у всех, похоже, есть недопустимые контрольные суммы. Пример:libnet создает UDP-пакеты с недопустимыми контрольными суммами

# python 
Python 2.4.3 (#1, Sep 3 2009, 15:37:12) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-46)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 
>>> import libnet 
>>> from libnet.constants import * 
>>> 
>>> net = libnet.context(RAW4, 'venet0:0') 
>>> ip = net.name2addr4('www.stackoverflow.com', RESOLVE) 
>>> data = 'This is my payload.' 
>>> udptag = net.build_udp(sp=54321, dp=54321, payload=data) 
>>> packetlen = IPV4_H + UDP_H + len(data) 
>>> iptag = net.autobuild_ipv4(len=packetlen, prot=IPPROTO_UDP, dst=ip) 
>>> 
>>> net.write() 

Захватив выше пакет на посылающий хост обнаруживает недопустимый контрольную сумму:

# tcpdump -i venet0:0 -n -v -v port 54321 
tcpdump: WARNING: arptype 65535 not supported by libpcap - falling back to cooked socket 
tcpdump: listening on venet0:0, link-type LINUX_SLL (Linux cooked), capture size 96 bytes 
08:16:10.303719 IP (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto: UDP (17), length: 47) 192.168.55.10.54321 > 69.59.196.211.54321: [bad udp cksum 50c3!] UDP, length 0 

я делаю что-то здесь не так?

ответ

3

Это не имеет ничего общего с TCPDUMP ошибок или контрольной разгрузкой. Libnet также вычисляет контрольную сумму в пользовательском режиме (FYI). Проблема связана с тем, что вы не указали длину заголовка UDP. Это не автоматически вычисляется в pylibnet или libnet, поэтому вы должны указать его на данный момент. Ниже приведена исправленная версия вашего кода. Я применим патч к pylibnet для автоматического обнаружения длины заголовка в rc6. Следите за обновлениями http://sourceforge.net/projects/pylibnet. Я буду настаивать на выпуске новой версии, исправляющей эту проблему. Кстати, пожалуйста, не стесняйтесь обращаться ко мне через pylibnet страницы sourceforge, если у вас есть ошибки или запросы функций. Я люблю, чтобы услышать от разработчиков, используя мое программное обеспечение :)


import libnet 
from libnet.constants import * 

net = libnet.context(RAW4, 'venet0:0') 
ip = net.name2addr4('www.stackoverflow.com', RESOLVE) 
data = 'This is my payload.' 
udptag = net.build_udp(len=UDP_H+len(data), sp=54321, dp=54321, payload=data) 
packetlen = IPV4_H + UDP_H + len(data) 
iptag = net.autobuild_ipv4(len=packetlen, prot=IPPROTO_UDP, dst=ip) 

net.write() 
1

Задача расчета контрольных сумм обычно не выполняется в библиотеке пользовательского пространства, а в драйвере устройства или аппаратном обеспечении. Я считаю, что вы видите результат «выгрузки контрольной суммы», когда физическое устройство вычисляет контрольные суммы исходящих пакетов, экономя циклы ЦП на хосте. Многие (если не все) современные Ethernet-адаптеры делают это, а драйверы не вычисляют контрольную сумму. Поскольку tcpdump захватывает пакеты в драйвере, прежде чем они доберутся до физического устройства, он просто получает мусор в поле контрольной суммы (возможно, что осталось в буфере) и жалуется.

В течение 2005-2008 гг. Было зарегистрировано несколько «ошибок» против Wireshark, и Wireshark (который является всего лишь графическим интерфейсом GUI на tcpdump или его эквиваленте Windoze) теперь имеет возможность отключить проверку контрольной суммы для случая разгрузки ,

http://wiki.wireshark.org/TCP_Checksum_Verification

В любом случае, я бы не ожидал pylibnet (или ЛИБНЕТ) нести ответственность за контрольные суммы.

Смотрите также http://www.wireshark.org/docs/wsug_html_chunked/ChAdvChecksums.html#id4744523

+0

Спасибо. Я только что исследовал это, захватив эти пакеты на принимающем хосте. Контрольная сумма также плохо на принимающем хосте (и такое же значение наблюдается при захвате на отправляющем узле). Таким образом, это не похоже на разгрузку контрольной суммы. – Mox

+0

Если принимающий хост реализует стандартный стек протоколов или существует по крайней мере один маршрутизатор между двумя узлами, пакеты никогда не должны быть видимыми на принимающем узле. Что-то еще происходит. –

1

Я обновил pylibnet включить определение авто размера для полой длиной в большинстве заголовков. Таким образом, если вы забудете указать длину заголовка для любого из требующих его заголовков, он попытается автоматически определить его. Сохраняет головную боль при выяснении, почему ваша контрольная сумма плохая;)

+0

Отлично. Спасибо за помощь! – Mox

Смежные вопросы