Donc en fait pas de secret toutes les informations concernant une adresse IP sont stockées dans une base de données.
Il est bien évidement primordial que cette base de données soit mise à jour régulièrement et c'est là une des plus grandes difficulté.

Ces données sont récupérées gracieusement sur le site www.maxmind.com (qui à priori utilisent eux-même une partie des données de www.geonames.org), bien évidement un grand merci à eux.

Les tables minimum pour la localisation IP :

  • Blocks
  • Locations
La table "blocks" comprend les champs suivants :
  1. start (int 10) : début de la plage du numéro IP
  2. end (int 10) : fin de la plage numéro IP
  3. start (mediumint 9) : id de localisation pour une correspondance sur la table "locations"
La table "locations" comprend les champs suivants :
  1. locid (mediumint 8) : id pour la relation avec "blocks"
  2. country (char 2) : abréviation du pays suivant la norme ISO 3166-1
  3. region (char 2) : le numéro de la région (qui permet avec "country" de retrouver le nom dans une autre table)
  4. city (varchar 50) : le nom de la ville
  5. postalcode (varchar 8) : le code postal
  6. latitude (float 7,4) : la latitude (pour en savoir plus : coordonnées géographiques)
  7. longitude (float 7,4) : la longitude
  8. metrocode (char 2) : le code de la ligne de métro (uniquement pour les US et la CANADA, et encore à priori pas très fiable)
  9. areacode (char 3) : préfixe téléphonique (3 premiers chiffres ) par région (uniquement pour les US)


Donc voilà, le processus est simple :
  1. on a une adresse IP que l'on transforme avec un savant calcul (cela fera partie d'un autre billet)
  2. on regarde dans la table "blocks" à quel intervalle elle appartient, comme ça par exemple :
    SELECT locid FROM blocks WHERE 67283456 BETWEEN start AND end
  3. et donc avec le locid récupéré (ici avec 67283456 cela donne 223 au moment où j'écris ce billet), et donc une simple requête sur locations :
    SELECT * FROM locations WHERE locid='223' LIMIT 0,1