Une implémentation personnalisée de l'utilitaire ping en C, utilisant des raw sockets ICMP pour diagnostiquer la connectivité réseau.
ft_ping est une réimplémentation de l'outil classique ping qui envoie des paquets ICMP ECHO_REQUEST aux hôtes réseau et mesure le temps de réponse. Ce projet démontre une compréhension approfondie des protocoles réseau bas niveau, de la programmation système et de la manipulation de raw sockets.
- 📡 Envoi et réception de paquets ICMP ECHO_REQUEST/REPLY
- 🎯 Résolution DNS et support des adresses IP
- ⏱️ Mesure précise du RTT (Round-Trip Time)
- 📊 Statistiques détaillées (min/max/avg/stddev)
- 🔍 Détection des paquets dupliqués
- 🚦 Gestion des erreurs ICMP (Destination Unreachable, Time Exceeded, Redirect)
- ⚙️ Options configurables (TTL, timeout, intervalle, nombre de paquets)
- 📝 Mode verbose avec dump des paquets
- 🐳 Support Docker pour les tests en environnement contrôlé
- GCC compiler
- Make
- Privilèges root (requis pour les raw sockets)
# Cloner le repository
git clone https://github.com/Luma-3/ft_ping.git
cd ft_ping
# Compiler le projet
make
# Le binaire ft_ping est créé dans le répertoire courant# Utilisation basique (nécessite root)
sudo ./ft_ping google.com
# Avec options
sudo ./ft_ping -c 5 -i 1 -v google.com| Option | Argument | Description |
|---|---|---|
-v, --verbose |
- | Affichage détaillé avec dump des paquets |
-?, --help |
- | Affiche l'aide et quitte |
-i, --interval |
N | Attend N secondes entre chaque paquet |
-c, --count |
N | S'arrête après N paquets envoyés |
-w, --timeout |
N | S'arrête après N secondes |
-s, --linger |
N | Définit la taille du payload des paquets |
-t, --ttl |
N | Définit le Time-To-Live à N |
# Envoyer 10 paquets avec un intervalle de 2 secondes
sudo ./ft_ping -c 10 -i 2 8.8.8.8
# Ping avec TTL personnalisé
sudo ./ft_ping -t 64 example.com
# Mode verbose avec timeout
sudo ./ft_ping -v -w 30 github.comLe projet est structuré comme suit :
ft_ping/
├── src/
│ ├── main.c # Point d'entrée et boucle principale
│ ├── parsing.c # Analyse des arguments
│ ├── packet.c # Gestion des paquets ICMP/IP
│ ├── ionet.c # Envoi/réception réseau
│ └── utils.c # Utilitaires et affichage
├── inc/
│ ├── ping.h # Structures principales
│ ├── packet.h # Structures de paquets
│ └── ionet.h # Interface réseau
├── Makefile # Build system
├── Dockerfile # Conteneur Docker
└── docker-compose.yml # Orchestration Docker
- Raw Sockets ICMP : Utilisation de
SOCK_RAWavecIPPROTO_ICMP - Calcul de checksum : Implémentation de l'algorithme de checksum ICMP
- Statistiques en temps réel : Calcul de la moyenne, min, max et écart-type
- Gestion des signaux : Capture de SIGINT pour un arrêt propre
Le projet inclut un environnement Docker pour tester le comportement réseau :
# Construire et lancer l'environnement
make docker
# Entrer dans le conteneur
docker exec -it ft_ping-container /bin/bas
# Tester avec simulation de latence réseau
# 1st param % loss, 2nd param % corrupt, 3rd param % duplicated
./apply_netem.sh
ft_ping google.comPING google.com (142.250.185.46) 56 data bytes
64 bytes from 142.250.185.46: icmp_seq=0 ttl=117 time=14.235 ms
64 bytes from 142.250.185.46: icmp_seq=1 ttl=117 time=13.892 ms
64 bytes from 142.250.185.46: icmp_seq=2 ttl=117 time=14.156 ms
^C
--- 142.250.185.46 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 13.892/14.094/14.235/0.143 ms
- Langage : C
- Raw Sockets : Communication ICMP bas niveau
- Protocoles : IPv4, ICMP
- Normes : RFC 792 (ICMP), RFC 791 (IP)
- Compilation : GCC avec flags
-Wall -Wextra -Werror
Luma-3
Développé dans le cadre d'un projet de programmation système et réseau 🚀