За последние несколько дней, я увлечен протоколом ICMP, и я нашел функцию питона, которая вычисляет контрольную сумму:контрольной суммы ICMP питон с Wireshark
def carry_around_add(a, b):
c = a + b
return (c & 0xffff) + (c >> 16)
def checksum(msg):
s = 0
for i in range(0, len(msg), 2):
w = ord(msg[i]) + (ord(msg[i+1]) << 8)
s = carry_around_add(s, w)
return ~s & 0xffff
print checksum("abcdefghijklmnopqrst")
В этой картине захвата Wireshark:
Контрольная сумма «0xcfcb
», но функция в моем тесте возвращает «55 245
->0xd7cd
». Зачем ?
Большое спасибо =)
Вы говорите дейтаграмм ICMP? Тип (8 бит), код (8 бит), контрольная сумма (16 бит) и сообщение. Но как это сделать в Python? Благодаря !! – newuser
@newuser, я распространил ответ, чтобы включить более подробную информацию. Это просто вопрос включения других полей в качестве входных данных. –
спасибо вам большое. Я все понимаю !! Я мог бы получить некоторые подробности о «msg_checksum_padding» и «rest_header»? – newuser