"X"가 임의의 정수인 경우 "ping X"가 작동하는 이유는 무엇입니까?

"X"가 임의의 정수인 경우 "ping X"가 작동하는 이유는 무엇입니까?

그래서 저는 Windows 10 핑 유틸리티의 이상한 점을 발견했습니다. IP 주소 대신 정수를 ping하면 해당 숫자가 IPv4 주소로 "변환"됩니다. 첫 번째 옥텟은 256^3 자리, 두 번째 옥텟은 256^2, 세 번째 옥텟은 256^1, 마지막 옥텟은 "1" 자리 또는 256^0이 되도록 변환됩니다.

예를 들어 "ping 200"은 ping 0.0.0.200이지만 "ping 400"은 ping 0.0.1.144입니다. 여기서 세 번째 옥텟의 "1"은 256(256 + 144 = 400)을 나타냅니다.

빠른 Google 검색(비록 좋은 검색어가 생각나지 않았지만)은 아무 것도 가져오지 못했습니다.

내 유일한 두 가지 이론은 다음과 같습니다.

  1. IP 스키마의 이전 반복(예: 사용되지 않은 v1, v2 또는 v3)에서는 단일 정수만 사용하려는 계획이 있었을 수도 있습니다. Microsoft는 이전 버전과의 호환성에 집착하여 ping이 처음 코딩되었을 때 이러한 방식으로 처리하기 위해 ping 유틸리티에 변환 알고리즘을 작성했습니다.
  2. ping 유틸리티의 코딩 방식으로 인해 해당 데이터로 작업을 수행하기 전에 일반적으로 유효한 IPv4 주소를 가져와 단일 정수로 변환하는 경우가 있을 수 있습니다. 따라서 코드를 확인하여 사용자가 단일 정수를 입력한 것을 확인하면 해당 초기 번역 단계를 건너뜁니다.

어떤 아이디어가 있나요? 그것은 확실히 내 동료들의 흥미를 끌었지만 그들도 나만큼 아무것도 몰랐습니다.

편집: 방금 내 Arch Linux 시스템에서 테스트한 결과 해당 동작이 거기에도 존재한다는 것을 확인할 수 있으므로 내 첫 번째 이론이 부정될 가능성이 높습니다.

답변1

답변은 다음 문서에 기록되어 있습니다.위키피디아:

클래스풀 네트워킹이 실행될 때 다른 주소 표현이 일반적으로 사용되었습니다. 예를 들어, 루프백 주소 127.0.0.1은 네트워크 마스크에 8비트, 호스트 번호에 24비트가 있는 클래스 A 네트워크에 속한다는 점을 고려하여 일반적으로 127.1로 기록됩니다. 점 표기법으로 주소에 4개 미만의 숫자가 지정된 경우 마지막 값은 주소를 4옥텟으로 채우는 데 필요한 바이트 수의 정수로 처리됩니다. 따라서 주소 127.65530은 127.0.255.250과 동일합니다.

답변2

그것은 별난 일이 아닙니다. 특징입니다.

IPv4 주소의 점 표기법은 단지 IPv4 주소인(IP 패킷의 32비트 대상 필드에 들어가는) 4바이트(즉, 32비트) 정수를 나타내는 방법일 뿐이라는 점을 기억하십시오. 다양한 유틸리티는 이 정수에 대해 다양한 형식을 허용합니다.

과거에 일부 브라우저에서는 이와 같은 십진수를 주소 표시줄의 주소로 허용했다는 것을 알고 있습니다. (현재 사용 중인 두 브라우저인 Firefox와 Chrome이 더 이상 이 기능을 수행하지 않는다는 사실에 놀랐습니다.)

답변3

".0"은 조건부로 생략 가능

종종 "ping 127.0.0.1" 명령을 사용하여 시스템에서 루프 테스트를 수행하여 시스템의 TCP/IP 프로토콜 제품군이 올바르게 설치되었는지 확인합니다. 그런데 찾았나요? "ping 127.1" 명령을 사용해도 동일한 테스트 결과를 얻을 수 있습니다. 실제로 "ping 127.1"과 "ping 127.0.0.1" 두 명령은 동일하며, 둘 다 루프 테스트를 수행하고 있습니다.

왜 그럴까요? Ping 명령 응용 프로그램에서 IP 주소를 사용하는 기술입니다. IP 주소가 32개의 이진수로 구성되어 있다는 것은 누구나 알고 있습니다. 누구나 쉽게 기억할 수 있도록 2진수 8자리를 10진수로 변환하였습니다. 따라서 네 부분의 십진수(예: 127.0.0.1 )로 구성된 기억하기 쉬운 IP 주소입니다. Windows 운영체제에는 ".0"을 자동으로 채우는 기능이 있으므로 "127.0.0.1"을 "127.1"로 변경할 수 있습니다.

다만, 이 ".0"의 생략은 조건적으로 제한되며 임의로 생략할 수는 없다. Ping 명령을 적용할 때 "ping 127.0.0.1" 명령을 "ping 127.1"로 다시 쓰는 것과 같이 IP 주소의 마지막 소수 앞에 나타나는 하나 이상의 ".0"만 생략할 수 있습니다.

하나 이상의 ".0"이 소수의 마지막 부분 옆이 아니라 다른 위치에 있는 경우 이 ".0"은 생략할 수 없습니다. 예를 들어 "ping 202.0.96.1"은 "ping"으로 쓸 수 없습니다. 202.96.1" ". "ping 202.96.1"에서 반환된 결과가 "202.0.96.1"의 응답 메시지가 아닌 "202.96.0.1"의 응답 메시지이기 때문입니다.

IP 주소 대신 숫자 문자열

Ping 명령에서는 IP 주소 대신 숫자 문자열을 사용할 수도 있습니다. "ping 3658906394" 명령을 실행하면 "218.22.123.26" IP 주소의 반환 정보를 확인할 수 있습니다.

왜 그럴까요? 실제로 "3658906394"는 IP 주소 "218.22.123.26"을 나타내는 또 다른 표현입니다. 물론, 같은 방법으로 다른 IP 주소에도 ping을 수행할 수 있습니다.

문자열은 어떻게 변환되나요? 실제로는 복잡하지 않습니다. IP 주소 "218.22.123.26"을 예로 들면, IP 주소를 숫자 문자열로 변환하는 방법은 다음과 같습니다. 먼저 "218.22.123.26"을 16진수 "DA.16.7B.1A"로 변환한 후 제거합니다. . 소수점 이하에서는 "DA167B1A"가 되고, 마지막으로 16진수는 10진수 "3658906394"로 변환되고, "218.22.123.26"은 "3658906394"가 됩니다. 다른 IP 주소를 숫자 문자열로 변환하는 데에도 동일한 방법이 사용됩니다.

팁: 일부 LAN 환경에서는 "Ping+번호 문자열" 명령 사용이 실패하고 "알 수 없는 호스트 번호 문자열"이라는 프롬프트 메시지가 나타날 수 있습니다. 이는 숫자 문자열이 IP 주소 대신 호스트 이름으로 확인되기 때문입니다.

답변4

IPv4 주소는 부호 없는 32비트 정수입니다. 사람이 더 쉽게 읽을 수 있도록 하기 위한 잘못된 시도로, 전통적으로 UI에 "점으로 구분된 십진수" 표기법으로 표시됩니다. 여기서 가장 중요한 것부터 시작하는 각 옥텟(8비트 바이트)은 십진수로 구분되어 표시됩니다. 다음 옥텟부터 점 단위로.

일부 UI에서는 UInt32로 해석할 수 있는 모든 것을 입력하고 결과 UInt32를 의도한 IPv4 주소로 사용할 수 있다는 것은 별로 놀라운 일이 아닙니다.

관련 정보