태그 보관물: ip-address

ip-address

핑 192.168.072 (2 개의 점만)가 192.168.0.58의 응답을 반환하는 이유는 무엇입니까? 응답을받습니다 192.168.0.58. 왜 이런거야? Windows 도메인의 Windows PC를 사용하고

실수로 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(내 원래 실수에) 중요하다.


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



답변

모두가 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 물개 중 하나라고 생각합니다!


답변

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

먼저 ‘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로 해석됩니다.


답변

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 바이트를 모두 명시 적으로 작성해야합니다.


답변

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


답변