Understand how data moves from your program to the wire. Parse Ethernet frames, IP packets, and TCP segments by hand. Send raw packets, build a TCP stack from scratch, and implement real protocols from their RFCs.
Trace packets through every network layer. Capture traffic with libpcap, parse Ethernet frames, IPv4 packets, TCP segments, and UDP/ICMP datagrams by hand.
Send and receive network packets without the OS doing anything for you. Craft raw ICMP, UDP, and ARP packets, capture traffic in promiscuous mode, and build a traceroute.
Difficulty Progression
Build a TCP stack yourself. Implement UDP clients and servers with raw syscalls, the TCP 3-way handshake, data transfer with sequence numbers, retransmission, sliding windows, congestion control, and connection teardown.