Reimplementing Ping in C: A Deep Dive into ICMP and Raw Sockets