Maksymalna długość adresu IP klienta [duplikat]

Możliwy duplikat:
Maksymalna długość tekstowej reprezentacji adresu IPv6?

Jaki jest maksymalny rozmiar kolumny bazy danych przechowującej adresy IP klientów? Mam go ustawiony na 16 teraz, ale czy Mogę uzyskać adres ip, który jest dłuższy niż z IPv6, itp?

Author: Community, 2009-07-03

8 answers

Dla IPv4, można uniknąć przechowywania 4 nieprzetworzonych bajtów adresu IP (każda z liczb pomiędzy okresami w adresie IP to 0-255, tzn. jeden bajt). Ale wtedy musiałbyś tłumaczyć wchodzenie i wychodzenie z DB i to jest bałagan.

Adresy IPv6 mają 128 bitów (w przeciwieństwie do 32 bitów adresów IPv4). Są one zwykle zapisywane jako 8 grup po 4 cyfry szesnastkowe oddzielone dwukropkami: 2001:0db8:85a3:0000:0000:8a2e:0370:7334. 39 znaków jest odpowiednie do przechowywania adresów IPv6 w tym format.

Edit: istnieje jednak zastrzeżenie, zobacz odpowiedź @Deepak po szczegóły dotyczące adresów IPv4 zmapowanych Na IPv6. (Prawidłowa maksymalna długość łańcucha IPv6 wynosi 45 znaków .)

 217
Author: Matt Bridges,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-11 23:54:52

Jest zastrzeżenie dotyczące ogólnej 39-znakowej struktury IPv6. dla adresów IPv4 zmapowanych, ciąg znaków może być dłuższy (niż 39 znaków). Przykład aby to pokazać:

IPv6 (39 znaków):

ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:ABCD

IPv4-zmapowane IPv6 (45 znaków):

ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:192.168.158.190

Uwaga: ostatnie 32-bitowe (odpowiadające adresowi IPv4) mogą wymagać maksymalnie 15 znaków (ponieważ IPv4 używa 4 grup po 1 bajt i jest sformatowany jako 4 liczby dziesiętne w zakresie 0-255 oddzielone kropkami (w tym . Znak), więc maksimum to DDD.DDD.DDD.DDD).

Prawidłowa maksymalna długość łańcucha IPv6 wynosi zatem 45.

To było pytanie quizowe w szkoleniu IPv6, w którym uczestniczyłem. (Wszyscy odpowiedzieliśmy 39!)

 352
Author: Deepak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-03 14:53:48

Jeśli chcesz obsługiwać IPV6 w standardowej notacji, istnieje 8 grup po 4 cyfry szesnastkowe:

2001:0dc5:72a3:0000:0000:802e:3370:73E4

32 cyfry szesnastkowe + 7 separatorów = 39 znaków.

Uwaga: Jeśli chcesz również trzymać adresy IPV4 mapowane jako adresy IPV6, użyj 45 znaków jak sugeruje @Deepak .

 23
Author: David J. Liszewski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:50

Weź to od kogoś, kto próbował tego na trzy sposoby... wystarczy użyć varchar (39)

Nieco mniej wydajna pamięć znacznie przewyższa wszelkie korzyści wynikające z konieczności konwersji na insert/update i sformatowania go podczas wyświetlania go w dowolnym miejscu.

 10
Author: Neil N,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-20 18:07:23

Jak opisano w IPv6 Wikipedia Artykuł,

Adresy IPv6 są zwykle zapisywane jako osiem grup po cztery szesnastkowe cyfry, gdzie każda grupa jest oddzielona przez dwukropek (:)

Typowy adres IPv6:

2001:0db8:85a3:0000:0000:8a2e:0370:7334

To jest 39 znaków. Adresy IPv6 mają długość 128 bitów, więc można by użyć kolumny binarnej (16), ale myślę, że zostałbym przy alfanumerycznej reprezentacji.

 8
Author: Michael Petrotta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-02 21:24:05

IPv4 używa 32 bitów, w postaci:

255.255.255.255

Przypuszczam, że zależy to od typu danych, czy tylko przechowujesz jako ciąg znaków z typem CHAR, czy używasz typu numerycznego.

IPv6 używa 128 bitów. Nie będziesz mieć IP dłużej niż to, chyba że dołączysz do nich inne informacje.

IPv6 jest pogrupowane w zestawy 4 cyfr szesnastkowych oddzielonych dwukropkami, jak (z Wikipedii):

2001:0db8:85a3:0000:0000:8a2e:0370:7334

Możesz bezpiecznie przechowywać go jako 39-znakowy łańcuch, jeśli chcesz żeby to zrobić. Istnieją również inne sposoby zapisu adresów. Zestawy zer mogą być obcięte do pojedynczego 0 lub zestawy zer mogą być całkowicie ukryte przez podwójny dwukropek.

 2
Author: Chet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-02 21:30:09

Jeśli przechowujesz go tylko w celach informacyjnych, możesz go zapisać jako ciąg znaków, ale jeśli chcesz wykonać wyszukiwanie, na przykład, aby sprawdzić, czy adres IP znajduje się w jakiejś tabeli, potrzebujesz "reprezentacji kanonicznej."Konwersja całej rzeczy do (dużej) liczby jest właściwą rzeczą. Adresy IPv4 mogą być przechowywane jako długi int (32 bity), ale do przechowywania adresu IPv6 potrzebny jest 128-bitowy numer.

Na przykład, wszystkie te ciągi są tak naprawdę tym samym adresem IP: 127.0.0.1, 127.000.000.001,:: 1, 0:0:0:0:0:0:0:1

 2
Author: user410119,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-03 20:41:43

Ludzie mówią o znakach, kiedy można skompresować adres IP do nieprzetworzonych danych.

Więc w zasadzie, ponieważ używamy tylko IPv4 (32bit) lub IPv6 (128bit), oznacza to, że potrzebujesz co najwyżej 128 bitów przestrzeni, lub 128/8 = 16 bajtów!

, który jest znacznie mniejszy niż sugerowane 39 bajtów(zakładając, że charset jest ascii).

To powiedziawszy, będziesz musiał zdekodować i zakodować adres IP do / z surowych danych, co samo w sobie jest trywialną rzeczą do zrobienia( robiłem to wcześniej, zobacz PHP ip2long() dla 32-bitowych adresów IP).

Edytuj: inet_pton (i jego przeciwieństwo, inet_ntop()) robi to, czego potrzebujesz i działa z obydwoma typami adresów. Ale uważaj, w systemie Windows jest on dostępny od PHP 5.3.

 2
Author: Christian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-17 11:25:16