Перейти к содержанию
    

Корректировка TCP/IP checksum без всех исходных

Всем привет. Не знал в какую рубрику поместить эту тему. Надеюсь попал.

Вот с такой задачей столкнулся:

Нужно корректировать ЧекСуммы заголовков Езернет пакета, зная измение, например только одного байта.

Меня интересует, это вообще реально? Или без знания всех исходных слагаемых найти новую ЧекСумму не реально?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Надеюсь попал.

Не знаю куда Вы попали :(, но пока даже вопрос не задан, ибо Ethernet и фигурирующий в заголовке TCP/IP вещи разные. CRC32 Ethernet фрейма естественно не подмените и для понимания этого просто нужно было хоть одним глазком посмотреть, что это такое. Ну а с TCP/IP - это не в "математику", это в арифметику :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Простите, юмора не понял.

CRC32 - это дело пятое. Сейчас совсем не об этом.

Могу повторить вопрос. На примере с TCP Checksum. Т.е. берём IP Frame и TCP Protocol.

Известно, что при расчёте TCP ЧекСуммы учавствуют поля IP заголовка, TCP заголовка и собственно полезные данные пакета. Так вот, данных бывает очень много чуть ли не 1.5КБ. Мне же надо изменить, например, всего лишь IP-адрес(это 4 байта) и по этому известному изменению скорректировать TCP Checksum. Берём IP-адрес, тот что был, IP-адрес который стал, находим дельту и корректируем TCP Checksum.

Вот в чём вопрос. Как это сделать? Формулу плиз.

Не торопитесь с ответом. Я уже 2 раза думал, что всё просто :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Простите, юмора не понял.

CRC32 - это дело пятое. Сейчас совсем не об этом.

Тогда это кто писал:

Нужно корректировать ЧекСуммы заголовков Езернет пакета

Какое отношение Ethernet имеет IP? НИКАКОГО.

Не торопитесь с ответом. Я уже 2 раза думал, что всё просто :)

Значит придется думать в третий раз, но скорректировать только при определенном стечении обстоятельств сможете.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда это кто писал:

 

Какое отношение Ethernet имеет IP? НИКАКОГО.

 

Значит придется думать в третий раз, но скорректировать только при определенном стечении обстоятельств сможете.

Смотрите исходники стека uIP, модуль ICMP, если я не ошибаюсь за давностью лет... К счастью, объем исходников невелик.

Контрольные суммы IP (как правильно указал уважаемый zltigo) пакетов корректируются при изменении нескольких байт (адреса пакета), без полного пересчета.

 

А для понимания отличия Ethernet от TCP/IP рекомендую почитать, почему реализации TCP/IP называются стеками :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Контрольные суммы IP (как правильно указал уважаемый zltigo) пакетов корректируются при изменении нескольких байт (адреса пакета), без полного пересчета.

Увы, там банальная, НО по модулю 32bit контрольная сумма и при финишном преобразовании в 16bit по результату восстновить можно только при удачном стечении обстоятельств. Я просто имел ввиду, что при наличии исходников для осознания этого фактов нужно только знание банальной арифметики, а не полиномиальной. Хотя на самом деле я не прав - какая разница полиномы/не полиномы делить, главное, что CRC (это я о Ethernet фрейме) это по остаток от деления, а по остатку от деления ничего нельзя скорректировать в принципе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Простите, юмора не понял.

CRC32 - это дело пятое. Сейчас совсем не об этом.

Могу повторить вопрос. На примере с TCP Checksum. Т.е. берём IP Frame и TCP Protocol.

Известно, что при расчёте TCP ЧекСуммы учавствуют поля IP заголовка, TCP заголовка и собственно полезные данные пакета. Так вот, данных бывает очень много чуть ли не 1.5КБ. Мне же надо изменить, например, всего лишь IP-адрес(это 4 байта) и по этому известному изменению скорректировать TCP Checksum. Берём IP-адрес, тот что был, IP-адрес который стал, находим дельту и корректируем TCP Checksum.

Вот в чём вопрос. Как это сделать? Формулу плиз.

Не торопитесь с ответом. Я уже 2 раза думал, что всё просто :)

Сколько воды! Я уверен, вопрос можно сформулировать проще. Попробую сам:

 

"Как скорректировать контрольную сумму в заголовке TCP, если изменился только IP-адрес получателя или отправителя?"

 

Я правильно понял вопрос?

 

Скачиваем RFC 3022, находим там checksumadjust. Кажется, это оно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скачиваем RFC 3022, находим там checksumadjust. Кажется, это оно.

Да, действительно! Старые значения доступны тоже и последовательно "отмотать" счетчик назад можно перед пересчетом. Наличие доступной дополнительной информации не пришло в голову :( - рассуждал только новая+старая сумма.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

// Put here the number of bytes transmitted in the UDP payload

// 18 minimum (smaller UDP payloads are possible but would need to be padded)

// 1472 maximum (1500 bytes = max Ethernet payload - 28 bytes = IP/UDP headers length)

parameter Tx_UDPpayloadlength = 18;

 

// "IP destination" - put the IP of the PC you want to send to

parameter IPdestination_1 = 8'd192;

parameter IPdestination_2 = 8'd168;

parameter IPdestination_3 = 8'd1;

parameter IPdestination_4 = 8'd100;

 

// calculate the IP checksum, big-endian style

wire [31:0] IPchecksum1 = 32'h0000C52D + Tx_UDPpayloadlength +

(myIP_1<<8)+myIP_2+(myIP_3<<8)+myIP_4+

(IPdestination_1<<8)+IPdestination_2+(IPdestination_3<<8)+(IPdestination_4);

wire [31:0] IPchecksum2 = ((IPchecksum1&32'h0000FFFF)+(IPchecksum1>>16));

wire [15:0] IPchecksum = ~((IPchecksum2&32'h0000FFFF)+(IPchecksum2>>16));

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот так корректируется контрольная сумма IP при

уменьшении поля TTL в одной сетевой операционке.

 

unsigned short *adr указывает на начало IP заголовка

 

                    i=0xFFFF&*(adr+5);         // adjust checksum
                   i+=1;
                   i+=i>>16;
                   *(adr+5)=i;
                   i=*(adr+4);                       // decrease TTL
//ierror("TTL",i);
                   i--;
                   *(adr+4)=i;
                   if((i&0xFF)==0) {
                       tobuf(&ss->lcltx, buf);                      // TTL=0, issue ICMP
                       return;
                       }

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нужно корректировать ЧекСуммы заголовков Езернет пакета, зная измение, например только одного байта.

Меня интересует, это вообще реально? Или без знания всех исходных слагаемых найти новую ЧекСумму не реально?

Надо вспомнить арифметику :)

NewPkt=OldPkt XOR NewMask

CRC32(NewPkt)= CRC32(OldPkt XOR NewMask) = CRC32(OldPkt) XOR CRC32(NewMask)

CRC32(0) = 0

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...