핑 192.168.072 (2 개의 점만)가 192.168.0.58의 응답을 반환하는 이유는 무엇입니까?


379

실수로 IP 주소의 점을 놓치고을 입력했습니다 192.168.072.
놀랍게도 나는 컴퓨터에 연결192.168.0.58

192.168.072하면에서 응답을받습니다 192.168.0.58.

왜 이런거야?


Windows 도메인의 Windows PC를 사용하고 있습니다.


내가 핑하면 192.168.72나는로부터 응답을 얻을 192.168.0.72, 그래서 그것은 보인다 0에서을 072(내 원래 실수에) 중요하다.


이 질문은 금주슈퍼 사용자 질문입니다 . 자세한 내용
블로그 항목 을 읽 거나 블로그에 직접 참여 하십시오.



2
흥미롭게도 리눅스에서도 똑같은 일이 일어납니다 : ping 192.168.072prints PING 192.168.072 (192.168.0.58) 56(84) bytes of data.[...].
기계 달팽이

9
더 랜덤 한 것은 192.168.0.58응답을 얻을 수있는 기계가 있다는 것입니다 . 그 가능성은 무엇입니까?
제임스 메르 츠

3
@KronoS 학교 나 회사 네트워크에 있다면 실제로 그렇게 이상하지 않습니다. 일부 DHCP 서버는 증가하는 순서대로 주소를 제공하며 대부분이 사용됩니다.
Taum

5
192.168.0.58시간 초과입니다. 모든 핑 요청이 어떻게 든 서버를 중단시킬 수 있습니까?!
iamserious

답변:


570

모두가 RFC, IP 클래스 등으로 지나치게 복잡합니다. 몇 가지 테스트를 실행하여 ping명령이 사용자에 의해 IP 입력을 구문 분석하는 방법을 확인하십시오 (외부 채프 제거).

> ping 1
Pinging 0.0.0.1 with 32 bytes of data:

> ping 1.2
Pinging 1.0.0.2 with 32 bytes of data:

> ping 1.2.3
Pinging 1.2.0.3 with 32 bytes of data:

> ping 1.2.3.4
Pinging 1.2.3.4 with 32 bytes of data:

> ping 1.2.3.4.5
Ping request could not find host 1.2.3.4.5. Please check the name and try again.

> ping 255
Pinging 0.0.0.255 with 32 bytes of data:

> ping 256
Pinging 0.0.1.0 with 32 bytes of data:

보시다시피, pingWindows 의 명령을 사용하면 다른 IP 주소 형식을 사용할 수 있습니다. IPv4 주소는 다음과 같이 네 부분으로 나눌 수 있습니다 ( " 점수 "). A.B.C.Dping명령을 사용하면 일부를 생략하고 기본값을 0다음과 같이 채울 수 있습니다.

1 part  (ping A)       : 0.0.0.A
2 parts (ping A.B)     : A.0.0.B
3 parts (ping A.B.C)   : A.B.0.C
4 parts (ping A.B.C.D) : A.B.C.D

단일 부품 만 공급하는 경우 255 미만 (옥텟의 최대 값) 미만이면 위와 같이 옥텟처럼 처리되지만 255보다 큰 경우 변환되어 다음 필드로 롤오버됩니다. (예 :) mod 256.

4 개 이상의 부품을 제공하는 것이 효과가없는 것처럼 보이는 경우가 있습니다 (예 : 핑 google.com의 IP가 0.74.125.226.4또는에서 작동하지 않음 74.125.226.4.0).

점으로 구분 된 쿼드 및 플랫 형식으로 16 진 표기법을 사용할 수도 있지만 0x각 8 진수 앞에 미리 추가하여 형식을 지정해야합니다 .


따라서 (IPv4) IP 주소를 나타내는 많은 방법이 있습니다. 플랫 또는 점으로 구분 된 쿼드 (또는 점으로 된 트리플, 점으로 된 더블 또는 점으로 된 단일) 형식을 사용할 수 있으며 각 형식에 대해 10 진수, 8 진수 및 16 진수를 사용할 수 있습니다. 예를 들어 google.com다음과 같은 방법으로 핑할 수 있습니다 .

  • google.com  (도메인 이름)
  • 74.125.226.4  (점 분리 십진수)
  • 1249763844  (십진수)
  • 0112.0175.0342.0004  (점으로 된 8 진수)
  • 011237361004  (플랫 8 진수)
  • 0x4A.0x7D.0xE2.0x04  (점으로 구분 된 16 진수)
  • 0x4A7DE204  (플랫 육각)
  • 74.0175.0xe2.4  (ಠ_ಠ)

(이진 표기법 지원이 추가되지 않은 것이 좋습니다!)


신청 :

귀하의 경우 핑 192.168.072은 위 표 ( A.B.0.C) 의 세 번째 형식을 사용 하므로 실제로 핑 192.168.0.072합니다. 또한 마지막 부분에 선행 0이 있기 때문에 8 진수로 처리되며 10 진수는 58입니다.

미스터리가 풀렸다.


Windows ping명령은 다양한 형식의 입력을 허용하고 비표준 형식을 표시된 방식으로 해석하지만 반드시 이러한 형식을 모든 곳에서 사용할 수있는 것은 아닙니다. 일부 프로그램에서는 점으로 구분 된 4 개의 부분을 모두 제공해야 할 수도 있고, 다른 프로그램에서는 10 진수 및 8 진수 등의 혼합 및 일치를 허용하지 않을 수도 있습니다.

또한 IPv6 주소는 구문 분석 논리 및 입력 형식 허용 가능성을 더욱 복잡하게합니다.


부록 :

syss는 숫자 중 하나에 유효하지 않은 문자를 사용하면 (예를 들어, 8 진수를 사용 8하거나 16 진수 모드 등을 사용하는 경우) 이를 인식하고 문자열로 해석하기에 충분히 영리하다고 지적했습니다 (-al? 숫자 IP 주소 대신 -ic?) URL9gping

(지수 적으로 폭발적으로 증가하는 데이터 값의 순열 수를 수용하기 위해 "간단한"코드를 작성하려고 시도하는 수많은 동맥류 및 심장 마비를 경험 한 사람으로서 모든 입력 변동을 올바르게 처리하는 것으로 간주됩니다. 경우, 적어도 3 1 +3 2 +3 3 +3 4 = 120 유사.)

지정하는 동안 그래서, 010.020.030.040핑합니다 8.16.24.32예상대로 지나가는 010.020.030.080하기 위해 pingURL을 대신의 IP 주소와 같은 취급됩니다 foo.bar.baz.com수 (그러나 슬프게도하지 않음)이 존재한다. 즉, 최상위 도메인 의 도메인 010에있는 하위 도메인 의 하위 도메인 에 핑을 시도 합니다 . 그러나 유효한 TLD (예 : , 및 해당 친구) 가 아니기 때문에 첫 번째 단계에서 연결이 실패합니다.020030080080.com.net

090.010.010.010유효하지 않은 문자가 다른 옥텟에있는 경우에도 마찬가지입니다 . 마찬가지로 0xf.0xf.0xf.0xf핑 (ping 15.15.15.15)이지만 0xh1.0x1.0xg0.0f실패합니다.

글쎄, 나는 그것이 여러 숫자 기반에 유창하지 않기 때문에 얻는 것이라고 생각합니다.

항상 4-dotted-quad (“40q”?“quaddy-quad”?“cutie-q”?) 주소를 사용하는 것이 더 쉽고 안전합니다.

계속 해서 몇 가지 수의 기초를 배우십시오 . 당신은 파티에서 과시하고 삶을 살 수 있으며, 그들이 말하는 것처럼, 바이너리를 아는 사람들과 모르는 사람들의 10 가지 유형이 있습니다.

IPv6 주소에 대해서도 생각 하지 마십시오 . 나는 그들이 111 물개 중 하나라고 생각합니다!


39
너무 복잡합니까? 실험은 매우 유용 할 수 있으며이 경우 좋은 답변을 얻었습니다. 그러나 이론이나 문서 또는 표준이 없으면 중요한 요소가 누락되어 알 수 없습니다. 또는 특정 버전의 작동 방식을 결정하고 구현의 약 90 %가 잘못 될 수 있습니다. 또는 실험 결과를 설명하지만 의도 된 규칙보다 더 복잡한 규칙을 생각해 낼 수 있습니다. 이 경우 문서의 규칙 (에 대한 inet_aton())이 한 가지 측면에서 더 간단 하다고 생각합니다 . "255 미만 / 초과"에 대한 조건은 없습니다.
LarsH

71
야 봐봐! 컴퓨터 과학의 "과학"부분이 등장합니다! (가설, 실험, 확인)
Izkata

13
@LarsH, 그것은 제 요점입니다.이 ping명령은 (적어도 Windows에서는) 많은 Microsoft 프로그램 (특히 악명 높은) IE와 같습니다. 그것은 너무 용서하려고 노력하고 당신이 그것을 던지고 해석하려고합니다. 예, IP 주소 형식에 대한 공식 문서가 있지만 이것은 ISO 및 RFC에 관한 질문이 아닙니다. 실용적이고, 무언가를했고 이상한 질문에 의지하지 않고 대답 할 수있는 이상한 질문입니다. 기술 사양) —OP가 읽기를 원하는 경우에 연결하는 것도 좋지만
Synetech

6
접두사가 0 인 8 진 구문 분석은 완전히 버려야합니다 chmod. 그게 다야. 8 진수 허용되는 유일한 예외입니다. 기간.
James Dunne

6
RGB HEX를 DEC로 변환하는 데 유용합니다. lol ~C:\>ping 0xffffcc Pinging 0.255.255.204 with 32 bytes of data:
Wilson

147

이에 대한 두 가지 이유가 있습니다.

먼저 '0'접두사는 8 진수를 나타냅니다 . oct (072) = dec (58)이므로 192.168.072 = 192.168.58입니다.

두 번째로, 마지막에서 두 번째로 0은 간결하게 IP 주소에서 제거 될 수 있습니다 . 127.0.1은 127.0.0.1로 해석되며 192.168.58은 192.168.0.58로 해석됩니다.


7
0을 그룹화하지 않습니다. 실제로 각 점을 다음 바이트 경계에 해당하는 구분 기호로 처리합니다. 따라서 IP 주소 2130706433 및 127.0.0.1은 동일한 주소입니다.
서지

2
더 정확하게는 IP 주소의 경우에 쿼드 점 표기법입니다
Guillaume86

4
유명한 리딩 제로가 다시 한 번 쳤다!
Luc M

2
이제 이것이 실제 답변입니다!
l --''''''--------- '' '' '' '' '' '' '

2
그 대답은 정확하지 않으며 오도의 소지가 있습니다. 1.0.2.3 (1.2.3)에서 0을 삭제하면 다른 IP 주소 (1.2.0.3)가 제공됩니다.
sch

101

8 진 표기법에 대한 @ neu242의 중요한 점과 IP 주소를 단축 할 수 있다는 관찰 외에도 다른 중요한 부분은 단축 된 IP 주소가 어떻게 해석되는지 알고 있습니다.

네 개의 숫자 중 일부가 누락되면 파서는 바이트 시퀀스의 끝 (또는 시작)에 0으로 채워진 바이트를 추가 할 것이라고 순진하게 추측 할 수 있습니다. 그러나 이것은 OP가보고 한 동작과 일치하지 않습니다. 192.168.072가 192.168로 구문 분석되었습니다. 0 .58, 192.168.58이 아닙니다. 0 ,도 0 .192.168.58.

분명히 Windows 및 Linux ping (내가 시도한 버전과 내가 시도한 버전)은 inet_aton ()과 동등한 것을 사용하여 IP 주소 인수를 구문 분석합니다. inet_aton ()매뉴얼 페이지 는 다음과 같이 말합니다.

The address supplied in cp can have one of the following forms:

 a.b.c.d   Each of the four numeric parts specifies a byte of the address; the
           bytes are assigned in left-to-right order to produce the binary
           address.

 a.b.c     Parts a and b specify the first two bytes of the binary address.
           Part c is interpreted as a 16-bit value that defines the rightmost
           two bytes of the binary address.  This notation is suitable for
           specifying (outmoded) Class B network addresses.

 a.b       Part a specifies the first byte of the binary address.  Part b is
           interpreted as a 24-bit value that defines the rightmost three bytes
           of the binary address.  This notation is suitable for specifying
           (outmoded) Class C network addresses.

 a         The value a is interpreted as a 32-bit value that is stored directly
            into the binary address without any byte rearrangement.

그래서 당신은 그것을 가지고 있습니다 ... 192.168.072abc 패턴에 맞으므로 072(8 진수로 구문 분석 한 후)는 2 진 주소의 가장 오른쪽 2 바이트를 정의하는 16 비트 값으로 해석됩니다 0.58.

위의 규칙은 네 개의 숫자 중 하나라도 빠지면 필요한 0으로 채워진 바이트가 마지막 숫자 바로 앞에 추가됩니다 ... 바이트 문자열의 끝이나 시작 부분이 아닙니다. (마지막으로 주어진 숫자가 256보다 작 으면이 방법으로 표현합니다.)

최신 버전의 Ping은 이러한 종류의 속기 나 8 진 해석을 허용하지 않을 수 있습니다. 내가 찾은 iputils (ping 포함) 의 2010 소스 코드 는 inet_aton () 대신 inet_pton ()을 사용하여 IP 주소 인수를 구문 분석합니다. inet_pton에 대한 man 페이지 ()는 말한다 :

inet_aton (3) 및 inet_addr (3)과 달리 inet_pton ()은 IPv6 주소를 지원합니다. 반면에, inet_pton ()은 점으로 구분 된 십진수 표기법으로 만 IPv4 주소를 허용하는 반면, inet_aton (3) 및 inet_addr (3)은 좀 더 일반적인 숫자 및 점으로 표기 할 수 있습니다 (16 진수 및 8 진수 형식 및 형식이 아닌 형식). t는 4 바이트를 모두 명시 적으로 작성해야합니다.


12
이것은 IMHO의 최고의 답변입니다.
Josh


24

ip는 그들의 위치에 유의미하게 함께 추가 된 정수로 표현 될 수 있다는 점도 고려해야합니다.

192.168.0.58 is :
  192 * 256^3
+ 168 * 256^2
+   0 * 256^1
+  58 * 256^0

멋진 것은 다음과 같습니다.

192.168.58은 192.168.0.58입니다.

    0 * 256^1 
+  58 * 256^0 
=  58

192.11010106도 192.168.0.58입니다.

  168 * 256^2 
+   0 * 256^1 
+  58 * 256^0 
= 11010106

3232235578도 192.168.0.58이됩니다.

  192 * 256^3 
+ 168 * 256^2 
+   0 * 256^1 
+  58 * 256^0 
= 3232235578

1
"192.168.56은 0 * 256 ^ 1 + 58 * 256 ^ 0 = 58이므로 192.168.0.56입니다. 계속 하시겠습니까? 첫 번째 경우 168에 256 ^ 1을 곱하고 두 번째 경우에는 256 ^ 2를 곱해야합니다. 마찬가지로 192는 256 ^ 2 대 256 ^ 3을 곱합니다. 따라서 192.168.56은 0을 삭제하는 등의 추가 규칙이있는 경우에만 192.168.0.56 일 수 있습니다.
LarsH

@LarsH, 여기서 말하는 것은 1부터 모든 것을 기본으로하는 "정상적인"계산과 달리 왼쪽에서 오른쪽으로 이루어 졌다는 것입니다. 따라서 첫 번째 점은 왼쪽의 모든 것에 256 ^ 3, 두 번째는 256 ^ 2, 세 번째는 256을 곱한 것입니다. 왼쪽에 점이 없으면 256을 곱하지 않고 추가됩니다. ^ n. 따라서 1.2.3. 올바르게 이해하면 (1.2.3.0)은 1.2.3 (1.2.0.3)과 다릅니다.
iX3

@ iX3 :이 경우 "192.168.56은 192.168.0.56이됩니다"는 잘못된 것입니다. 첫 번째 경우에는 56에 256 ^ 1을 곱한 반면 두 번째 경우에는 56 만 곱하기 때문입니다. y 256 ^ 0. OP의 192.168.072는 192.168.0.58 대신 192.168.58.0으로 해석됩니다.
LarsH

약간 오해의 소지가있는 것은 주소에 0이있는 것은 세 번째 숫자가 있다는 사실입니다. 다음 주소를 고려하십시오. 192.168.1.56 3 자리 숫자는 192.168.312입니다. 1 * 256 ^ 1 + 56 * 256 ^ 0은 312
이므로

1
점은 어떤 숫자에 256의 거듭 제곱을 곱해야 하는지를 나타냅니다. 파서는 첫 번째 점을 찾아서 그 앞에있는 숫자에 256 ^ 3을 곱합니다. 두 번째와 세 번째 점에 대해 각각 256 ^ 2와 256 ^ 1 씩 반복합니다. 그런 다음 모든 결과를 합산합니다 (결과가 같더라도 일부 임펄스 대신 누적 합계를 유지할 수 있음). 이러한 점 중 하나라도 누락되면 곱셈을 수행하지 않고 최종 수를 누적 합계에 추가합니다. 1.2.3.파서가 총계에 더할 마지막 숫자를 찾을 수 없기 때문에 오류가 발생하는 이유도 있습니다.
저스틴 ᚅᚔᚈᚄᚒᚔ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.