реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Корректировка TCP/IP checksum без всех исходных
dimasen
сообщение Aug 27 2008, 13:55
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 59
Регистрация: 12-07-04
Из: Санкт-Петербург
Пользователь №: 313



Всем привет. Не знал в какую рубрику поместить эту тему. Надеюсь попал.
Вот с такой задачей столкнулся:
Нужно корректировать ЧекСуммы заголовков Езернет пакета, зная измение, например только одного байта.
Меня интересует, это вообще реально? Или без знания всех исходных слагаемых найти новую ЧекСумму не реально?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 27 2008, 15:45
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(dimasen @ Aug 27 2008, 15:55) *
Надеюсь попал.

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
dimasen
сообщение Aug 27 2008, 20:43
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 59
Регистрация: 12-07-04
Из: Санкт-Петербург
Пользователь №: 313



Простите, юмора не понял.
CRC32 - это дело пятое. Сейчас совсем не об этом.
Могу повторить вопрос. На примере с TCP Checksum. Т.е. берём IP Frame и TCP Protocol.
Известно, что при расчёте TCP ЧекСуммы учавствуют поля IP заголовка, TCP заголовка и собственно полезные данные пакета. Так вот, данных бывает очень много чуть ли не 1.5КБ. Мне же надо изменить, например, всего лишь IP-адрес(это 4 байта) и по этому известному изменению скорректировать TCP Checksum. Берём IP-адрес, тот что был, IP-адрес который стал, находим дельту и корректируем TCP Checksum.
Вот в чём вопрос. Как это сделать? Формулу плиз.
Не торопитесь с ответом. Я уже 2 раза думал, что всё просто smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 27 2008, 21:14
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(dimasen @ Aug 27 2008, 22:43) *
Простите, юмора не понял.
CRC32 - это дело пятое. Сейчас совсем не об этом.

Тогда это кто писал:
Цитата
Нужно корректировать ЧекСуммы заголовков Езернет пакета

Какое отношение Ethernet имеет IP? НИКАКОГО.
Цитата
Не торопитесь с ответом. Я уже 2 раза думал, что всё просто smile.gif

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
dmivs
сообщение Aug 28 2008, 05:59
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 101
Регистрация: 7-09-05
Из: Riga, LV
Пользователь №: 8 333



Цитата(zltigo @ Aug 28 2008, 00:14) *
Тогда это кто писал:

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

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

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

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


--------------------
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 28 2008, 06:15
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(dmivs @ Aug 28 2008, 07:59) *
Контрольные суммы IP (как правильно указал уважаемый zltigo) пакетов корректируются при изменении нескольких байт (адреса пакета), без полного пересчета.

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 28 2008, 06:56
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(dimasen @ Aug 28 2008, 00:43) *
Простите, юмора не понял.
CRC32 - это дело пятое. Сейчас совсем не об этом.
Могу повторить вопрос. На примере с TCP Checksum. Т.е. берём IP Frame и TCP Protocol.
Известно, что при расчёте TCP ЧекСуммы учавствуют поля IP заголовка, TCP заголовка и собственно полезные данные пакета. Так вот, данных бывает очень много чуть ли не 1.5КБ. Мне же надо изменить, например, всего лишь IP-адрес(это 4 байта) и по этому известному изменению скорректировать TCP Checksum. Берём IP-адрес, тот что был, IP-адрес который стал, находим дельту и корректируем TCP Checksum.
Вот в чём вопрос. Как это сделать? Формулу плиз.
Не торопитесь с ответом. Я уже 2 раза думал, что всё просто smile.gif

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

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

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

Скачиваем RFC 3022, находим там checksumadjust. Кажется, это оно.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 28 2008, 07:31
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(scifi @ Aug 28 2008, 08:56) *
Скачиваем RFC 3022, находим там checksumadjust. Кажется, это оно.

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
RamZoom
сообщение Jun 2 2014, 02:49
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 30-03-14
Пользователь №: 81 150



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

// 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));
Go to the top of the page
 
+Quote Post
Non-linear
сообщение Jun 8 2014, 12:18
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 225
Регистрация: 15-11-09
Из: Москва
Пользователь №: 53 634



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

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

CODE
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;
}


--------------------
Измерительные приборы б/у - http://rf-measurement.net84.net
Go to the top of the page
 
+Quote Post
cika
сообщение Nov 9 2014, 18:55
Сообщение #11





Группа: Новичок
Сообщений: 2
Регистрация: 9-11-14
Пользователь №: 83 597



Спасибо, немного дошло даже до меня.


--------------------
Go to the top of the page
 
+Quote Post
mcheb
сообщение Nov 10 2014, 02:22
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 326
Регистрация: 30-05-06
Пользователь №: 17 602



Цитата(dimasen @ Aug 27 2008, 16:55) *
Нужно корректировать ЧекСуммы заголовков Езернет пакета, зная измение, например только одного байта.
Меня интересует, это вообще реально? Или без знания всех исходных слагаемых найти новую ЧекСумму не реально?

Надо вспомнить арифметику sm.gif
NewPkt=OldPkt XOR NewMask
CRC32(NewPkt)= CRC32(OldPkt XOR NewMask) = CRC32(OldPkt) XOR CRC32(NewMask)
CRC32(0) = 0

Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th July 2025 - 09:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01453 секунд с 7
ELECTRONIX ©2004-2016