IPv6 주소의 텍스트 표현의 최대 길이는?


430

$_SERVER["REMOTE_ADDR"]PHP에서 반환 한 데이터를 DB 필드, 매우 간단한 작업 에 저장하고 싶습니다 . 문제는 웹 서버가 제공하는 IPv6 주소 의 텍스트 표현 의 최대 길이에 대한 적절한 정보를 찾을 수 없다는 것 $_SERVER["REMOTE_ADDR"]입니다.

텍스트 표현을 주소가 일반적으로 인코딩되는 128 비트로 변환하는 데 관심이 없으며에서 반환 한 IPv6 주소를 저장하는 데 필요한 최대 문자 수를 알고 싶습니다 $_SERVER["REMOTE_ADDR"].


6
존 인덱스는 어떻습니까?
Robert Tupelo-Schneck

5
#define INET_ADDRSTRLEN (16) #define INET6_ADDRSTRLEN (48)

출처 : lxr.free-electrons.com/source/include/linux/inet.h

1
질문 stackoverflow.com/questions/1076714/… 에는 유사하지만 유용한 답변이 있습니다.
Edward

답변:


615

45 자 .

당신은 주소가 될 것으로 예상 할 수 있습니다

0000:0000:0000:0000:0000:0000:0000:0000

8 * 4 + 7 = 39

4 자리로 구성된 8 개의 그룹과 :그 사이 에 7 이 있습니다.

그러나 IPv4로 매핑 된 IPv6 주소 가있는 경우 마지막 두 그룹은 기본적으로 10으로 구분할 수 있습니다 ( .예 :). [::ffff:192.168.100.228]. 완전히 작성 :

0000:0000:0000:0000:0000:ffff:192.168.100.228

(6 * 4 + 5) + 1 + (4 * 3 + 3) = 29 + 1 + 15 = 45

이것은 입력 / 디스플레이 규칙입니다. 여전히 128 비트 주소이며 저장을 위해 원시 콜론으로 분리 된 형식, 즉 [0000:0000:0000:0000:0000:ffff:c0a8:64e4]위의 주소 로 표준화하는 것이 가장 좋습니다 .


245
헤더 파일은 INET6_ADDRSTRLEN을 46으로 정의합니다. 이는 45 자에 후행 null이 들어갑니다.
wisnij

6
IPv6 주소에 범위 영역 stackoverflow.com/questions/5746082/… 도 포함될 수 있다는 점에 주목할 필요가 있습니다. 예를 들어 RemoteEndpointMessageProperty.Address
Rory

:: ffff : 127.0.0.1 같은 ipv4 주소가 아닌가?
graywolf

52
@FelipeSchenone 유용하지 않은 그런 종류의 사고-크기를 알아 내고 사용하십시오. 버퍼를 확장하려는 유일한 시간은 64자를 패딩하는 데 도움이되지만 45 (+1)이 최적입니다.
gbjbaanb

1
이것은 ipv6 주소의 백분율 기호를 고려합니까? 참조 - superuser.com/questions/99746/...
gaurav

85

Linux에서는 constant를 참조하십시오 INET6_ADDRSTRLEN(include <arpa/inet.h>참조 man inet_ntop). 내 시스템 (헤더 "in.h")에서 :

#define INET6_ADDRSTRLEN 46

마지막 문자는 내가 믿는대로 NULL을 종료하기위한 것이므로 다른 대답으로 최대 길이는 45입니다.



@eis는 아마도 2013 년에있을 것입니다. 구조체 정렬을 위해 아마도 증가했습니다.
Iiridayn

13

내 자신의 질문에 대답 :

IPv6 주소는 일반적으로 4 개의 16 진수로 구성된 8 개의 그룹으로 작성되며 각 그룹은 콜론 (:)으로 구분됩니다.

최대 39 자입니다.


7
그러나주의해야 할 점은 stackoverflow.com/a/7477384/3787376 ( "클라이언트 IP 주소의 최대 길이")-견적 : "IPv4 매핑 IPv6 주소의 경우 문자열은 39 자보다 길 수 있습니다."를 참조하십시오. "IPv4 매핑 IPv6"은 45 자이며 "NNNN : NNNN : NNNN : NNNN : NNNN : NNNN : 192.168.158.190"형식입니다. 따라서 최대 값은 45 자 여야합니다. stackoverflow.com/a/166157/3787376 (이 질문) 의 답변 도이 점을 보여줍니다.
Edward

6

이 링크의 @Deepak 답변이 정답에 더 가깝다고 생각합니다. 클라이언트 IP 주소의 최대 길이 . 정확한 크기는 45가 아니라 39입니다. 때로는 필드 크기를 수정하려고 시도하지만 충분한 스토리지 크기를 준비하면 더 나은 것 같습니다.


4

표시된대로 표준 ipv6 주소는 최대 45 자이지만 ipv6 주소에는 종료 길이 다음에 "범위"또는 "영역"문자열이 포함될 수 있으며 길이는 고정되어 있지 않지만 일반적으로 작은 양의 정수 또는 네트워크 인터페이스입니다 이름은 실제로 45 자보다 클 수 있습니다. 네트워크 인터페이스 이름은 일반적으로 "eth0", "eth1", "wlan0"이므로 한계를 50으로 선택하면 충분합니다.


3
사실, 이것은 링크 로컬 주소 일 뿐이며, 웹 사이트가 인터넷에서 실행되면 (아직 개발하지 않는 동안) 그러한 주소를 보지 못할 것입니다.
Michael Hampton

1

HTTP_X_FORWARDED_FOR단일 IP 주소를 포함하는 것처럼 보이는 특정 헤더를 조심하십시오 . 실제로 여러 주소 (내가 가정하는 프록시 체인)가 포함될 수 있습니다.

쉼표로 구분 되어 있으며 총 45 자보다 훨씬 길 수 있으므로 DB에 저장하기 전에 확인하십시오.


3
약간 충돌 -1 (이 함정에 빠졌기 때문에 혼란 스럽습니다.이 답변에는이 페이지에 도착할 일부 사람들과 관련된 정보가 포함되어 있다고 생각합니다) 그럼에도 불구하고 이것은 분명히 질문에 대한 대답이 아니기 때문입니다. 아마도 질문에 대한 의견으로 더 좋을 것입니다.
Mark Amery
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.