Plage d'adresses IP

On souhaite créer une classe Reseau qui donne les caractéristiques d'un réseau logique auquel appartient une machine à l'adresse IP donnée.

Adresse IP et masque

Une adresse IP identifie à la fois un réseau ET l'adresse d'une machine dans ce réseau.

Un masque de sous réseau est un séparateur qui permet de distinguer les parties réseau et machine d'une adresse IP.

On considère que le cas est simple quand les octets du masque ont pour valeur soit \(0\), soit \(255\).

Par exemple, si j'associe l'adresse IP et le masque suivants : \(192.168.0.1 - 255.255.255.0\)

Les trois premiers octets du masque sont à la valeur \(255\) : on peut alors dire que les trois premiers octets de l'adresse représentent la partie réseau de l'adresse.

La partie réseau de l'adresse est donc \(192.168.0\) et la partie machine de l'adresse au sein de ce réseau est donc représentée par le quatrième octet \(1\)

On considère que le cas est compliqué quand le premier octet significatif du masque est différent de \(255\).

Par exemple, si j'associe l'adresse IP et le masque suivants : \(192.168.0.1 - 255.255.224.0\)

Dans ce cas, il faut obligatoirement revenir en binaire pour savoir où se fait la séparation : \(255.224.0.0 = 11111111.11100000.00000000.00000000\) (elle se fait au milieu de l'octet)

On écrit également l'adresse IP en binaire. 192.168.0.1 = 11000000.10101000.00000000.00000001 et on effectue une opération ET binaire entre l'adresse et le masque, ce qui donne comme partie adresse : 11111111.10101000.000

la classe AdresseIP

On donne une classe AdresseIP gérant une adresse IPv4 et son masque de sous-réseau.

L'adresse et le masque sont codés sur \(4\) octets, écrits en décimal, séparés par des points comme ceci : \(192.168.0.1 / 255.255.255.0\) Notre objet AdresseIP comportera deux attributs :

  • adresse la liste des \(4\) entiers correspondants à l'adresse
  • masque la liste des \(4\) entiers correspondants au masque
Exemple
>>> adr = AdresseIP('192.168.0.1', '255.224.0.0')
>>> adr.adresse
[192, 168, 0, 1]
>>> adr.masque
[255, 224, 0, 0]

Indication

On pourra utiliser split pour découper une chaine de caractères :

🐍 Console Python
>>> "192.168.10.5".split('.')
["192", "168", "10", "5"]

Nous allons définir la méthode plage_adresses qui calcule la première et la dernière adresses IP valides associées à une adresse IP donnée (avec son masque de sous-réseau).

Nombre magique

La technique utilisée ici est celle du nombre magique, qui permet d'éviter toute conversion en binaire.

Le nombre magique est simplement un calcul fait à partir de l'octet significatif du masque.

Il est égal à \(256 - octet significatif\).

Exemple

Dans notre exemple précédent, le masque était \(255.224.0.0\). On voit vite que l'octet significatif (celui où la séparation a lieu) est 224.

Notre nombre magique vaut donc \(256 - 224 = 32\)

Pour cela il nous faut :

  • pos : la position de l'octet significatif du masque c'est-à-dire le 1er octet non nul en partant de la droite
  • magic : le nombre magique qui vaut \(256 -\) l'octet significatif
  • adr_debut qui coïncide avec l'adresse pour les positions 0 à pos exclue, qui vaut \(0\) pour les positions pos exclue jusqu'à la fin et qui vaut \(m\) le plus grand multiple de magic inférieur à la valeur de l'adresse à la position pos
  • adr_fin qui coïncide avec l'adresse pour les positions 0 à pos exclue, qui vaut \(255\) pour les positions pos exclue jusqu'à la fin et qui vaut \(M = m +\mathit{magic} - 1\) à la position pos

Le schéma ci-dessous résume les règles :

plage_adresses

Exemple

Avec l'adresse \(192.168.0.1\) et le masque \(255.224.0.0\), on a :

  • pos qui vaut \(1\)
  • magic : \(256 - 224 = 32\)
  • adr_debut commence comme l'adresse et la fin est constituée de 0, seule la position 1 est à calculer : \(192.m.0.0\) et \(m\) est le plus grand multiple de \(32\) inférieur à \(168\) soit \(160\) ; adr_debut vaut donc \(192.160.0.0\)
  • adr_fin est de la forme \(192.M.255.255\) avec \(M\) valant \(160 + 32 - 1\) ce qui nous donne \(192.191.255.255\)

Compléter la définition de la classe AdresseIP, y compris la méthode plage_adresses :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10
.128013s3o_8bcdufvgI/0lyàq n7AapS.r1-me,(P2=4:V+twki9]D[5h*)é6050i0G0Q0y0T0q0b0u0h0q0y0b0b0L010Q0T0z010406050b0j0F0F0y0C0r040A0d0q0j0{0d0v050o12141618100z041h1o051r0o1r1t1o100i0T0l0:0=0@0_0Z0T0m0Z0q1H0Z0Q0~050+0g0q0G1C0?0^011G1I1K1I0Q1Q1S1O0Q0g0d0i181P0C1p0Q0Z0:1b0b0z0y0v0_0K011U1E010k0-0G0v0y0F0G1O1_1{201W231S26280~0a0u0J0C0d0z0d0b0T1e0v0u0)1@0C0C0G0h2t1h2b0v1p0o1=2G0Q1:1/1;0i2d0_1K0v252q1O1z1B0;1V2Q0T2S0v1,1A1O0z2z1p2E2G2.111`2u2Y212%0C150q0~0u0D2D2=0 2;2c2@1W2_2{2}0K301{322E2P01370y2|040u0c3b2F103e350_3h3j0u0M3n3d2=3f3t2}0Y3x3p3z3r3g0d2`3i2}0%3E332?1D363J383k0w3O3q3R3s3T3L3k0f3X3G3Z3I3K3u0U3)343+3B040D0p3:3Q2Z3,3U0D2 1i313F3;3|3?0D3a413c433{2^3#3j0D3m493o3P3A4e0~0D3w4i3y444d3-4n3D4q4b4l4u3@3N4x4k3H463W4D3Y454m3@3(4I3*4K4A0D3/4O4s3S4A0K3_4U4c4W3U0K402.4y4F4L0K484*4E3=4-4h4:4J4t4%4p4^4P4`3$0K4w4}4V3!4X4C534#554%4H584z4%4N2:1u2,1h2W2J0i2N3f0h1,291p5l1s5j5h2:5q0)2-4~1W0S0~353x4;3|0R2}5H4_360h0~0x0i2z0@0G0n0J5M5C0_0}040N3`3f5K3k0u5,5Y54010b0i0~015@0W0$230v2s0u0j2S0u0y5S0G5U0u5W0O0M610@0d0h0T0$1T0s0u0b1f0u150b0t0j1T2w6j0j0b0E0C0$0b0G0y0j5@013E065,5-5N0_5E040)0k5.59015*0u6O3f0k0F0~0e0e2#2s6Y6T3H5#0I6%3+0g5#6y0q6N4q5I215#0H3x6S6I3g0~625T6y6+3|6^6`6?360~6m6o0G726@0~0#5%4x6G7i6{5Z016-0~6/6;2:6|0d0~0B7c77046 64714q7k5/7t040L756|5#0X7w3s0g0~2#0Q7M016)7S0v7P7S5#0#7I7l6K0k3J7#5/7W040T7*6P0d5*2#7/3A6~635U7S7F7v6=6|7,1_1K7R7 7l7U855/0b0D0~000B007Y7e0V3E7j6G760_7n047p7|7u7V780?7a7@3H7F7H7C8m7T0~7L886P0v7O7-0v847r860~6*8G7^7-8g047!8B6|7%7)8X7l7,7.8#7E7=1g8)8H8u6n6p8r047~8N7+7o0z838U8Q8^6P8a8c8e8U0#8i4x6F8l8Y0~6M7S6R7V0k0~2%0F0g2z0e150m0T8w8R6(8P7S8o8q9r3+7Z7g5d3H6R8k6S9x3|5;5?5@2z0v0l0d0T1T0q002#1z0h6q9Q006c0Q0*6i1H5|230h0y0{0k0u9#1S0u9i9k1T9n9p6p6C8j9E8C8%8x3+8za03|0F0T0~4@429E7D6P6K0R1G1Sa3219v0G6:8=8@319~8/9q8 3f7K8t8T9G7d04962.ab3f8z8AaB8Ca50~4Zas9s5$9|aa6H8$7X8-aD0~0EaF31aC3HaI3@aO7jap049Z0*0e2r0m9(0T9*9,ah1Wa2aT3Hajalaxa^8sa~3saq8;b18D048FaL3=aSb9730~aAa99}9a042z0Q0j0C8,aG80bbao7J0~6_a`3+a#5157aY8C7F0Ea@b2a*2Ba,a.a:a=0T7q4298aQ5/6K9cb59eb50v9g048{0y0m0G0e7z5U0b8}9u6.akbO3c8C9za%7ia)9Ta;7bb574bw458u9o0hbF01a_bp7la|b;2FbCb0bc2^9h0d9j9l9^arbs8O040I8W4*aaa)0)0g1d0ea+0Qa-9%bNa;9+bNc5c7bBbtcpb.7ob:amavb*7Bcf1WaubX7P0v9Ub}cT5!becH0~0o0oc57,9^c4b~7ec(040!c,c2a;b^99aR7y5S0ecv1dc=aX3caZ9y8E7Sa#aKcn5/b c85/da8Ubvdf6Pdhc:04djcJ7ldmc#b6bf4actbi7(0Cc^awdkaD8+c,8J0C1{b%b-cW8KcZ949AbgaPd6c1c~0Cd00Gcw8Mdc6PcVdt9 dndv2FdT21cId58CcacPdMcRc!d#atd8dM8(dt5#d+0 dxc}6 dXdZ8Ub8d`4FcXdOd*d3dBd1cAczcBa/cDbMcb0 bQa(bqdV0e5{efc0aye9b=6|by0Y52ead7doc5eCeEeAcodpd:eBa60451eKcccKeNd,aHeQeS8Ue1eqb_dy8!dDebdCdq8*cXdG0~dI0vdKdn8~eFdUb{9VdPc{8ka)e5evdnezeUc}d~e{aye1d-a 7Gc5d=b57}cQ7`cSfacUd|d(breLddc%7hbhe4c f4d fpfnbGe}d_fsd$fue+a10~d4eXesehcybIcAbKemcFeofd0_7F0PdBc.c=bEex1Wa#4)dRer7$e=0*bmboe.8.etehdidBf37?4D0o5z0G2G2+g25k1A5m2J2L2H1+1-2J0y1Rg50o5l10gi0*0,0.04.