Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите подсчитать контрольную сумму TCP-заголовка


Страницы:   1 2

SPACE ©   (2005-08-01 22:45:00) 

Народ помогите подсчитать контрольную сумму TCP-заголовка
вот захваченный SYN-пакет :
                        TCP - заголовок
                              \|/
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

[0]___________[7]_____________[15|_______________________________
Src Port :  2886                | Dst Port: 80
-----------------------------------------------------------------
                Sequence Number: 35214831
-----------------------------------------------------------------
                    ASK Number : 0
-----------------------------------------------------------------
Off_Rsvd: 0x70 | Rsvd_Flag: 2  |   Window : 8192
-----------------------------------------------------------------
CheckSum : 0xAC96              | Urgent Pointer: 0
-----------------------------------------------------------------

Заметьте что все значение WORD и DWORD уже инвертированы.
     

                       Псевдо - заголовок
                              \|/
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

             +--------+--------+--------+--------+              
             |       SrcIP : 62.183.70.31        |
             +--------+--------+--------+--------+
             |       DstIp : 217.73.250.40       |
             +--------+--------+--------+--------+              
             |  нули  |   6    |       20        |
             +--------+--------+--------+--------+


SPACE   (2005-08-02 18:42:00) [21]

Нифига не работает. Я смотрю никто этим не занимался вот код
которы я намуливал за 20 минут. Чек-сумма  неверна.
Алгоритм стандартный  я его в интенете повсюду видел ну или подобный. Внизу в закоментированом состоянии выложен еще один
алгоритм он более изящен и понятен,но помоему неправилен так-как
у автора кода была такая-же проблема как у меня. Да и сумму он
выдает отличающеся от алгоритма Sha.

В коде применяется функция htons и htonl которая находится в модуле winsock,winsock2. Вместо htons можете использовать функцию SWAP :

Function SWAP(word) //меняет байты местами
Кстате Sha а что это у тебя за  функция Sha_htons() ? :)


Sha   (2005-08-02 16:45:00) [22]

Тебе в пору присуждать приз за волю к победе. Держи и не мучайся:

//(c) Sha 2004
//CheckSum function calculates the 16-bit one's complement sum
//for the supplied buffer. Initial value of sum may be non-zero.
function CheckSum(pBuf: pointer; Size: integer; Initial: cardinal= 0): word;
var
 p, q: pchar;
begin;
 if (pBuf<>nil) and (Size>0) then begin;
   q:=@pchar(pBuf)[Size-1];
   p:=pBuf;
   while p<q do begin;
     inc(Initial,pword(p)^);
     inc(pword(p));
     end;
   if p=q then inc(Initial,pbyte(p)^);
   end;
 Initial:=(Initial shr 16) + (Initial and $FFFF);
 Initial:=(Initial shr 16) + Initial;
 Initial:=(not Initial) and $FFFF;
 Result:=Initial;
 end;

Пример вычисления суммы TCP-заголовка:

 //Calculate the TCP checksum including the TCP pseudo-header,
 //TCP header itself and data (padded with a 0 if the data is odd length).
 //The pseudo-header consists of the 32-bit source IP address,
 //the 32-bit destination IP address, a zero byte, the 8-bit
 //IP protocol field, the 16-bit TCP length.
 with pIp^, pTcp^ do
 tcp_checksum:=checksum(pTcp, TcpTotalSize,
     //Summing pseudo-header
     ip_srcaddr shr 16 + ip_srcaddr and $FFFF
   + ip_dstaddr shr 16 + ip_dstaddr and $FFFF
   + ip_protocol shl 8 + Sha_htons(TcpTotalSize));


SPACE   (2005-08-02 15:47:00) [23]

Ээ sorry небольшая ошибочка в подсчете TCP пакета :

2886+80+537+21549+28674+8192 = 0xF1DE//Сумма TCP

F3A0+25E5B = 0x35039// Общая сумма

5039+3 = 503C // Складываем лишний байт с Словом.

FFFF - 503C = 0xAFC3// Дополнение до FFFF.

Может алгоритм неправильный ?


SPACE   (2005-08-02 14:57:00) [24]

to tesseract
Ну тыб сразуб ссылку киндал на RFC 1071 корочеб вышло,
меня интересует ваш результат расчета относительнно вышеупомянутых данных
Вот мой расчет :

2886+80+537+21999+28674+8192 = 0xF3A0//Сумма TCP

16055+17951+55625+64040+1556 = 0x25E5B// Сумма Псевдо-аголовка.
Длину TCP я указал = 20 так-как поле опций и поле данных пусты.

F3A0+25E5B = 0x351FB// Общая сумма

51FB+3 = 51FE // Складываем лишний байт с Словом.
FFFF - 51FE = 0xAE01// Дополнение до FFFF.

0xAE01 Это не есть 0xAC96.


tesseract   (2005-08-02 11:49:00) [25]

В обратном коде  просуммировать все слова(16 бит) данных. если количество байт нечётное - добавляются нулевые байты( не передаются а только для CRC). И имей ввиду при расчёте CRC Дополнительно рассчитывается псевдозаголовок (12 байт)- IP приёмника + IP источника + 8 нулевых бит  + протокол (8 бит) + Длина TCP 16 бит.


SPACE   (2005-08-02 10:48:00) [26]

Эх Sorry на самом деле Sequence Number : 35214381. Видно у вас веб сервер глючит :)
Вопрос не отменял.


SPACE   (2005-08-02 10:40:00) [27]

Да наверное забыл :)
Sha не впадлу подсчитай чексумму этого пакета и покажи как считал, а то у меня чего-то не получается.


Sha   (2005-08-02 00:38:00) [28]

Арифметику забыл? В чем проблема-то?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо