Форум программистов CodeGuru
18 Сентябрь 2018, 23:47:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: CRC псевдозаголовка udp расчитал, а просто заголовка не могу расчитать.  (Прочитано 18547 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ATAMAN200
Интересующийся
**
Офлайн Офлайн

Сообщений: 29


Просмотр профиля
« : 10 Октябрь 2010, 18:59:10 »

Имею заголовок udp пакета такого вида:
порт источник 33 в hex виде 0x0021
порт получатель 53 в hex виде 0x0035
Длинна датаграммы 8 в hex виде 0x0008

как описанно в http://ru.wikipedia.org/wiki/UDP
CRC расчитывается только для порта источника, порт получателя и длинны датаграммы произвожу расчёт

Код:
#include "stdafx.h"
#include <iostream>
#include "conio.h"
using namespace std;
unsigned __int16 in_cksum ( unsigned __int16 *ptr, int nbytes )
{
register unsigned __int32 sum;
unsigned __int16 oddbyte;
register unsigned __int16 answer;
sum = 0;
while ( nbytes > 1 )
{
sum += *ptr ++;
nbytes -= 2;
}
if ( nbytes == 1 )
{
oddbyte = 0;
*&oddbyte = *ptr;
sum += oddbyte;
}
sum = ( sum >> 16 ) + ( sum & 0xFFFF);
sum += (sum >> 16 );
answer=~sum;
return (answer);
}
unsigned __int16 aaa[3] = {0x0021, 0x0035, 0x0008};
unsigned __int16 bbb;

int main()
{
bbb = in_cksum (aaa, sizeof(aaa));
cout << hex << bbb << endl;
getch();
}

результат получаю "FFA1" не верный результат
с помощью снифера формирую пакет получаю результат "F982" это верный результат.
Получается что данные по http://ru.wikipedia.org/wiki/UDP не верные.
Как правельно расчитать заголовок для udp?
Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #1 : 14 Октябрь 2010, 00:15:51 »

с помощью снифера формирую пакет получаю результат "F982" это верный результат.

Это в самом пакете идет контрольная сумма ?
Я к тому, что сниффером только перехватывается уже сформированный пакет, или же он сам и формирует его ?

Получается что данные по http://ru.wikipedia.org/wiki/UDP не верные.
Как правельно расчитать заголовок для udp?

Вообще, лучше на RFC ориентироваться.
В педивикии могут что угодно написать, хотя обычно данные достоверные (там много народу статьи просматривает), но могут быть и ляпы.

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

Вот что нагуглил: http://book.itep.ru/4/44/udp_442.htm
Тут написано:
Цитировать
Следует учитывать, что во многих посылках контрольное суммирование не охватывает адреса отправителя и места назначения. При некоторых схемах маршрутизации это приводит к зацикливанию пакетов в случае повреждения его адресной части (адресат не признает его "своим").
Имхо, надо и этот вариант проверить.

И еще. Я не помню, какой в заголовках UDP порядок байт должен быть.
Имхо, надо погуглить и выяснить. Возможно, надо поменять порядок байт, и все рассчитается правильно.
Т.е., например, номер порта будет не 0x0021, а 0x2100, грубо говоря, и.т.д.
Записан

ATAMAN200
Интересующийся
**
Офлайн Офлайн

Сообщений: 29


Просмотр профиля
« Ответ #2 : 14 Октябрь 2010, 18:08:07 »

Да всё намного интересней я понял как расчитать заголовок udp и расчитывается всё верно.
И ни водном RFC даже не упомянуто об этом.
Я просматрел все страници которые тока есть на тему "расчёт контрольной суммы UDP".

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2015, Simple Machines Valid XHTML 1.0! Valid CSS!