tgoop.com/cpp_geek/360
Last Update:
Давай программировать стек TCP/IP. Part 2: IPv4 & ICMPv4
На этот раз в нашем TCP/IP стеке в пространстве пользователя мы реализуем минимально жизнеспособный IP-уровень и протестируем его с помощью ICMP-запросов эхо (известных также как ping).
Мы рассмотрим форматы IPv4 и ICMPv4 и опишем, как проверять их целостность. Некоторые функции, такие как фрагментация IP, оставлены в качестве упражнения для читателя.
Для нашего сетевого стека был выбран IPv4 вместо IPv6, так как он до сих пор является основным сетевым протоколом Интернета. Однако это быстро меняется, и наш стек можно будет расширить поддержкой IPv6 в будущем.
Internet Checksum
Поле интернет-контрольной суммы используется для проверки целостности IP-дейтаграммы. Вычисление контрольной суммы относительно простое и определено в оригинальной спецификации:
Поле контрольной суммы представляет собой 16-битное дополнение до единицы суммы всех 16-битных слов в заголовке. Для вычисления контрольной суммы значение этого поля принимается равным нулю.
Фактический код для алгоритма выглядит следующим образом:
uint16_t checksum(void *addr, int count)
{
/* Compute Internet Checksum for "count" bytes
* beginning at location "addr".
* Taken from https://tools.ietf.org/html/rfc1071
*/
register uint32_t sum = 0;
uint16_t * ptr = addr;
while( count > 1 ) {
/* This is the inner loop */
sum += * ptr++;
count -= 2;
}
/* Add left-over byte, if any */
if( count > 0 )
sum += * (uint8_t *) ptr;
/* Fold 32-bit sum to 16 bits */
while (sum>>16)
sum = (sum & 0xffff) + (sum >> 16);
return ~sum;
}
https://www.saminiir.com/lets-code-tcp-ip-stack-2-ipv4-icmpv4/
➡️ @cpp_geek
BY C++ geek
Share with your friend now:
tgoop.com/cpp_geek/360