Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
TanaT Гость
|
Добавлено: Ср Июл 28 2004 23:43 Заголовок сообщения: Checksum в UDP-пакете |
|
|
Как вычисляется контрольная сумма в заголовке UDP-пакета?
По адресу http://www.citforum.ru/nets/tcp/udpspec.shtml есть описание протокола UDP, в котором сказано:
"Контрольная сумма - 16 битное дополнение до единицы суммы дополнений UDP заголовка, данных и псевдозаголовка. Последний содержит информацию из заголовка в протоколе IP. В случае необходимости, датаграмма дополняется в конце нулевыми октетами, чтобы общее их количество стало четным. "
В оригинале это звучит так:
"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."
Мне, честно говоря, не понятно, что хотел сказать автор перевода. Что до чего дополняется. Как будто бы переводила машина. Объясните, пожалуйста, подробнее. |
|
Вернуться к началу |
|
|
DSN
Зарегистрирован: 20.02.2003 Сообщения: 150 Откуда: Moscow
|
Добавлено: Ср Авг 04 2004 10:58 Заголовок сообщения: обьясняю ... |
|
|
обьясняю ...
Так же как и в IP и TCP пакетах
слово
1) CheckSum = 0; в пакете перед подсчетом присваеваем данному полю ноль.
2) сумируем все слова заголовка и если нужно поля данных, после каждого сумирования проверяем перенос, если есть то прибавляем еще единицу, если нет, то следующее слово.
Есть еще вариант когда сумма QWORD, тогда просто получают сумму
а затем:
cs = LOWord(sc) + HIWord(cs); прибавляем перенос из старшего слова к младшему слову
cs = LOWord(sc) + HIWord(cs); прибавляем возможный перенос после суммирования ст и мл слов.
После в переменной cs будет нужная вам CheckSum
Удачи. |
|
Вернуться к началу |
|
|
Andy_user
Зарегистрирован: 03.12.2003 Сообщения: 382 Откуда: Санкт-Петербург
|
Добавлено: Ср Авг 04 2004 11:19 Заголовок сообщения: |
|
|
void IP_CheckSum(unsigned char * PointerBuf,
int NumberOfBytes,
unsigned char * PointerCS)
{
// Calculates IP-style checksum on block of data
unsigned long check = 0;
USHORT * TempPointer;
TempPointer = (USHORT *) PointerBuf;
// Sum all the words together, adding the final byte if the size is odd
while(NumberOfBytes > 1) {
check = check + ( * TempPointer);
TempPointer ++;
NumberOfBytes --;
NumberOfBytes --;
};
if (NumberOfBytes) {
check = check + ( * TempPointer);
};
check = (check >> 16) + (check & 0xffff);
check = check + (check >> 16);
check = ~ check;
* PointerCS = (unsigned char)(check & 0xff);
* (PointerCS + 1) = (unsigned char)((check >> & 0xff);
} |
|
Вернуться к началу |
|
|
DSN
Зарегистрирован: 20.02.2003 Сообщения: 150 Откуда: Moscow
|
Добавлено: Ср Авг 04 2004 13:41 Заголовок сообщения: |
|
|
да, про инверсию то я и забыл...
исходники дома, подглядеть негде. |
|
Вернуться к началу |
|
|
|