Поскольку пинг (точнее, эхо-запросы ICMP) является частью интернет-протокола, сетевой стек (который является реализацией протокола вашей операционной системы) отвечает на эти запросы.
Это ни TCP, ни UDP, ни какой-либо другой транспортный протокол. В заголовке Интернета есть поле протокола, которое указывает, какой тип полезной нагрузки содержит IP-пакет. Для пакетов TCP это поле указывает TCP. Для пакетов ping это указывает ICMP.
Btw. это не единственное использование ICMP. Например, когда TTL пакета падает до нуля во время прохождения через сеть, он отбрасывается, и отправитель уведомляется пакетом ICMP.
Если вам интересно, как ping (8)
отображает полученные ответы ICMP из пространства пользователя, это делается с помощью API сокетов. Это соответствующий раздел из исходного кода:
/* Initialize raw ICMP socket */
proto = getprotobyname ("icmp");
if (!proto)
{
fprintf (stderr, "ping: unknown protocol icmp.\n");
return NULL;
}
fd = socket (AF_INET, SOCK_RAW, proto->p_proto);