1. IP 주소란.
네트워크에 연결된 기기는 저마다 주소를 가진다. 편지를 보내려면 받는 사람의 주소가 있어야 하듯, 데이터를 주고받으려면 상대 기기의 주소가 필요하다. 그 주소가 IP 주소다. 우리가 흔히 보는 건 이런 모양이다.
192.168.0.1
점 세 개로 숫자 네 덩어리가 나뉘어 있다. 이 점과 덩어리가 무엇인지 아는 것이 시작이다.
2. 32비트와 옥텟.
지금 널리 쓰이는 IPv4 주소는 32개의 비트, 즉 0과 1이 32개 늘어선 것이다. 사람이 0과 1을 32개나 읽기는 힘드니, 8비트씩 네 묶음으로 끊고 각 묶음을 10진수로 바꿔 점으로 이어 적는다. 이 8비트 묶음 하나를 옥텟(octet)이라 부른다.
8비트로 표현할 수 있는 값은 2의 8제곱, 즉 256가지다. 0부터 세므로 한 옥텟이 가질 수 있는 값은 0부터 255까지다. IP의 각 칸에 256 같은 숫자가 올 수 없는 이유가 여기 있다.
비트 8개가 전부 0 → 00000000 → 0 (가장 작은 값) 비트 8개가 전부 1 → 11111111 → 255 (가장 큰 값)
3. 2진수로 펼쳐 보기.
앞서 본 192.168.0.1을 옥텟별로 2진수로 바꿔 나란히 놓으면 이렇게 된다. 결국 컴퓨터가 보는 건 이 32개의 0과 1이다.
192 = 11000000 168 = 10101000 0 = 00000000 1 = 00000001
이 32비트가 뒤에 나올 모든 이야기의 바탕이다. 서브넷 마스크도, CIDR도 결국 이 0과 1을 어디서 자르느냐의 문제일 뿐이다.
4. 네트워크 부분과 호스트 부분.
IP 주소는 사실 두 부분으로 나뉜다. 아파트 주소를 떠올리면 쉽다. "101동 304호"에서 앞의 동은 어느 건물인지를, 뒤의 호수는 그 건물 안 어느 집인지를 가리킨다.
IP도 똑같다. 앞부분은 네트워크 부분(어느 네트워크인지, 동에 해당), 뒷부분은 호스트 부분(그 네트워크 안 어느 기기인지, 호수에 해당)이다. 같은 동에 사는 사람끼리 복도에서 바로 만나듯, 같은 네트워크에 속한 기기끼리는 직접 통신한다. 동이 다르면 정문(라우터)을 거쳐야 한다.
문제는 32비트 중 어디까지가 동이고 어디부터 호수인지가 주소만 봐서는 안 보인다는 것이다. 그 경계를 알려주는 것이 바로 서브넷 마스크다.
5. 서브넷 마스크.
서브넷 마스크는 IP와 똑같이 생긴 32비트 값인데, 역할이 다르다. 2진수로 폈을 때 1로 채워진 자리는 네트워크 부분, 0으로 채워진 자리는 호스트 부분이라고 알려주는 자(尺)다. 가장 흔한 255.255.255.0을 펼쳐 보자.
255 . 255 . 255 . 0 = 11111111 . 11111111 . 11111111 . 00000000
1이 앞의 24자리, 0이 뒤의 8자리다. 즉 이 마스크는 "앞 세 옥텟은 동, 마지막 한 옥텟은 호수"라고 선언하는 셈이다. 이 마스크를 IP에 겹쳐 보면 어느 부분이 동이고 호수인지 그대로 드러난다.
IP : 192 . 168 . 0 . 1 마스크: 255 . 255 . 255 . 0
그래서 192.168.0.1과 192.168.0.2는 네트워크 부분이 같으니 같은 네트워크, 192.168.1.1은 세 번째 옥텟이 달라 다른 네트워크가 된다.
6. CIDR 표기 (/24).
255.255.255.0처럼 매번 마스크를 다 적기는 번거롭다. 그래서 그냥 1이 몇 개인지만 슬래시 뒤에 붙여 쓴다. 이걸 CIDR 표기라고 한다. 255.255.255.0은 1이 24개이므로 /24다.
/24 = 255.255.255.0 (호스트 254개) /16 = 255.255.0.0 (호스트 65,534개) /8 = 255.0.0.0 (호스트 16,777,214개)
그래서 192.168.1.3/24라고 쓰면 두 정보가 한 줄에 담긴다. 앞의 192.168.1.3은 IP 주소, 뒤의 /24는 "앞 24비트가 네트워크"라는 뜻이니 마스크 255.255.255.0과 같은 말이다. 색으로 나누면 이렇게 읽힌다.
192 . 168 . 1 . 3 / 24 = IP 192.168.1.3 + 마스크 255.255.255.0
슬래시 뒤 숫자가 클수록(/24 > /16) 네트워크 부분이 길고 호스트 부분이 짧아, 한 네트워크에 담을 수 있는 기기 수가 적어진다.
7. 네트워크 주소와 브로드캐스트 주소.
한 네트워크 안의 호스트 자리를 특별하게 쓰는 두 주소가 있다. 호스트 비트가 전부 0인 주소는 네트워크 주소로, 그 네트워크 자체를 가리키는 이름표다. 호스트 비트가 전부 1인 주소는 브로드캐스트 주소로, 그 네트워크의 모든 기기에게 한꺼번에 보낼 때 쓴다.
이 둘은 기기에 배정할 수 없다. 그래서 실제로 기기가 쓸 수 있는 주소는 전체에서 2개를 뺀 만큼이다. /24라면 호스트 자리가 8비트라 256개지만, 앞뒤 2개를 빼고 254개가 남는 것이다.
그럼 네트워크 주소는 무엇을 할까. 특정 기기를 가리키는 게 아니라 네트워크 그 자체를 부르는 이름이다. 앞서 본 192.168.1.0/24처럼 "이 네트워크"를 말할 때, 라우터가 경로를 정리하는 표에 "192.168.1.0 대역은 이쪽으로" 하고 적을 때 쓰인다. 그래서 여기로 데이터를 보낸다기보다, 네트워크를 지칭하는 대표 주소라고 보면 된다.
반면 브로드캐스트 주소로는 실제로 쏠 수 있다. 당연한 얘기지만, 한 옥텟은 255를 넘을 수 없기 때문에 192.168.0.256은 불가능. /24 네트워크의 브로드캐스트는 192.168.0.255이고, 여기로 보내면 그 네트워크의 모든 기기가 함께 받는다.
ping 192.168.0.255 # 같은 네트워크 전체에 핑을 뿌린다 (리눅스는 보통 -b 필요)
다만 요즘 기기나 방화벽은 보안상 브로드캐스트 핑에 응답하지 않도록 막아둔 경우가 많아, 실제로는 답이 안 올 수도 있다.
8. 사설 IP와 공인 IP.
공인 IP는 인터넷 전체에서 겹치지 않는 고유한 주소다. 반면 집이나 회사 내부 에서만 쓰는, 인터넷에 그대로 노출되지 않는 대역이 따로 정해져 있는데 이를 사설 IP라 한다. 집 공유기에 물린 기기들이 192.168로 시작하는 주소를 받는 이유다.
10.0.0.0 ~ 10.255.255.255 (/8) 172.16.0.0 ~ 172.31.255.255 (/12) 192.168.0.0 ~ 192.168.255.255 (/16)
사설 대역은 여러 집에서 똑같이 써도 된다. 우리 집 192.168.0.1과 옆집 192.168.0.1이 충돌하지 않는 건, 각자 공유기 안에서만 통하는 주소이기 때문이다. 바깥 인터넷으로 나갈 때는 공유기가 이 사설 주소를 공인 주소로 바꿔주는데, 그 변환을 NAT라고 부른다.
KT가 공유기 WAN 쪽에 공인 IP(예: 1.2.3.4)를 하나 주고, 공유기는 집 안 기기들에게 192.168.1.7, 192.168.1.8 같은 사설 IP를 나눠준다. 이때 192.168.1.7이 ping 8.8.8.8을 때리면, 공유기가 출발지 주소를 사설 192.168.1.7 → 공인 1.2.3.4로 바꿔서 내보낸다. 192.168.1.8이 때려도 마찬가지로 1.2.3.4로 나간다. 즉 바깥에서 보면 집 안의 모든 기기가 KT가 준 하나의 공인 IP로 보인다.
192.168.1.7 → 공유기(NAT) → 1.2.3.4 → 8.8.8.8 192.168.1.8 → 공유기(NAT) → 1.2.3.4 → 8.8.8.8
그럼 8.8.8.8이 1.2.3.4로 답을 돌려줬을 때, 공유기는 그게 .7이 보낸 것인지 .8이 보낸 것인지 어떻게 알까. 공유기는 내보낼 때 출발지 IP뿐 아니라 포트 번호까지 함께 기록해둔다. 돌아온 응답의 포트를 보고 원래 주인을 찾아 그 사설 IP로 되돌려준다. 이렇게 포트까지 활용하는 방식이라 기기 수십 대가 공인 IP 하나를 공유할 수 있다.