me-too: gemeinsame Route bestimmen

Hallo Forum,

wie kann ich in

[1] PHP
[2] Javascript

die gemeinsame Route mit dem kleinsten Supernet berechnen, also das kleinste gemeinsame Netzwerk bestimmen?

IP[1] = 192.168.130.1
IP[2] = 192.168.129.2
CIDR-Suffix: /22
Netmask v4: 255.255.252.0
Supernet: 192.168.128.0

und sicherstellen, dass die im Formular eingegebenen IPs gültig sind.

Daran rätsele ich nun schon den ganzen Tag.

Grüße aus der Quasi-Quarantäne
Me

  1. Hallo,

    wie kann ich in

    [1] PHP
    [2] Javascript

    die gemeinsame Route mit dem kleinsten Supernet berechnen, also das kleinste gemeinsame Netzwerk bestimmen?

    die Aufgabenstellung ist völlig unabhängig von der gewählten Programmiersprache.

    IP[1] = 192.168.130.1
    IP[2] = 192.168.129.2
    CIDR-Suffix: /22
    Netmask v4: 255.255.252.0
    Supernet: 192.168.128.0
    

    Vergleiche die beiden IP-Adressen Bit für Bit, beginnend beim höchstwertigen Bit, bis du einen Unterschied feststellst. Die übereinstimmenden Bits ergeben dann das kleinste gemeinsame Netz.

    und sicherstellen, dass die im Formular eingegebenen IPs gültig sind.

    Was verstehst du in dem Kontext unter gültig?
    Und wozu brauchst du das?

    Live long and pros healthy,
     Martin

    --
    Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
    1. Hallo Martin,

      wie kann ich in

      [1] PHP
      [2] Javascript

      die gemeinsame Route mit dem kleinsten Supernet berechnen, also das kleinste gemeinsame Netzwerk bestimmen?

      die Aufgabenstellung ist völlig unabhängig von der gewählten Programmiersprache.

      IP[1] = 192.168.130.1
      IP[2] = 192.168.129.2
      CIDR-Suffix: /22
      Netmask v4: 255.255.252.0
      Supernet: 192.168.128.0
      

      Vergleiche die beiden IP-Adressen Bit für Bit, beginnend beim höchstwertigen Bit, bis du einen Unterschied feststellst. Die übereinstimmenden Bits ergeben dann das kleinste gemeinsame Netz.

      Ja nee is schon klar.
      Und wie geht das?

      und sicherstellen, dass die im Formular eingegebenen IPs gültig sind.

      Was verstehst du in dem Kontext unter gültig?

      192.168.130.300 wäre ungültig. Und IPv6 wäre in demselben Zusammenhang auch nicht angebracht.

      Und wozu brauchst du das?

      Um Routen im Netzwerk zusammenfassen zu können

      Es geht mir um die Lösungswege in Javascript oder PHP.

      Grüße Me-Too

      1. n'Abend,

        Vergleiche die beiden IP-Adressen Bit für Bit, beginnend beim höchstwertigen Bit, bis du einen Unterschied feststellst. Die übereinstimmenden Bits ergeben dann das kleinste gemeinsame Netz.

        Ja nee is schon klar.
        Und wie geht das?

        worin besteht genau dein Problem?

        Eine IPv4-Adresse ist eine 32bit-Integerzahl. Das höchstwertige Bit entspricht der Bitmaske 0x80000000. Damit fängst du an. Mit jedem Schritt verschiebst du die Bitmaske um eine Position nach rechts.

        und sicherstellen, dass die im Formular eingegebenen IPs gültig sind.

        Was verstehst du in dem Kontext unter gültig?

        192.168.130.300 wäre ungültig.

        Oh. Okay, das habe ich als Grundwissen vorausgesetzt. Natürlich kann in einem Byte niemals ein Zahlenwert >255 dargestellt werden.

        Und IPv6 wäre in demselben Zusammenhang auch nicht angebracht.

        Ja, IPv6 ist eine vollkommen andere Welt.

        Live long and pros healthy,
         Martin

        --
        Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
      2. Hallo me-too,

        Ja nee is schon klar.

        Mit weniger Rotzigkeit

        Und wie geht das?

        Und mehr Handbuchstudium

        Noch mehr

        ip2long konvertiert den IP-String in einen 32-bit Wert, oder liefert FALSE, wenn der IP-String ungültig war.

        Für den Bitvergleich beginnst Du mit $mask=0x80000000 und schiebst den Maskenwert Stück für Stück mit dem >> Operator eins nach rechts, bis die Maske 0 wird. Der Rest ist wohl trivial.

        In JavaScript ist's schwieriger, da müsstest Du ip2long und long2ip selbst bauen. Das ist nicht unmöglich, nur etwas lästiger. Hier sind zwei Einzeiler, die das tun, aber da fehlt bei ip2int die Prüfung auf Gültigkeit. Kannst Du vielleicht hinzufügen. Bitoperatoren hat JavaScript auch.

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Mit weniger Rotzigkeit

          Mit besten Wünschen zurück.

          Und wie geht das?

          Und mehr Handbuchstudium

          Einfach nur einen Link hinzurotzen ist keine wirkliche Hilfe. Den entscheideden Tipp habe ich nun von jemand Anderem bekommen.

          Grüße Me-Too

  2. Hello,

    Grundidee für PHP:
    erstmal die Übereinstimmungen suchen

    
    $supernet_long = (($iplong_1 & $iplong_2) | (~$iplong_1 & ~$iplong_2));  
    
    

    Aber Achtung, das ist ggf. eine 64-Bit-Zahl, deshalb beim Weiterarbeiten mit decbin() nur die rechten 32 Stellen benutzen substr(..., -32). Darin mit strpos() die Position der ersten "0" bestimmen. Das ist dann schon das CIDR-Suffix.

    Die Bitmaske ist dann der linke Teil bis zur "0", aufgefüllt auf 32 Stellen mit "0". Zurückwandeln mit bindec().

    Die Netz-IP ergibt sich dann wieder aus Bitmaske & IP[x] (egal welche von beiden) + CIDR-Suffix.

    Für den IP-Check kann man auch filter_var() benutzen.

    Glück Auf
    Tom vom Berg

    --
    Es gibt nichts Gutes, außer man tut es!
    Das Leben selbst ist der Sinn.
    1. Hallo TS,

      soweit hat es schon funktioniert. Der entscheidende Tipp war die Negierung (~) im zweiten Teil.

      Und dann hat mich irritiert, dass decbin da plötzlich 64 Stellen hatte. Aber führende Nullen werden eben nicht angezeigt. Wie soll man da auf was kommen, was man nicht sieht?

      Für den IP-Check kann man auch filter_var() benutzen.

      Gibt es auch ein Filterflag für nur interne Netze?
      Da hänge ich jetzt noch.

      Wie kann ich Dir einen Punkt geben?

      Grüße und Dank
      Me-Too

      1. @@me-too

        Wie kann ich Dir einen Punkt geben?

        Da rotz ich auch einfach mal einen Link hin.

        🖖 Stay hard! Stay hungry! Stay alive! Stay home!

        --
        Home Office ist so frustierend, weil man jetzt noch viel stärker bemerkt mit wievielen Menschen man zu tun hat, die nicht sinnerfassend lesen können. (@Grantscheam)
      2. Hello,

        Für den IP-Check kann man auch filter_var() benutzen.

        Gibt es auch ein Filterflag für nur interne Netze?
        Da hänge ich jetzt noch.

        Das sieht im Handbuch nicht so aus. Aber das kannst Du nach Abschluss der übrigen Filterung doch einfach durch drei (?) Stringvergleiche (strpos($ip, $erlaubt) === 0) für die erlaubten privaten IPv4-Netze prüfen.

        Oh nee: Für die B-Netze wird es wohl etwas aufwändiger. Der Bereich geht da ja von 172.16.0.0 bis 172.32.255.255 172.31.255.255.

        Glück Auf
        Tom vom Berg

        --
        Es gibt nichts Gutes, außer man tut es!
        Das Leben selbst ist der Sinn.
        1. Hallo Tom,

          Die Erkenntnis, ob ein String eine IPv4 enthält oder nicht, gewinnt man bereits mit ip2long. Ob er eine private oder reservierte IPv4 darstellt, ist durch Abfragen eines Präfix auf String-Ebene nicht so einfach. Bei 10. und 192.168. gelingt es, beim 172.16.0.0/12 Präfix nicht. Das sind die Adressen von 172.16.0.0 bis 172.31.255.255. Es ist besser, das in der Darstellung als Integer mit den Masken
          ($ipLong & 0xff000000) == 0x0a000000,
          ($ipLong & 0xfff00000) == 0xac100000 und
          ($ipLong & 0xffff0000) == 0xc0a80000
          zu prüfen.

          Außer den privaten gibt's auch noch die reservierten Netze. Sind die relevant?

          Man könnte auch überlegen, die Filter-Flags von FILTER_VALIDATE_IP vorschlagen? Die liefern FALSE, wenn die IP im privaten oder reservierten Range ist, und kapseln den ganzen Kram.

          BTW ist (a & b) | (~a & ~b) ist ein cleverer Trick, um die Bits zu finden, wo a und b gleich sind.

          Rolf

          --
          sumpsi - posui - obstruxi
        2. Hello,

          Hello,

          Für den IP-Check kann man auch filter_var() benutzen.

          Gibt es auch ein Filterflag für nur interne Netze?
          Da hänge ich jetzt noch.

          Das sieht im Handbuch nicht so aus. Aber das kannst Du nach Abschluss der übrigen Filterung doch einfach durch drei (?) Stringvergleiche (strpos($ip, $erlaubt) === 0) für die erlaubten privaten IPv4-Netze prüfen.

          Oh nee: Für die B-Netze wird es wohl etwas aufwändiger. Der Bereich geht da ja von 172.16.0.0 bis 172.32.255.255 172.31.255.255.

          Da muss man also das Bitmuster betrachten:

          ($ipLong & 0xfff00000) == 0xac100000

          wie RolfB schon schrieb.

          Glück Auf
          Tom vom Berg

          --
          Es gibt nichts Gutes, außer man tut es!
          Das Leben selbst ist der Sinn.