Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.23;
Скачать: CL | DM;

Вниз

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

 
Leha   (2005-07-01 18:21) [0]

Приветсвую всех!

Трубуется собрать пакет. Собрал.
Но не получается высчитать правильную контрольную сумму заголовка TCP...  :(    IP считает на правильно.

Все взял сдесь http://ntkernel.com/forum/viewtopic.php?t=114

Описание заголовков:

type
 TIPHeaderPtr = ^TIPHeader;
 TIPHeader = packed record
     VerLen: Byte;
     TOS: Byte;
     TotalLen: Word;
     Identifer: Word;
     FragOffsets: Word;
     TTL: Byte;
     Protocol: Byte;
     CheckSum: Word;
     SourceIp: DWORD;
     DestIp: DWORD;
     Options: DWORD;
  end;

 TTCPHeaderPtr = ^TTCPHeader;
 TTCPHeader = packed record
      SourcePort:Word;
      DestPort:Word;
      SequenceNumber:DWord;
      AcknowledgementNumber:DWord;
      Offset:Byte; //only left 4 bits. Header length in 32-bit segments
      Flags:Byte;
      Window:Word;
      Checksum:Word;  //includes speudo header instead of TCP header.
      UrgentPointer:Word;
  end;


Описание переменных:

 pIPHeader : TIPHeaderPtr;
 pTCPHeader : TTCPHeaderPtr;
 pData: PChar;


Функция для подсчета:

function Checksum(p: PWORD; Size: word): WORD;
var i: Integer;
   Sum: DWORD;
begin
  Sum := 0;
  for i := 0 to Size - 1 do
  begin
     Sum := Sum + ntohs(p^);
     inc(p);
  end;
  while (Sum shr 16) > 0 do
     Sum := (Sum and $FFFF) + (Sum shr 16);
  Sum := not Sum;
  Result := Sum;
end;


Использую:

PData := Pointer(integer(pTCPHeader) + 20);

// IP считает правильно
pIPHeader.CheckSum := 00;
pIPHeader.CheckSum :=
  htons(Checksum(Pword(pIPHeader), 20 div 2));

// TCP неправильно
pTCPHeader.CheckSum := 00;
pTCPHeader.Checksum :=
  htons(Checksum(Pword(pTCPHeader), (20 + length(pData)) div 2));


Не подскажите, может функция для TCP не так выглядит?

Заранее благодарен.
С уважением Алексей.


 
Sha ©   (2005-07-03 09:33) [1]

2 ошибкм:

1. Для нечетной длины данных надо добавлять в сумму значение
последнего байта, а ты его игнорируешь.

2. Начальное значение суммы для TCP и UDP не равно 0, как
например, для UDP. Оно должно быть равно контрольной сумме
псевдозаголовка.
А уж если ты установил его равным нулю, то должен строить
псевдопакет и подсчитывать его сумму. Читай доки, в общем.


 
Sha ©   (2005-07-03 09:39) [2]

Да, еще одно.

Обычно не пишут цикл while в программе подсчета контрольной
суммы, т.к. переполнение там может возникнуть только два раза.
Достаточно дважды выполнить
Sum := (Sum and $FFFF) + (Sum shr 16);


 
Sha ©   (2005-07-03 09:44) [3]

И еще одно.
Длина TCP заголовка не является константой.


 
Sha ©   (2005-07-03 10:05) [4]

Там у меня опечатка вкралась:

> Начальное значение суммы для TCP и UDP не равно 0, как
> например, для UDP.

Надо читать:

Начальное значение суммы для TCP и UDP не равно 0, как
например, для ICMP.


 
Sha ©   (2005-07-03 10:11) [5]

И еще есть одна опечатка - пропуск слова неинвертированной
в предложении:

Оно должно быть равно неинвертированной контрольной сумме псевдозаголовка.


 
Sha ©   (2005-07-03 10:26) [6]

Совсем сегодня расслабился, выражаюсь так, что хрен поймешь :)

Должно быть понятно, что в предыдущем посте имелось ввиду,
что нет небходимости в операторе Sum := not Sum;
при подсчете суммы псевдозаголовка, т.е. имелась ввиду
как раз инвертированная сумма, которую возвращает
функция Checksum.



Страницы: 1 вся ветка

Текущий архив: 2005.10.23;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.062 c
8-1117266368
MaFon
2005-05-28 11:46
2005.10.23
Здесь была тема про детектор движения.


2-1128240549
ABS
2005-10-02 12:09
2005.10.23
Опять параметры


8-1117526386
MrAndrey_ka
2005-05-31 11:59
2005.10.23
Прозрачность части формы


4-1124405168
NikNet
2005-08-19 02:46
2005.10.23
помогите сохранить экран на API...?


4-1124645216
SpyBoy
2005-08-21 21:26
2005.10.23
Injecting