|
|
  |
Корректировка TCP/IP checksum без всех исходных |
|
|
|
Aug 27 2008, 20:43
|

Участник

Группа: Свой
Сообщений: 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 раза думал, что всё просто
|
|
|
|
|
Aug 27 2008, 21:14
|

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

|
Цитата(dimasen @ Aug 27 2008, 22:43)  Простите, юмора не понял. CRC32 - это дело пятое. Сейчас совсем не об этом. Тогда это кто писал: Цитата Нужно корректировать ЧекСуммы заголовков Езернет пакета Какое отношение Ethernet имеет IP? НИКАКОГО. Цитата Не торопитесь с ответом. Я уже 2 раза думал, что всё просто  Значит придется думать в третий раз, но скорректировать только при определенном стечении обстоятельств сможете.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 28 2008, 05:59
|

Частый гость
 
Группа: Свой
Сообщений: 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 называются стеками
--------------------
|
|
|
|
|
Aug 28 2008, 06:15
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Aug 28 2008, 06:56
|
Гуру
     
Группа: Свой
Сообщений: 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 раза думал, что всё просто  Сколько воды! Я уверен, вопрос можно сформулировать проще. Попробую сам: "Как скорректировать контрольную сумму в заголовке TCP, если изменился только IP-адрес получателя или отправителя?" Я правильно понял вопрос? Скачиваем RFC 3022, находим там checksumadjust. Кажется, это оно.
|
|
|
|
|
Jun 2 2014, 02:49
|
Участник

Группа: Участник
Сообщений: 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));
|
|
|
|
|
Jun 8 2014, 12:18
|
Местный
  
Группа: Участник
Сообщений: 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; }
--------------------
|
|
|
|
|
Nov 9 2014, 18:55
|
Группа: Новичок
Сообщений: 2
Регистрация: 9-11-14
Пользователь №: 83 597

|
Спасибо, немного дошло даже до меня.
--------------------
|
|
|
|
|
Nov 10 2014, 02:22
|
Местный
  
Группа: Участник
Сообщений: 326
Регистрация: 30-05-06
Пользователь №: 17 602

|
Цитата(dimasen @ Aug 27 2008, 16:55)  Нужно корректировать ЧекСуммы заголовков Езернет пакета, зная измение, например только одного байта. Меня интересует, это вообще реально? Или без знания всех исходных слагаемых найти новую ЧекСумму не реально? Надо вспомнить арифметику  NewPkt=OldPkt XOR NewMask CRC32(NewPkt)= CRC32(OldPkt XOR NewMask) = CRC32(OldPkt) XOR CRC32(NewMask) CRC32(0) = 0
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|