dimasen 0 27 августа, 2008 Опубликовано 27 августа, 2008 · Жалоба Всем привет. Не знал в какую рубрику поместить эту тему. Надеюсь попал. Вот с такой задачей столкнулся: Нужно корректировать ЧекСуммы заголовков Езернет пакета, зная измение, например только одного байта. Меня интересует, это вообще реально? Или без знания всех исходных слагаемых найти новую ЧекСумму не реально? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 27 августа, 2008 Опубликовано 27 августа, 2008 · Жалоба Надеюсь попал. Не знаю куда Вы попали :(, но пока даже вопрос не задан, ибо Ethernet и фигурирующий в заголовке TCP/IP вещи разные. CRC32 Ethernet фрейма естественно не подмените и для понимания этого просто нужно было хоть одним глазком посмотреть, что это такое. Ну а с TCP/IP - это не в "математику", это в арифметику :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimasen 0 27 августа, 2008 Опубликовано 27 августа, 2008 · Жалоба Простите, юмора не понял. CRC32 - это дело пятое. Сейчас совсем не об этом. Могу повторить вопрос. На примере с TCP Checksum. Т.е. берём IP Frame и TCP Protocol. Известно, что при расчёте TCP ЧекСуммы учавствуют поля IP заголовка, TCP заголовка и собственно полезные данные пакета. Так вот, данных бывает очень много чуть ли не 1.5КБ. Мне же надо изменить, например, всего лишь IP-адрес(это 4 байта) и по этому известному изменению скорректировать TCP Checksum. Берём IP-адрес, тот что был, IP-адрес который стал, находим дельту и корректируем TCP Checksum. Вот в чём вопрос. Как это сделать? Формулу плиз. Не торопитесь с ответом. Я уже 2 раза думал, что всё просто :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 27 августа, 2008 Опубликовано 27 августа, 2008 · Жалоба Простите, юмора не понял. CRC32 - это дело пятое. Сейчас совсем не об этом. Тогда это кто писал: Нужно корректировать ЧекСуммы заголовков Езернет пакета Какое отношение Ethernet имеет IP? НИКАКОГО. Не торопитесь с ответом. Я уже 2 раза думал, что всё просто :) Значит придется думать в третий раз, но скорректировать только при определенном стечении обстоятельств сможете. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dmivs 0 28 августа, 2008 Опубликовано 28 августа, 2008 · Жалоба Тогда это кто писал: Какое отношение Ethernet имеет IP? НИКАКОГО. Значит придется думать в третий раз, но скорректировать только при определенном стечении обстоятельств сможете. Смотрите исходники стека uIP, модуль ICMP, если я не ошибаюсь за давностью лет... К счастью, объем исходников невелик. Контрольные суммы IP (как правильно указал уважаемый zltigo) пакетов корректируются при изменении нескольких байт (адреса пакета), без полного пересчета. А для понимания отличия Ethernet от TCP/IP рекомендую почитать, почему реализации TCP/IP называются стеками :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 28 августа, 2008 Опубликовано 28 августа, 2008 · Жалоба Контрольные суммы IP (как правильно указал уважаемый zltigo) пакетов корректируются при изменении нескольких байт (адреса пакета), без полного пересчета. Увы, там банальная, НО по модулю 32bit контрольная сумма и при финишном преобразовании в 16bit по результату восстновить можно только при удачном стечении обстоятельств. Я просто имел ввиду, что при наличии исходников для осознания этого фактов нужно только знание банальной арифметики, а не полиномиальной. Хотя на самом деле я не прав - какая разница полиномы/не полиномы делить, главное, что CRC (это я о Ethernet фрейме) это по остаток от деления, а по остатку от деления ничего нельзя скорректировать в принципе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 28 августа, 2008 Опубликовано 28 августа, 2008 · Жалоба Простите, юмора не понял. 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. Кажется, это оно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 28 августа, 2008 Опубликовано 28 августа, 2008 · Жалоба Скачиваем RFC 3022, находим там checksumadjust. Кажется, это оно. Да, действительно! Старые значения доступны тоже и последовательно "отмотать" счетчик назад можно перед пересчетом. Наличие доступной дополнительной информации не пришло в голову :( - рассуждал только новая+старая сумма. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RamZoom 0 2 июня, 2014 Опубликовано 2 июня, 2014 · Жалоба Не особо понял подсчет контрольной суммы вы имели ввиду, но постараюсь помочь: // 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)); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nonlinear 0 8 июня, 2014 Опубликовано 8 июня, 2014 · Жалоба Вот так корректируется контрольная сумма 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость kakoj2 9 ноября, 2014 Опубликовано 9 ноября, 2014 · Жалоба Спасибо, немного дошло даже до меня. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mcheb 0 10 ноября, 2014 Опубликовано 10 ноября, 2014 · Жалоба Нужно корректировать ЧекСуммы заголовков Езернет пакета, зная измение, например только одного байта. Меня интересует, это вообще реально? Или без знания всех исходных слагаемых найти новую ЧекСумму не реально? Надо вспомнить арифметику :) NewPkt=OldPkt XOR NewMask CRC32(NewPkt)= CRC32(OldPkt XOR NewMask) = CRC32(OldPkt) XOR CRC32(NewMask) CRC32(0) = 0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться