Проверка значения контрольной суммы через Wireshark

#udp #wireshark #checksum

#udp #wireshark #контрольная сумма

Вопрос:

Я пытаюсь проверить правильность значения контрольной суммы UDP-пакета, проверяя пакет с помощью Wireshark. В этом конкретном пакете, на который я смотрю, значения заголовков UDP следующие:

Порт источника: 53 (0000 0000 0011 0101)

Порт назначения: 64992 (1111 1101 1110 0000)

Длина: 64 (0000 0000 0100 0000)

Теперь, если эти значения добавлены, сумма равна 65109 (1111 1110 0101 0101)

Итак, я ожидаю, что значение контрольной суммы будет 426 (0001 1010 1010) , которое является дополнением 1 к сумме.

Но в Wireshark значение контрольной суммы равно 0x63c7 , и это говорит о том, что эта контрольная сумма верна.

Я хотел бы знать, где я ошибаюсь. Любая помощь или толчок в правильном направлении были бы высоко оценены.

Заранее спасибо.

Ответ №1:

Если вы обратитесь к RFC 768, вы найдете детали, необходимые для правильного вычисления контрольной суммы:

 Checksum is the 16-bit one's complement of the one's complement sum of a
pseudo header of information from the IP header, the UDP header, and the
data,  padded  with zero octets  at the end (if  necessary)  to  make  a
multiple of two octets.

The pseudo  header  conceptually prefixed to the UDP header contains the
source  address,  the destination  address,  the protocol,  and the  UDP
length.   This information gives protection against misrouted datagrams.
This checksum procedure is the same as is used in TCP.

                  0      7 8     15 16    23 24    31
                  -------- -------- -------- -------- 
                 |          source address           |
                  -------- -------- -------- -------- 
                 |        destination address        |
                  -------- -------- -------- -------- 
                 |  zero  |protocol|   UDP length    |
                  -------- -------- -------- -------- 

If the computed  checksum  is zero,  it is transmitted  as all ones (the
equivalent  in one's complement  arithmetic).   An all zero  transmitted
checksum  value means that the transmitter  generated  no checksum  (for
debugging or for higher level protocols that don't care).
  

Если вы хотите посмотреть, как с этим справляется UDP-диссектор Wireshark, вы можете посмотреть исходный код для packet-udp.c. В принципе, после правильной настройки входных данных он, по сути, просто вызывает in_cksum() функцию в файле in_cksum.c для ее вычисления.

Возможно, вы также захотите взглянуть на RFC 1071, «Вычисление контрольной суммы Интернета».