UDP-пакет. Проблема с контрольной суммой.

Тема в разделе "WASM.NETWORKS", создана пользователем PINKOD, 18 апр 2005.

  1. PINKOD

    PINKOD New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2005
    Сообщения:
    2
    Адрес:
    Севастополь
    Нужно сформировать UDP пакет.



    Имеет такой вид:



    ------------------------

    .

    . Ethernet заголовок

    .

    ------------------------

    .

    . IPv4 заголовок

    .

    ------------------------

    .

    . UDP заголовок

    .

    ------------------------

    .

    . Данные

    .

    ------------------------



    Вопрос:

    По каким частям пакета считать контрольную сумму UDP пакета (той, что в UDP заголовке) ?



    Читал про псевдо-заголовок, примерно понял, что это и для чего.

    Однако, есть несколько источников информации по этому делу, но они в некоторых местах друг другу противоречат.

    В одном написано, что контрольную сумму считать по псевдо-заголовку, UDP-заголовку и данным, а в другом вообще как-то нелогично написано.

    Вообщем, не могу чё-то разобраться. Разъясните пожалуйста.



    Идеальной помощью была бы ссылка на работающий исходник.
     
  2. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
  3. PINKOD

    PINKOD New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2005
    Сообщения:
    2
    Адрес:
    Севастополь
    Вообщем я даун, и не знаю, что в интернете имеется такой сервис как www.google.com(ru) и что можно написать "UDP контрольная сумма" в строке поиска. Спасибо, твой пост мне очень помог!



    Но всё же.



    Возникло много вопросов, пока вижу только один путь решения - экпериментальный, но это такое мучение. Хотелось бы, чтобы люди которые этим занимались и четко понимают (а такие точно есть) просто отметили, что из следующего списка верно, а что нет. Это же совершенно не сложно.

    Так я буду четко знать, что вот "тут" ошибки точно нет.

    Это сильно сократит количество вариантов перебора.



    Список вопросов по существу:



    ##########################################################

    Как я понял, расчет контрольной суммы производится по такому куску памяти:

    - псевдо-заголовку (12 байт);

    - за ним идет UDP-заголовок (8 байт);

    - за ним идут данные (длина, например, Len).

    Причем если общее количество байт в этом куске памяти нечетное, то нужно добавить в конце один нулевой байт (который не отправляется в сеть) и рассчитать контрольную сумму, примерно так (при нечетном кол-ве байт)



    crc=checksum((void*)p,12+8+Len+1);



    p - указатель на начало этого куска памяти.



    Вопрос 1: Всё я правильно понимаю или в чем-то ошибаюсь?

    ##########################################################

    Поле length псевдо-заголовка должно содержать



    а) Длина UDP-заголовка;

    б) Длина UDP-заголовка + длина данных; (мне кажется, что это верный вариант)

    в) Длина псевдо-заголовка + длина UDP-заголовка;

    г) Длина псевдо-заголовка + длина UDP-заголовка + длина данных;



    Вопрос 2: Что из этого верно?

    ##########################################################

    Вопрос 3: Нужно ли изменять порядок следования байт при заполнении поля length псевдо-заголовка?



    Т.е. как правильно,

    Pseudo_header->length=sizeof(UDP_HDR)+Len;

    или

    Pseudo_header->length=htons(sizeof(UDP_HDR)+Len);

    ?

    ##########################################################



    И вот представте все эти варианты между собой перебрать. Если учесть ещё такой момент (который лично у меня бывает проявляется), что где-то в чем-то протупил и нужно сначала. УУУ! Ё!

    Хочется подтвердить хоть какие-то из вариантов (сорри, повторяюсь...).
     
  4. shefchick

    shefchick New Member

    Публикаций:
    0
    Регистрация:
    14 апр 2005
    Сообщения:
    22
    PINKOD



    Вопрос 1 - Верно

    Вопрос 2 - б)

    Вопрос 3 - Не нужно менять, ты же не в сеть эту длинну отправляешь