IP 주소·정수 변환 쉽게 이해하기 — 개념과 원리
이 변환기는 같은 IPv4 주소를 점 표기(192.168.1.1), 부호 없는 32비트 정수, 16진수, 2진수 네 가지 형태로 보여 줍니다. 점 표기 주소와 정수 중 어느 쪽을 입력해도 됩니다. 데이터베이스에 IP를 작게 저장할 때, 코드에서 주소 범위를 비교할 때, 16진수로 찍힌 패킷 캡처나 로그를 읽을 때, 범위를 정수로 표시한 위치 정보 표를 다룰 때 자주 사용합니다.
계산 방법
각 옥텟이 0~255인 주소 a.b.c.d에 대해 다음과 같이 계산합니다.
- 정수 = a × 2^24 + b × 2^16 + c × 2^8 + d = a × 16,777,216 + b × 65,536 + c × 256 + d
- 16진수: 옥텟마다 16진수 두 자리로 바꿔 0x 뒤에 8자리로 씁니다.
- 2진수: 옥텟마다 8비트로 바꿔 네 묶음으로 보여 줍니다.
- 역변환: a = ⌊N ÷ 2^24⌋, b = ⌊N ÷ 2^16⌋ mod 256, c = ⌊N ÷ 2^8⌋ mod 256, d = N mod 256
유효한 정수 범위는 0(0.0.0.0)부터 4,294,967,295(255.255.255.255)까지입니다.
원리
IPv4 주소의 실체는 32비트 숫자 하나이고, 점 표기는 그 4바이트를 사람이 읽기 쉽게 256진법으로 적은 것입니다. 각 옥텟은 256진수의 한 자리이므로 자릿값은 256의 거듭제곱이 됩니다. 십진수의 백의 자리, 십의 자리와 같은 이치입니다. 정수로 바꿔도 순서가 그대로 유지되므로 "시작 ≤ N ≤ 끝"이면 그 범위 안의 주소라고 판단할 수 있습니다.
예제 풀이
- 입력: 192.168.1.1
- 192 × 16,777,216 = 3,221,225,472
- 168 × 65,536 = 11,010,048
- 1 × 256 = 256, 여기에 마지막 옥텟 1을 더합니다.
- 합계: 3,232,235,777
- 16진수: 192 = C0, 168 = A8, 1 = 01, 1 = 01이므로 0xC0A80101
- 2진수: 11000000.10101000.00000001.00000001
결과 해석
정수가 클수록 뒤쪽 주소입니다. 두 정수의 차는 그 사이 주소 개수이며, CIDR 블록은 시작값이 블록 크기의 배수인 연속 구간입니다. 16진수는 두 자리가 한 옥텟과 정확히 대응해 읽기 편합니다.
흔한 실수
- 부호 있는 32비트 정수형에 저장해 127.255.255.255보다 큰 주소가 음수로 보이는 경우
- 010.0.0.1처럼 앞에 0이 붙은 값을 일부 오래된 도구가 8진수로 해석하는 경우
- 메모리를 직접 읽을 때 네트워크 바이트 순서(빅 엔디언)와 CPU의 리틀 엔디언을 혼동하는 경우
자주 묻는 질문
192.168.1.1을 숫자로 바꾸면 얼마인가요?
3,232,235,777이며 16진수로는 0xC0A80101입니다.
IP 주소를 왜 정수로 저장하나요?
최대 15자 문자열 대신 4바이트로 저장할 수 있고, 범위 검색이 빠르고 간단해집니다.
정수 형태로 브라우저에 입력해도 되나요?
받아들이는 브라우저와 도구가 많지만 지원이 일정하지 않으므로 설정에는 점 표기를 쓰는 것이 안전합니다.
출처: IETF RFC 791, Internet Protocol