2010년 12월 15일 수요일

IP 주소 정수값으로 표현하기! 1208931688 의 뜻은?

다음 주소를 클릭 하거나 또는 브라우저에서 입력하여 접속해 보자.


구글 검색 사이트로 이동이 된다. 과연 이 숫자는 무엇이지? 이 숫자는 구글 IP 주소를
정수 값으로 표현한 것이다. 즉, 구글뿐만 아니라 IP 주소는 모두 이와 같은 숫자로 표현될 수 있다.
이해가 잘 안 간다면 차례대로 한번 살펴보도록 하자!

google.com 의 도메인 쿼리를 통해 IP 주소를 얻는다.

> google.com
Server: 168.126.63.1
Address: 168.126.63.1#53

Non-authoritative answer:
Name: google.com
Address: 72.14.213.104
Name: google.com
Address: 72.14.213.105
Name: google.com
Address: 72.14.213.106
Name: google.com
Address: 72.14.213.147
Name: google.com
Address: 72.14.213.99
Name: google.com
Address: 72.14.213.103
>

여러 IP 중에 제일 상단에 있는 72.14.213.104 를 대상으로 해 보자. 이 주소를 각각 표현하면
아래와 같이 된다.

IP 주소 : 72.14.213.104
바이너리 : 01001000 . 00001110 . 11010101 . 01101000
정수 : 1208931688

그럼 IP 주소를 정수 값으로 변환하려면 어떻게 해야 하는가? 일단 IP 주소를 4개 로 나눈다.
1번째 주소 72
2번째 주소 14
3번째 주소 213
4번째 주소 104

그리고 다음과 같이 계산될 수 있다.

(1번째 주소 * 256^3) + (2번째 주소 * 256^2) + (3번째 주소 * 256) + (4번째 주소)
= (72 * 16777216) + (14 * 65536) + (213 * 256) + (104)

그리하여 최종 값은
= 1208931688 이 된다.

그럼 어떤 주소라도 쉽게 변환할 수 있을 것이다. 만약 반대로 1208931688 이 숫자값만 알고 있을 경우
IP 주소를 어떻게 쉽게 알 수 있을까? 다음과 같이 펄을 이용하면 금방 알 수 있다.

$ echo 1208931688 | perl -ne 'print $_>>24 ,".",$_<<8>>24,".",$_<<16>>24,".",$_<<24>>24,"\n"'
72.14.213.104

또는 아래와 같은 방법으로 말이다.

$ more test.pl
#!/usr/bin/perl
# PacketInside.com
$ip_number = "1208931688";
$ip_string = sprintf("%vd", pack("N", $ip_number));

print "\n IP Address is $ip_string\n";

$ ./test.pl

 IP Address is 72.14.213.104
$

방법은 여러가지가 많으니 참고하길 바란다. 한가지 주의할 것은, 무조건 IP 를 숫자로 변환하여
웹 사이트를 접속한다고 했을때 다 되는 것은 아니다. 이유는 왜 그럴까?
최근 많은 웹 사이트들은 이름 기반의 가상호스트를 이용하고 있다. 이 뜻은 HTTP 헤더에
Host 필드를 제공하여야 제대로 인식이 되는데 단지 IP 주소만을 이용하여 접속하면 접속하고자
했던 페이지에 접속이 안된다.

예를 들어, packetinside.com 은 211.245.21.34 이지만 IP 로 접속하면 페이지가 안 뜨지만,
도메인명으로 접속하면 페이지가 나타난다.

이 부분이 더 궁금한 분은 가상호스트를 검색해 보면 이에 대한 대답을 더 얻을 수 있다. 자, 어찌되었든
이제 신기하게 보였던 숫자로만의 접속이 어떻게 된 건지 이해가 될 것이다. IP 주소를 표현하는
또 다른 방법!

[참고]

IP 주소 구성을 좀더 쉽게 표현하면 아래와 같다. 172 정수를 2진수로 변환하면 10101100 이 되고 이 8 비트가
모여 1 바이트가 된다. 즉 IP 주소는 4 바이트로 구성되어 있고, 4 * 8 = 32 bit 가 되는 것이다. IPv6 는 128 bit 주소 체계이다.

이미지 출처 : 위키피디아

댓글 1개:

  1. 추가로 1208931688 를 HEX 값으로 변환하여, 다음과 같이도 가능합니다.

    http://0x480ed568

    답글삭제