Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> ipv6 a przechowywanie w mysql
reyder
post 2.03.2011, 18:17:02
Post #1





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 2.03.2011

Ostrzeżenie: (0%)
-----


Witam. Jako, że myślę przyszłościowo to zastanawiam się nad ipv6 i napotkałem dość poważny problem. Mianowicie zastanawiam się jak przechowywać ipv6 w tabeli mysql. Zastanawiałem się nad 2-bigint, wtedy ipv6 zajmowało by drugą kolumnę biginta i łatwo było by rozróżnić jakie ip ma użytkownik, ale po dłuższym zastanowieniu jest to bardzo nie wygodne rozwiązanie. Drugi pomysł to przechowywanie w varchear, to chyba nie zbyt wydajny sposób, a trzeci to przechowywanie w postaci binarnej. Według mnie to najlepsze rozwiązanie. Zawadza mi tylko jeszcze jeden problem, że połowa adresów będzie ipv4 a druga połowa ipv6. Nie da się przekonwertować ipv4 użytkownika na wersje ipv6 i dopiero uaktualniać w bazie danych ?
Go to the top of the page
+Quote Post
Crozin
post 2.03.2011, 18:39:04
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


1. IPv4 to w pewnym sensie jedynie podzbiór IPv6, tak więc wszystkie adresy można traktować jako IPv6.
2. Niestety MySQL tutaj nie jest zbyt pomocny... problem był poruszany wiele razy na SO: http://www.google.com/search?client=opera&...-8&oe=utf-8
Go to the top of the page
+Quote Post
thek
post 2.03.2011, 19:39:55
Post #3





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Ależ da się konwerować. Adresy ipv4 można przetworzyć do ipv6 poprzez dołożenie do niego wzorca.
ipv6 jest 128-bitowe o postaci 8 bloków 16-bitowych lub 4 bloków 32-bitowych (a więc można go zapisać jako 4-krotność starego ipv4)
ipv4 jest 32-bitowe o postaci 4 bloków 8-bitowych
Wzorzec pozwalający na to aby ipv4 było identyfikowane przez ipv6 to ::ffff:(ipv4), a więc

(ipv6) = 0.0.0.0 : 0.0.0.0 : 0.0.255.255 : (ipv4)

I tak też rób... ipv4 zapisuj z takim dodatkiem a urządzenia ipv6 także go rozpoznają. Od biedy nawet jeśli rozpoznasz ów wzorzec, to będziesz wiedział, że masz to czynienia z ipv4 ukrytym jako ipv6.

W bazie możesz to od biedy zapisać jako jako złożenie kilku bloków. Przypuśćmy 3 kolumny gdzie domyślnie są: 0, 0, inet_aton(0.0.255.255) i jedna przechowująca adres jako ipv4 też w inet_aton. Dzięki temu łatwo odseparujesz po 3 kolumnie co jest, a co nie jest ipv6. Ipv4 będzie zawsze identyczna smile.gif


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
reyder
post 2.03.2011, 21:08:28
Post #4





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 2.03.2011

Ostrzeżenie: (0%)
-----


Znalazłem fajną funkcję która od razu przekształca mi ipv4 na ipv6
  1. function IPv4To6($Ip) {
  2. static $Mask = '::ffff:'; // This tells IPv6 it has an IPv4 address
  3. $IPv6 = (strpos($Ip, '::') === 0);
  4. $IPv4 = (strpos($Ip, '.') > 0);
  5. if (!$IPv4 && !$IPv6) return false;
  6. if ($IPv6 && $IPv4) $Ip = substr($Ip, strrpos($Ip, ':')+1); // Strip IPv4 Compatibility notation
  7. elseif (!$IPv4) return $Ip; // Seems to be IPv6 already?
  8. $Ip = array_pad(explode('.', $Ip), 4, 0);
  9. if (count($Ip) > 4) return false;
  10. for ($i = 0; $i < 4; $i++) if ($Ip[$i] > 255) return false;
  11.  
  12. $Part7 = base_convert(($Ip[0] * 256) + $Ip[1], 10, 16);
  13. $Part8 = base_convert(($Ip[2] * 256) + $Ip[3], 10, 16);
  14. return $Mask.$Part7.':'.$Part8;
  15. }


Połączę to jeszcze z funkcją pozyskujące ip i będe miał wszystkie wychodzące jako ipv6 i w takim formacje chcę je zapisać w bazie. Tylko teraz pytanie jak ?
Go to the top of the page
+Quote Post
thek
post 2.03.2011, 21:55:51
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




A nie pomślałeś by to zostawić jak najprościej jest? 4 pola typu int, które przechowują 4 bloki-32 bitowe jest już funkcja inet_atoi w()ięc czemu jej mamy nie używać? Rozwiązuje nam ona problem ipv4, ponieważ czwarty blok to będzie stary ipv4 i jego wtedy nie musimy tykać. Trzeci blok nam bedzie determinował z czym mamy do czynienia... Jeśli trafimy tam inet_atoi(0.0.255.255) to na bank mamy do czynienia z ipv4... By szybciej to sprawdzać założymy na ten trzeci blok indeks. Domyślnie te pola będą przyjmowały wartości:
Pierwsze: inet_atoi(0.0.0.0)
Drugie: inet_atoi(0.0.0.0)
Trzecie: inet_atoi(0.0.255.255)
Czwarte: można olać bo tu zawsze coś będzie.
Po stronie php jedynie ip będziemy dzielili na bloki 32-bitowe. Sprawdzimy czy podany ip będzie miał : (ipv6) czy może . (ipv4) i zareagujemy. Jeśli będą . to od razu, bez sentymentu, inet_atoi dla 4 bloku tylko bo mamy do czynienia z ipv4. Jeśli trafimy na : to musimy zrobić explode (zapewne po smile.gif na 4 bloki i potem tylko już zapisać każdy z nich do odpowiedniego pola. Jako że będziemy mieć do czynienia z liczbą w heksach, to wystarczy po prostu walnąć hex2dec i pojechać z tym do bazy. Warto zapamiętać, że explode po : dla ::ffff:(ipv4 jako hexy) da nam elementy puste w tablicy wynikowej, a więc wtedy do bazy powinny lecieć zera.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Zyx
post 2.03.2011, 22:28:11
Post #6





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

Ostrzeżenie: (0%)
-----


http://docs.php.net/manual/en/function.inet-pton.php

  1. $addr = inet_pton($address);
  2. if(strlen($addr) == 4)
  3. {
  4. $addr = 'binarnie ::ffff:'.$addr;
  5. }


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 16.07.2025 - 16:06