реклама на сайте
подробности

 
 
> Контрольная сумма UDP, Помогите понять
s.i.suprun
сообщение Jul 12 2010, 09:40
Сообщение #1


Участник
*

Группа: Validating
Сообщений: 71
Регистрация: 24-06-08
Из: Харьков
Пользователь №: 38 521



Товарищи форумчане, возникла срочная необходимость написать свою реализацию IP стека, но по ходу возникла проблема подсчета контрольной суммы UDP датаграммы. Если можна поскажите толковое руководство по алгоритму или же если не тяжело пошаговое обьяснение (за илистрацию примером из пары тройки двухбайтных слов отдельное СПАСИБО!!!!!)

Сообщение отредактировал s.i.suprun - Jul 12 2010, 09:42
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 21)
adnega
сообщение Jul 12 2010, 09:49
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Код
#define    UDP_PACKET_SIZE    8
#define    IP_UDP            17

  // псевдозаголовок
  crc=UDP_PACKET_SIZE+sizeof(sAUDIO_PACKET)+IP_UDP
    +(((DWORD)dst_ip[0]<<8)|dst_ip[1])
    +(((DWORD)dst_ip[2]<<8)|dst_ip[3])
    +(((DWORD)src_ip[0]<<8)|src_ip[1])
    +(((DWORD)src_ip[2]<<8)|src_ip[3]);
    
  // заголовок
  for(j=0;j<((UDP_PACKET_SIZE+sizeof(sAUDIO_PACKET)+1)>>1);j++)
    crc+=(bl0_data[j*2+1+ETH_PACKET_SIZE+IP_PACKET_SIZE]
      +((DWORD)bl0_data[j*2+0+ETH_PACKET_SIZE+IP_PACKET_SIZE]<<8));
    
  crc=(crc+(crc>>16))^0xFFFF;

http://www.opennet.ru/docs/RUS/tcpip
    
  udp->crc=SWAPBYTES(crc);


В поле CRC UDP заносим 0.
Сначала считаем сумму псевдозаголвка (тип пакета 17 + размер данных пакета IP (размер заголовка UDP+размер данных UDP)) + IP адреса источника и получателя.
Потом к полученной сумме добавляем все данные IP пакета (т.е. заголовок UDP и данные UDP).
Затем добавляем переполнение и инвертируем содержимое CRC

bl0_data[ETH_PACKET_SIZE+IP_PACKET_SIZE] - начало пакета UDP

Можно почитать http://www.opennet.ru/docs/RUS/tcpip/
Go to the top of the page
 
+Quote Post
Костян
сообщение Jul 12 2010, 11:10
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 740
Регистрация: 24-07-06
Из: Minsk
Пользователь №: 19 059



QUOTE (s.i.suprun @ Jul 12 2010, 07:40) *
Товарищи форумчане, возникла срочная необходимость написать свою реализацию IP стека, но по ходу возникла проблема подсчета контрольной суммы UDP датаграммы.

А какой смысл считать crc для UDP ?

разве мало ethernet crc ?
Go to the top of the page
 
+Quote Post
adnega
сообщение Jul 12 2010, 11:50
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Если в поле CRC будет 0, то windows-socket, вроде, примет пакет. Если CRC будет неверна, то пакет отбросится?
Go to the top of the page
 
+Quote Post
iosifk
сообщение Jul 12 2010, 12:15
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Костян @ Jul 12 2010, 15:10) *
А какой смысл считать crc для UDP ?

разве мало ethernet crc ?

Все это напоминает анекдот, когда военный с гражданским едут в поезде, пьют водку и ругаются:
Гражданский: Вы, военные все дураки!
Военный: А вы гражданские, если все такие умные, почему строем не ходите?

Ну это все шутки...
А так по жизни, неправильные пакеты через сеть не пойдут, если только эта сеть не "точка-точка"...
Потому что сеть умеет только "по уставу"... Только по 802.3 и по другому никак... Положено - сделайте...
Когда я отлаживал МАС в Альтере, то программа мониторинга пакетов долго не могла понять, что я не формировал IP, а просто гнал Ethernet пакеты. Все что не IP или не UDP воспринималось как битые. И я думаю, что точно так же все будет восприниматься и умными свитчами и файерволами... Если я не прав, то те, кто программировал эти штуки пусть меня поправят. Но я ни за что не стал бы делать САМОПАЛ...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Jul 12 2010, 12:17
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



Цитата(adnega @ Jul 12 2010, 18:50) *
Если в поле CRC будет 0, то windows-socket, вроде, примет пакет. Если CRC будет неверна, то пакет отбросится?

для IPv4 CRC опциональна
Go to the top of the page
 
+Quote Post
des333
сообщение Jul 12 2010, 12:25
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



То s.i.suprun:
Пример рассчета:
http://ru.wikipedia.org/wiki/UDP#.D0.9F.D1....BC.D0.BC.D1.8B



Цитата(vadimuzzz @ Jul 12 2010, 16:17) *
для IPv4 CRC опциональна

Контрольная сумма заголовка IPv4 не опциональна. И там используется не CRC, а 16-битовое поразрядное дополнение суммы поразрядных дополнений всех 16-битовых слов заголовка. 

Может быть, Вы имели в виду, что опциональна контрольная сумма UDP? Тогда Вы правы.


--------------------
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Jul 12 2010, 12:31
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



Цитата(des333 @ Jul 12 2010, 19:25) *
Может быть, Вы имели в виду, что опциональна контрольная сумма UDP? Тогда Вы правы.

да, "An all zero transmitted
checksum value means that the transmitter generated no checksum (for
debugging or for higher level protocols that don't care).
"
а вот для чего это поле нужно:
"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."

http://www.faqs.org/rfcs/rfc768.html
Go to the top of the page
 
+Quote Post
Костян
сообщение Jul 12 2010, 12:57
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 740
Регистрация: 24-07-06
Из: Minsk
Пользователь №: 19 059



QUOTE (vadimuzzz @ Jul 12 2010, 10:31) *
а вот для чего это поле нужно:
"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."

http://www.faqs.org/rfcs/rfc768.html

поясните , как то смутно...
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Jul 12 2010, 13:18
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



Цитата(Костян @ Jul 12 2010, 19:57) *
поясните , как то смутно...

"protection against misrouted datagrams" - заплутала дейтаграмма smile.gif при этом CRC ethernet-пакета верная.
Go to the top of the page
 
+Quote Post
Костян
сообщение Jul 12 2010, 14:52
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 740
Регистрация: 24-07-06
Из: Minsk
Пользователь №: 19 059



QUOTE (vadimuzzz @ Jul 12 2010, 11:18) *
QUOTE
поясните , как то смутно..

"protection against misrouted datagrams" - заплутала дейтаграмма smile.gif при этом CRC ethernet-пакета верная.


я не о переводе, как может датаграма пойти по неверному пути ? Высокоуровневая ошибка приложения ? Так FPGA в общем случае не имеет таких приложений.
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Jul 12 2010, 15:30
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



Цитата(Костян @ Jul 12 2010, 21:52) *
я не о переводе, как может датаграма пойти по неверному пути ? Высокоуровневая ошибка приложения ? Так FPGA в общем случае не имеет таких приложений.

устройство работает только в сетях, где нет ошибок? все маршрутизаторы настроены правильно? пакеты не теряются, не дублируются, приходят в правильном порядке? этого никто не гарантирует.
Go to the top of the page
 
+Quote Post
x736C
сообщение Jul 13 2010, 02:25
Сообщение #13


Профессионал
*****

Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942



Цитата(des333 @ Jul 12 2010, 16:25) *
И там используется не CRC, а 16-битовое поразрядное дополнение суммы поразрядных дополнений всех 16-битовых слов заголовка. 

Так это и есть контрольная сумма. (CRC-16).
Go to the top of the page
 
+Quote Post
des333
сообщение Jul 13 2010, 06:13
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



Цитата(x736C @ Jul 13 2010, 06:25) *
Так это и есть контрольная сумма. (CRC-16).


Я писал, что это не контрольная сумма?


Что должна была мне показать Ваша ссылка?

Что контрольная сумма UDP является CRC-16? Не показала.


--------------------
Go to the top of the page
 
+Quote Post
s.i.suprun
сообщение Jul 13 2010, 07:35
Сообщение #15


Участник
*

Группа: Validating
Сообщений: 71
Регистрация: 24-06-08
Из: Харьков
Пользователь №: 38 521



2 des333

Пример рассчета:
http://ru.wikipedia.org/wiki/UDP#.D0.9F.D1....BC.D0.BC.D1.8B


Оный пример видел, читал все понятно вод до этой строчки: "0x08c1 = 0000 1000 1100 0001 → 1111 Это и есть искомая контрольная сумма."
Извените за глупые вопросы, но откуда там взялась 0x0F - не могу ума приложить....

Нашел другую доку: http://www.faqs.org/rfcs/rfc1071.html


На счет контрольной суммы в полях заголовков: как в полях транспортных протоколов так и протоколах сетевого уровня данное поле должно быть просчитано и забито (Возможен, правда вариант не просчета этого поля в UDP). Счёт для них происходит по одному алгоритму:поразрядное дополнение до единицы суммы всех 16-битных слов с поразрядным дополнением*(Wiki).
Разница лишь в том, что для UDP, TCP и т.д., сумма считается для всей датаграммы, а в IP - лишь для заголовка. А CRC-алгоритм применяется для подсчета контрольной суммы полностью сформированого пакета (с MAC и т.д. заголовками) и размещается в конце всей посылки.

Сообщение отредактировал s.i.suprun - Jul 13 2010, 07:37
Go to the top of the page
 
+Quote Post
des333
сообщение Jul 13 2010, 07:52
Сообщение #16


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



Цитата(s.i.suprun @ Jul 13 2010, 19:35) *
2 des333

Пример рассчета:
http://ru.wikipedia.org/wiki/UDP#.D0.9F.D1....BC.D0.BC.D1.8B


Оный пример видел, читал все понятно вод до этой строчки: "0x08c1 = 0000 1000 1100 0001 → 1111 Это и есть искомая контрольная сумма."
Извените за глупые вопросы, но откуда там взялась 0x0F - не могу ума приложить....


Вполне логичный вопрос.  smile.gif


Там был нормальный пример описан, но статью кто-то неудачно отредактировал. 

Я вернул, как было раньше.



--------------------
Go to the top of the page
 
+Quote Post
s.i.suprun
сообщение Jul 13 2010, 08:10
Сообщение #17


Участник
*

Группа: Validating
Сообщений: 71
Регистрация: 24-06-08
Из: Харьков
Пользователь №: 38 521



Спасибо большое за ответ.!!!! a14.gif
Go to the top of the page
 
+Quote Post
x736C
сообщение Jul 13 2010, 09:21
Сообщение #18


Профессионал
*****

Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942



Цитата(des333 @ Jul 13 2010, 18:13) *
Я писал, что это не контрольная сумма?


Что должна была мне показать Ваша ссылка?

Что контрольная сумма UDP является CRC-16? Не показала.

Ссылка была на ваш копипаст и ничего, кроме копипаста не показывала.
Признаю, был не прав. CRC-16 совсем другая история.
Go to the top of the page
 
+Quote Post
des333
сообщение Jul 13 2010, 09:49
Сообщение #19


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



 
Цитата(x736C @ Jul 13 2010, 21:21) *
Признаю, был не прав. 

Ничего страшного. Бывает.  smile.gif




--------------------
Go to the top of the page
 
+Quote Post
adnega
сообщение Jul 13 2010, 10:17
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Эээ... походу это я всех смутил.
Заветные три буквы фигурировали в коде, который выложил в посте #2.
Правильнее будет заменить CRC на CS.
Добавлю: опыт показывает, что говорить о CRC-16 без явного указания начального значения, порождающего полинома, и прочих преобразований, иногда не имеет смысла (ибо реализаций CRC-16 много).
В соответствующее поле UDP заносится контрольная сумма.

Посмотрел у Таненбаума ("Компьютерные сети"):
"Контрольная сумма UDP не является обязательной. Если она не подсчитывается, ее значение равно 0 (настоящая нулевая контрольная сумма кодируется всеми единицами).
Отключать функцию подсчета контрольной суммы глупо, за исключением одного случая - когда нужна высокая производительность."

С http://www.opennet.ru/docs/RUS/tcpip/#c5_udp :
"Если поле "Контрольная сумма" UDP-заголовка содержит нулевое значение, это означает, что источник UDP-пакета контрольную сумму не подсчитывал, и приемник выполнять ее проверку не должен. Некоторые реализации протокола UDP (например, в SunOS - клоне ОС UNIX от Sun Microsystems) контрольную сумму не подсчитывают в принципе, полагаясь на возможности контроля целостности данных, реализованные в протоколах сетевого уровня (например, в Ethernet)."
Go to the top of the page
 
+Quote Post
des333
сообщение Jul 13 2010, 10:39
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



Цитата(adnega @ Jul 13 2010, 22:17) *
Посмотрел у Таненбаума ("Компьютерные сети"):
"Контрольная сумма UDP не является обязательной. Если она не подсчитывается, ее значение равно 0 (настоящая нулевая контрольная сумма кодируется всеми единицами)."


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


--------------------
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Jul 13 2010, 14:57
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



Цитата(des333 @ Jul 14 2010, 01:39) *
Все правильно. Только лучше в таких случаях читать не Таненбаума (хотя не спорю, что книга очень хорошая), а RFC.

что характерно, судя по посту выше, в SUN`е RFC не читают smile.gif
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 20:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01611 секунд с 7
ELECTRONIX ©2004-2016