선행 0이 있거나없는 IP 주소는 동일합니까?


89

보안 시스템이 있고 네트워크 설정은 3 자리 IP 주소 만 허용합니다. 로 설정할 수 없으며 192.168.2.100대신을 사용해야 192.168.002.100합니다.

이 두 IP 주소가 다릅니 까? 192.168.xxx.xxx이것이 제대로 작동하려면 라우터의 LAN을 모두 설정해야 합니까? 이것에 대한 확실한 정보를 찾을 수 없습니다.


16
아래 답변에 동의하면 192.168.020.100은 192.168.20.100 과 동일 하지 않아야하지만 시스템에서 IP를이 방법으로 만 입력하도록 허용하면 동일 할 있습니다 (IP가 숫자로 입력되면 복사기로이를 보았습니다) 위 아래 화살표가있는 숫자). - "정상적인"키보드 입력이 가능할 때에도 시스템에 문제가있는 경우 (즉, 기술적으로 입력 할 192.168.2.100 있지만 불만이 있음) 공급 업체에 문의하십시오 (입력 유효성 검사가 보안 시스템에 얼마나 신뢰할 수 있는가). 그래서 엉터리입니다)?
하겐 폰 Eitzen

4
그것은 정말 기괴한 검증입니다. @Hagen이 암시하는 것처럼 보안 시스템을 전환했습니다.
궤도에서 가벼움 레이스

2
이것은 소프트웨어마다 다를 수 있습니다. 그것들은 앞에 있거나 없거나 유효 0하지만 각 옥텟에 3 자리 수가없는 IP 주소를 지원하지 않는 일부 응용 프로그램을 사용했습니다.
ps2goat

2
모든 IP (v4) 주소는 실제로 32 비트로 표시됩니다. 192.168.002.100도구가 0xc0a80264/ 3232236132 /를 나타내는 방법 이라면 192.168.2.100같은 것입니다.
Tim S.

1
다른 답변을 받아 주시겠습니까? 당신이 받아 들인 것은 실제로 잘못되었거나 적어도 불완전합니다. 11 개의 downvotes가 있습니다.
Arjan

답변:


101

도구에 따라 다릅니다.

대부분의 경우 두 개는 동일하지만 항상 그런 것은 아닙니다.

예를 들어, 0으로 시작하는 3 자리 숫자 (또는 @ Dietrich-Epp 덕분에 0으로 시작하는 두 자리 숫자)를 사용하는 경우 ping은 숫자가 8 진이라고 가정합니다.

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

C:\Users>ping 011.012.013.014

Pinging 9.10.11.12 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.

Ping statistics for 9.10.11.12:
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),

37
핑은 많지 않지만 사용하는 기본 루틴inet_addr()
cde

2
OSX에서도 발생합니다.
Johann Philipp Strathausen

21
숫자가 세 자리이기 때문이 아니라 숫자 앞에 0이 있기 때문입니다. 9를 8 진수로 사용할 수 없기 때문에 작동하지 않는 09.09.09.09를 핑 (ping)하여이를 테스트 할 수 있습니다.
Dietrich Epp

65

사용하는 모든 소프트웨어가 도트 십진법과 서브넷을 올바르게 사용한다고 가정하면 동일합니다.

예를 들어 192.168.0.1은 도트 이진 값 11000000.10101000.00000000.00000001의 친숙한 도트 십진 표기법입니다.

192.168.0.1 또는 192.168.000.001로 입력하든 모두 11000000.10101000.00000000.00000001과 같습니다.


63
점은 또한 편의를위한 것입니다. 실제 IP는 11000000101010000000000000000001
cpast

14
@cpast 또는 16 진수 :C0A80001
jfs

13
또는 8 진수로 (0으로 시작하거나 점이 있거나없는) 예 : 192.168.2.100에 대해 0300.0250.2.0144를 핑
Sergey

15
또는 십진수로3232235521
oldmud0

14
@GreenstoneWalker의 답변에서 지적했듯이 많은 프로그램은 동일한 프로그램을 인식하지 못합니다. 앞에 0이있는 숫자 (숫자 8 또는 9를 포함하지 않음)는 8 진법 숫자로 이해됩니다. 따라서 010.000.001.063은 "10.0.1.63"대신 "8.0.1.51"(8 진수 010 = 10 진수 8; 8 진수 063 = 10 진수 51)로 해석됩니다!
Doktor J

37

주어진 프로그램이 주어진 주소를 구문 분석하는 데 사용하는 도구 또는 기능에 따라 다릅니다. Microsoft와 Linux 및 다른 OS는 모두 주소 구문 분석을 위해 POSIX 호환 inet_addr()루틴을 사용 합니다.

Ping 및 FTP와 같은 많은 TCP / IP 프로그램은 inet_addr () 소켓 함수를 사용하여 IP 주소 문자열을 4 바이트 주소로 변환합니다. 이 함수는 표준 10 진수, 8 진수 및 16 진수 표기법으로 IP 주소를 허용합니다.
Microsoft KB115388 Ping 및 FTP는 IP 주소를 8 진수로 8 진수로 확인합니다.

 

inet_addr () 함수는 인터넷 호스트 주소 cp를 IPv4 숫자 및 점 표기법에서 네트워크 바이트 순서로 이진 데이터로 변환합니다.

위의 모든 형태에서, 점선으로 된 주소의 구성 요소는 10 진수, 8 진수 (선행 0) 또는 16 진수 (선행 0X)로 지정할 수 있습니다. 이러한 형식의 주소를 통칭하여 IPv4 숫자 및 점 표기법이라고합니다. 정확히 4 개의 10 진수를 사용하는 형식을 IPv4 점 분리 십진수 표기법 (또는 때로는 IPv4 점 분리 십진수 표기법)이라고합니다.
inet_addr (3) : 인터넷 주소 변경 루틴-Linux 매뉴얼 페이지

따라서 특정 시스템에서는 각 8 진수에 대해 3 자리 10 진수 표기법이 필요할 수 있지만, 이것은 보편적이지 않으므로 올바른 IP 주소가 입력되도록주의해야합니다.

물론 각 유형에 유효한 숫자 만 작동합니다. 범위를 벗어난 8 진수, 16 진수 또는 10 진수는 실패하거나 문제를 일으킬 수 있습니다. 8 진수 088, 16 진수 0xGG 또는 10 진수 280은 모두 잘못된 예입니다.


3
기본 기능의 경우 +1 또한이 함수는 8이 8 진수의 유효한 숫자가 아니므로 유효한 바이트 (예 : .88)가 0으로 채워지면 IP 구문 분석이 실패합니다.
March Ho

Windows XP (및 그 이전)에서이 함수는 유효하지 않은 8 진수를 받아들이고 여전히 변환하려고 시도합니다. 이로 인해 명백하지 않은 동작이 발생할 수 있습니다. Vista에서 유효하지 않은 숫자는 도메인 이름으로 취급되며 Windows는 이에 대한 DNS 조회를 시도합니다. 어느 것도 이상한 행동이지만 적어도 문제는 발생하지 않습니다.
Tonny

@tonny는 POSIX inet_addr ()이 255까지 반복되는 유효하지 않은 값에 대해 -1을 리턴하기 때문입니다.
cde

@cde 나는 그것을 inet_addr ()의 역학에 깊이 파고 들지 않았다. 나는 당신의 말을 받아 들일 것입니다 :-)
Tonny

13

으로 밝기 궤도에서 경주 와 다른 사람들이 지적,

INET(3)매뉴얼 페이지 에 대해 설명 inet_addr하고 inet_aton"이진 형식으로 IPv4의 수 - 점 표기"를 변환에 사용되는 표준 기능. 그것은 말한다

... 점으로 구분 된 주소의 구성 요소는 10 진수, 8 진수 (선행 0) 또는 16 진수 (선행 0X) 로 지정할 수 있습니다 .

따라서 기술적으로 NO 는 앞에 0이있는 IP 주소가 앞에 0이없는 IP 주소와 항상 같지 않습니다. 그러나 귀하의 경우 192.168.2.100192.168.002.100같으므로 002 == 2.

각 구성 요소의 길이가 정확히 3 자 여야하고, 선행 0이 잘못 요구되는 모든 사용자 인터페이스가 손상되었습니다.


1
(일부 장비에서) "리딩 제로"가 필요하다는 생각은 논쟁의 여지가없는 것 같습니다. "잘못된 요구"/ "파손"이라고 부르는 근거는 무엇입니까? 그것이 INET (3) / inet_addr / inet_aton을 위반 한 후에? 그러한 제로를 요구하는 구현은 잘 통신 할 수있는 다른 코드를 사용하고있을 가능성이 높으므로 "깨지지"않습니다. (프린터가이 작업을 수행하는 것을 보았습니다.) INET (3) 매뉴얼 페이지가 RFC 및 이 초안 문서에서 인용 된 기타 공식 문서와 같은 다른 공식 문서보다 더 "권한이있는"리소스라고 말하는 근거가 있습니까?
TOOGAM

6

일부 구현에서는 앞에 0이있는 8 진수를 10 진수로 간주하고 다른 구현에서는 8 진수로 간주합니다. 옥텟이 0 내지 7의 범위에있는 한, 이것은 차이를 만들지 않는다. 예를 들어 두 구현에서 모두 192.168.002.100해석됩니다 192.168.2.100.

그러나 구현으로 또는 192.168.010.100해석 에 따라 해석 될 수 있는 주소를 입력해야하는 경우 . 또한 구현이 존재하지 않을 가능성이 높으므로 선행 0을 구문 오류로 간주합니다. 또한 소프트웨어가 어떤 이유로 든 표준 표현을 사용해야한다고 주장하는 시나리오가 있습니다. 이러한 모든 이유 때문에 IP 주소를 작성할 때 0을 피하는 것이 좋습니다.192.168.10.100192.168.8.100

IP 주소를 구문 분석해야하는 소프트웨어를 작성하는 경우 선행 0을 수락하는 것이 좋지만 적절한 위치에 경고를 출력하는 것이 좋습니다.

약간 관련되어 있으며 점 표기법으로 4 개 미만의 컴포넌트를 가질 수있는 구현이 있습니다. 4 개 미만의 구성 요소가있는 경우 마지막 구성 요소는 8 비트를 초과하고 이전 구성 요소는 정확히 8 비트를 갖습니다. 예를 들어 192.168.612실제로 쓸 수있는 올바른 방법 192.168.2.100입니다. 그러나이 표기법을 다시 사용하는 것은 권장되지 않습니다.


0

간단한 팁 : 경우에 따라 IP 주소에 접두사 0을 사용하지 않는 것이 중요합니다. 예를 들어 Apache .htaccess 거부 규칙이 있습니다.

당신이 같은 것을 사용하면

deny from 11.22.33.22

Apache는 너무 어리석어 서 다음 IP의 액세스도 차단합니다.

111.22.33.22

11.22.33.221

211.22.33.221

일반적으로 11.22.33.22 를 포함 하는 모든 IP 주소

따라서 차단하지 않으려는 IP를 차단하지 않으려면 다음을 사용해야합니다.

deny from 011.022.033.022

Apache가 11.22.33.22 IP 주소에서만 액세스를 차단하도록합니다.


3
흥미 롭군 이에 대한 참조를 제공 할 수 있습니까?
Scott

참조는 선행 제로를 사용하지 않아 많은 방문자가 차단 된 후 개인적인 경험과 많은 시행 착오입니다. 잘못된 금지를 피하는 또 다른 방법은 IP를 CIDR 형식으로 사용하는 것입니다. 예를 들어 11.22.33.22 대신 11.22.33.22/32
Nick Gar

0

이것에 조심하십시오. 그것은 해야한다 동일하지만입니다 NOT !
나는 이것에 대한 설명을 찾을 수 없었지만 윈도우와 리눅스에서 ip가 있거나없는 IP 주소는 동일하지 않다고 정의 할 수있다! 아마도 이것은 16 진수 또는 이진과 같은 다른 형식에서 변환하는 것과 관련이 있습니다.

Windows와 Linux에 대한 나의 경험에서 도구 의존은 아니지만 OS 의존 그것은 10.08.03.100과 같은 ips를 사용하는 일부 문제에서 실행되기 때문에 보입니다.

  • 참고 : "10.08.0.1"및 10.09.0.1을 찾을 수 없습니다
  • 참고 : "10.010.0.1"은 10.8.0.1로 해결되었습니다.

linux / debian7 / 8 : "ping"및 "snmpget"도구와 동일한 결과

user@test:~$ ping 10.7.0.1
PING 10.7.0.1 (10.7.0.1) 56(84) bytes of data.
^C
--- 10.7.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.07.0.1
PING 10.07.0.1 (10.7.0.1) 56(84) bytes of data.
^C
--- 10.07.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
^C
--- 10.8.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.08.0.1
**ping: unknown host 10.08.0.1**
user@test:~$ ping 10.9.0.1
PING 10.9.0.1 (10.9.0.1) 56(84) bytes of data.
^C
--- 10.9.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.09.0.1
ping: unknown host 10.09.0.1
user@test:~$ ping 10.10.0.1
PING 10.10.0.1 (10.10.0.1) 56(84) bytes of data.
^C
--- 10.10.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.010.0.1
PING 10.010.0.1 (10.8.0.1) 56(84) bytes of data.
^C
--- 10.010.0.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1001ms

windows7 / 8 / 10 : "ping"및 "telnet"도구와 동일한 결과

(죄송합니다, 영어 창을 가지고 있지 않습니다. 오류는 호스트를 찾을 수 없음을 나타냅니다)

C:\Users\user>ping 10.7.0.1

Ping wird ausgeführt für 10.7.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.07.0.1

Ping wird ausgeführt für 10.7.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.8.0.1

Ping wird ausgeführt für 10.8.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.08.0.1
Ping-Anforderung konnte Host "10.08.0.1" nicht finden. Überprüfen Sie den Namen,

C:\Users\user>ping 10.9.0.1

Ping wird ausgeführt für 10.9.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.09.0.1
Ping-Anforderung konnte Host "10.09.0.1" nicht finden. Überprüfen Sie den Namen,

C:\Users\user>ping 10.10.0.1

Ping wird ausgeführt für 10.10.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.010.0.1

Ping wird ausgeführt für 10.8.0.1 mit 32 Bytes Daten:
STRG-C
^C

선행 0은 종종 8 진을 나타냅니다. 실제로 8 진수 010은 10 진수 8이며 08과 09는 유효하지 않은 8 진수입니다. 예, AthomSfere의 (현재) 허용되는 답변이 잘못되었습니다 (또는 적어도 불완전합니다). 의견과 다른 답변을 참조하십시오.
Arjan

10.010.0.1의 처리는 절대적으로 끔찍합니다. Microsoft Windows에서 ping 10.070.0.1은 10.56.0.1로 처리되고 10.080.0.1은 "Ping 요청에서 호스트 10.080.0.1을 찾을 수 없습니다. 이름을 확인하고 다시 시도하십시오."라는 오류가 즉시 발생합니다.
TOOGAM

1
예, @TOOGAM, 8 진수 070은 10 진수 56입니다. 8 진수 080은 유효한 숫자가 아닙니다.
Arjan

-4

두 IP 주소가 다릅니다.

하나:

  • 사람들은 일반적으로 그것들을 동일하게 생각합니다.
  • 일부 소프트웨어는 그것들을 동일하게 간주합니다.
  • 일부 플랫폼에서 일부 소프트웨어는 다른 것으로 간주합니다.

혼란스럽게 들리면 IP 주소 작성 방법을 관리하는 표준이 없기 때문에 역사상의 다른 지점과 플랫폼에 따라 다른 프로그래머가 수행해야 할 작업에 대해 다른 아이디어를 가지고 있기 때문입니다.

IP 주소는 실제로 이진이며 사람들은 점으로 구분 된 10 진수 표기법을 사용하여 IP 주소를 나타내는 경향이 있습니다. 소프트웨어는 다양한 숫자 기반 (예 : 10 진수, 8 진수, 16 진수)을 받아들이고 작성 방법에 따라 다양한 방식으로 해석 할 수 있습니다. 작성 방법은 작성중인베이스를 소프트웨어에 알릴 수 있습니다.

나는 당신을 조언 : 맨 앞에 0을 사용하지 않는 당신은 점으로 구분 된 십진수 표기법을 사용하는 것을 의미합니다. 일부 소프트웨어는 8 진수를 입력하고 있음을 나타내는 플래그를 고려합니다. 10 진수를 입력하면 예상 한 결과를 얻지 못합니다.

나는 비슷한 질문을 하고 좋은 답변을 얻었으므로 RFC에 대해 읽으려면 좋은 정보가 있습니다.


-6

어느 쪽이든 작동해야합니다. 세 자리 숫자로 ping을해도 컴퓨터가 IP 주소를 이해합니다.

편집 : Windows는 8 진수로 읽습니다 .Linux에서만 작동합니다.


사실입니다. 알려진 10 진수 형식은 실제로 사람에게만 해당됩니다. 네트워크의 장치는이 IP 주소 표현을 사용하지 않습니다.
Patrick Seymour

1
@Brock Vond : 그렇습니다. 실수로 186과 168을 바꾸 었다고 생각합니다.
Patrick Seymour

6
3 자리 숫자로 ping을 사용하면 작동하지 않을 수 있습니다. 그것들을 8 진으로 취급 할 수 있습니다.
Greenstone Walker

1
@LightnessRacesinOrbit 사실, 주어진 예제는 적어도 Windows와 Debian에서 맥을 넣지 않아도 작동합니다 (Mac은 없습니다). 버그 / 기능은 숫자가 0으로 채워지고 0으로 채워진 숫자가 7보다 큰 경우에만 발생합니다 (8 진수와 10 진수는 동일 함). 0으로 채워진 유효한 10 진수 주소 (예 : 012.034.056.078)를 입력하려고해도이 주소를 8 진수로 구문 분석하려고 시도하여 핑 기능이 실패합니다.
March Ho

1
@MarchHo : 그렇습니다. 우리 모두의 말입니다.
궤도에서 가벼움 레이스

-11

선행 0은 의미가 없습니다. 옥텟은 (기본 10) 0-255 숫자이며 문자열이 아닙니다.

나는 당신이 무엇을 묻는 지 확실하지 않기 때문에 (또는 당신이 어떤 질문을 할 것인지 알고 있습니다.) 서브넷 마스크 192.168.0.0 내에서 11.12.13.14를 선택하면 해당 장치는 해당 서브넷과 통신하거나 해당 서브넷을 사용할 수 없습니다.


lol-아니 서브넷을 이해하지 못하고 네트워킹의 기본 개념은 ... 여기에 3 자리 숫자가 필요한 제품은 없었습니다. 방금 변수로 11.12.13.14를 사용하고 있었지만 ... 감사합니다 :)
Brock Vond

9
-1 : 아니요. inet_addr주소 구문 분석을 위해이 도구에 의존하는 수십만 개의 도구는 선행 0을 사용하여 바이트가 기본 8 표기법으로 제공됨을 의미합니다. 그것은 "의미없는"것이 아닙니다.
궤도에서 가벼움 레이스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.