IP 주소
인터넷 프로토콜이 데이터를 어디로 보낼지 가리키는 번호입니다. 보내는 쪽과 받는 쪽에 하나씩 적힙니다. 컴퓨터 한 대에 하나씩 붙는 것이 아니라, 그 컴퓨터가 네트워크에 물린 자리마다 붙습니다.
상세
식당에서 음식은 손님 이름이 아니라 테이블 번호를 보고 나갑니다. 번호는 손님이 아니라 앉은 자리에 붙어 있습니다. 일행이 두 테이블에 나눠 앉으면 번호를 둘 받습니다.
IP(Internet Protocol, 인터넷 프로토콜) 주소는 인터넷 프로토콜이 다루는 식별자입니다. RFC(Request for Comments) 791 은 이름과 주소와 경로를 가릅니다. 이름은 우리가 무엇을 찾는지를 가리킵니다. 주소는 그것이 어디에 있는지를 가리킵니다. 경로는 거기에 어떻게 가는지를 가리킵니다. 인터넷 프로토콜은 주로 주소를 다룹니다. 이름을 주소로 옮기는 일은 호스트 대 호스트나 응용 같은 상위 계층 프로토콜의 몫입니다. 인터넷 모듈은 인터넷 주소를 로컬 네트워크 주소로 옮깁니다. 로컬 네트워크 주소를 경로로 옮기는 일은 로컬 네트워크나 게이트웨이 같은 하위 계층 절차의 몫입니다.
flowchart TD
A["이름"] -->|상위 계층 프로토콜| B["인터넷 주소"]
B -->|인터넷 모듈| C["로컬 네트워크 주소"]
C -->|하위 계층 절차| D["경로"]
여기서 인터넷 주소와 로컬 네트워크 주소는 서로 다른 값입니다. 로컬 네트워크 주소는 그 물리 네트워크 안에서만 통하는 번호입니다. 이더넷이라면 MAC(Media Access Control, 매체 접근 제어) 주소가 그 자리입니다. IP 주소는 그 위에 얹혀 여러 물리 네트워크를 가로지르는 번호입니다.
주소의 길이는 판이 정합니다. RFC 791 의 주소는 네 옥텟, 곧 32비트 고정 길이입니다. 주소는 네트워크 번호로 시작하고 그 뒤에 로컬 주소가 따라옵니다. 이 뒷부분을 명세는 "rest" 필드라고 부릅니다. RFC 4291 의 주소는 128비트입니다.
주소가 붙는 자리는 인터페이스입니다. RFC 4291 은 모든 유형의 IPv6(Internet Protocol version 6, 인터넷 프로토콜 6판) 주소가 노드가 아니라 인터페이스에 배분된다고 적습니다. 인터페이스 하나는 어느 유형이든 여러 개의 주소를 가질 수 있습니다. 각 인터페이스가 노드 하나에 속하므로, 그 노드의 인터페이스가 가진 유니캐스트 주소 아무거나 노드의 식별자로 쓸 수 있습니다. RFC 791 도 물리 호스트 하나가 여러 개의 서로 다른 인터넷 주소를 쓰는 정도까지 여러 호스트인 것처럼 굴 수 있어야 한다고 적습니다. 물리 인터페이스를 여럿 가진 호스트도 있습니다. 이것을 멀티호밍이라고 부릅니다. RFC 1122 는 IP 주소를 여럿 가진 호스트를 멀티홈드 호스트라 부르고, 그 여러 주소를 논리 인터페이스로 생각할 수 있다고 적습니다. 논리 인터페이스는 물리 인터페이스 하나에 여럿 딸릴 수도 있고, 그 물리 인터페이스들은 같은 네트워크에 붙어 있을 수도 다른 네트워크에 붙어 있을 수도 있습니다.
배경
컴퓨터를 잇는 통신망은 한 종류가 아닙니다. 망마다 주소를 적는 방식이 따로 있고, 그 주소는 그 망 안에서만 통합니다. 그래서 다른 망에 있는 상대에게 데이터를 보내려면 중간에서 주소를 매번 바꿔 줘야 합니다.
RFC 791 은 인터넷 프로토콜이 서로 연결된 패킷 교환 통신망 묶음에서 쓰이도록 설계됐다고 적습니다. 그런 묶음을 카테넷이라고 불렀습니다. 인터넷 프로토콜이 하는 일은 데이터그램이라 부르는 데이터 덩이를 출발지에서 목적지로 나르는 것입니다. 그리고 그 출발지와 목적지는 고정 길이 주소로 식별되는 호스트입니다. 망을 몇 개나 거치든 상관없이 통하는 번호 한 벌이 필요했다는 뜻입니다.
그 번호가 인터넷 프로토콜의 주소, 곧 IP 주소입니다. 망마다 다른 로컬 네트워크 주소는 그대로 두고 그 위에 한 겹을 더 얹은 셈입니다. 인터넷 모듈이 두 겹 사이를 이어 줍니다.
갈래
IP 주소는 세 축으로 갈립니다. 주소 길이와 표기를 정하는 판이 무엇인지, 한 주소가 몇을 가리키는지, 그 주소가 어디까지 통하는지입니다.
IPv4
IPv4(Internet Protocol version 4, 인터넷 프로토콜 4판)의 주소입니다. RFC 791 이 정한 32비트
길이입니다. 옥텟마다 십진수로 적고 점으로 이어 192.0.2.1 같은 꼴로 씁니다. 주소를 네트워크에
배분할 때 융통성을 주려고, 명세는 주소 필드의 해석을 상위 비트로 갈라 놓았습니다. 네트워크가 적고 호스트가 많은 쪽부터 네트워크가 많고 호스트가 적은 쪽까지 세 형식이
있고, 확장 주소 모드로 빠지는 탈출 코드가 하나 더 있습니다.
| 상위 비트 | 네트워크 | 로컬 주소 | 클래스 |
|---|---|---|---|
0 |
7비트 | 24비트 | a |
10 |
14비트 | 16비트 | b |
110 |
21비트 | 8비트 | c |
111 |
확장 주소 모드로 빠지는 탈출 코드 | — | — |
네트워크 필드가 0이면 "이 네트워크"를 뜻하고, 일부 ICMP(Internet Control Message Protocol, 인터넷 제어 메시지 프로토콜) 메시지에서만 쓰입니다. 확장 주소 모드는 정의되지 않았습니다. 둘 다 앞날을 위해 예약된 것입니다. 로컬 네트워크가 배분하는 로컬 주소는 물리 호스트 하나가 서로 다른 여러 인터넷 호스트 노릇을 할 수 있게 해야 합니다. 주소를 프리픽스 길이로 끊어 적는 표기는 CIDR(Classless Inter-Domain Routing, 클래스 없는 도메인 간 라우팅) 표기라고 부릅니다.
IPv6
IPv6 의 주소입니다. RFC 4291 이 정한 128비트
길이입니다. 인터페이스 하나와 인터페이스 집합을 가리키는 식별자입니다. 표기는 x:x:x:x:x:x:x:x
꼴이 기본입니다. x 는 주소를 16비트씩 여덟 덩이로 자른 것을 십육진 숫자 한 자리에서 네 자리로
적은 것입니다. 각 필드의 앞자리 0 은 적지 않아도 되지만 필드마다
숫자가 최소 하나는 있어야 합니다(:: 로 줄여 적는 경우는 예외입니다).
주소 안에 0 비트가 길게 이어지는 일이 흔해서 0 을 압축하는 문법이 따로 있습니다. :: 는 16비트
0 묶음 하나 이상을 뜻합니다. :: 는 한 주소에 한 번만 나올 수 있고, 앞이나 뒤에 이어지는 0 을
줄이는 데에도 씁니다. 2001:DB8:0:0:8:800:200C:417A 는 2001:DB8::8:800:200C:417A 로,
0:0:0:0:0:0:0:1 은 ::1 로 적습니다. 프리픽스는 ipv6-address/prefix-length 로 적습니다.
RFC 4291 은 이 프리픽스 표기가 IPv4 주소 프리픽스를 CIDR 표기로 적는 방식과 비슷하다고 적습니다.
유니캐스트 · 애니캐스트 · 멀티캐스트
한 주소가 몇을 가리키느냐로 갈리는 축입니다. 유니캐스트 주소는 인터페이스 하나의 식별자입니다. 그 주소로 보낸 패킷은 그 주소가 가리키는 인터페이스로 전달됩니다. 애니캐스트 주소는 인터페이스 집합의 식별자입니다. 대개 서로 다른 노드에 속한 인터페이스들입니다. 그 주소로 보낸 패킷은 그중 하나로 전달됩니다. 라우팅 프로토콜의 거리 척도로 "가장 가까운" 하나입니다. 멀티캐스트 주소도 인터페이스 집합의 식별자입니다. 다만 그 주소로 보낸 패킷은 그 집합의 인터페이스 전부에 전달됩니다.
flowchart TD
U["유니캐스트 주소"] --> A["인터페이스 하나"]
N["애니캐스트 주소"] --> B["집합 중 가장 가까운 하나"]
M["멀티캐스트 주소"] --> C["집합의 인터페이스 전부"]
애니캐스트 주소는 어느 범위든 유니캐스트 주소 공간에서 가져옵니다. 문법으로는 유니캐스트 주소와 구별되지 않습니다. 나머지 유형은 주소의 상위 비트로 식별합니다.
| 주소 유형 | 이진 프리픽스 | IPv6 표기 |
|---|---|---|
| Unspecified | 00...0 (128비트) |
::/128 |
| Loopback | 00...1 (128비트) |
::1/128 |
| Multicast | 11111111 |
FF00::/8 |
| Link-Local unicast | 1111111010 |
FE80::/10 |
| Global Unicast | 그 밖의 전부 | — |
IPv6 에는 브로드캐스트 주소가 없습니다. 그 기능은 멀티캐스트 주소가 대신합니다. IPv4 쪽에는 리미티드 브로드캐스트가 있습니다. RFC 1122 는 이 주소를 출발지 주소로 써서는 안 된다고 못 박습니다. 이 주소를 목적지로 삼은 데이터그램은 연결된 물리 네트워크의 모든 호스트가 받지만 그 네트워크 밖으로는 전달되지 않습니다.
쓰임이 예약된 대역
그 주소가 어디까지 통하느냐로 갈리는 축입니다. 인터넷 전체에서 유일하지 않아도 되는 주소가 있습니다. IANA(Internet Assigned Numbers Authority, 인터넷 할당 번호 관리 기관)는 사설 인터넷을 위해 IP 주소 공간에서 세 덩이를 예약해 두었습니다.
| 대역 | 범위 |
|---|---|
10/8 |
10.0.0.0 — 10.255.255.255 |
172.16/12 |
172.16.0.0 — 172.31.255.255 |
192.168/16 |
192.168.0.0 — 192.168.255.255 |
이 공간의 주소를 쓰기로 한 조직은 IANA 나 인터넷 레지스트리와 조율하지 않고 그렇게 할 수 있습니다. 그래서 같은 공간을 여러 조직이 함께 씁니다. 이 안의 주소는 그 조직 안에서만, 또는 이 공간을 두고 서로 협력하기로 한 조직들 사이에서만 유일합니다. 사설 주소에는 전역적인 뜻이 없으므로 사설 네트워크의 라우팅 정보는 조직 간 링크로 전파되어서는 안 됩니다. 사설 출발지나 목적지 주소를 가진 패킷도 그런 링크를 건너 전달되지 않아야 합니다. 사설 주소 공간을 쓰지 않는 네트워크의 라우터, 특히 인터넷 서비스 제공자의 라우터는 사설 네트워크에 대한 라우팅 정보를 걸러 내도록 설정되어 있을 것으로 기대됩니다.
더 좁게 도는 대역도 있습니다. 루프백은 호스트 안에서만 도는 주소입니다. RFC 1122 는 127 로
시작하는 주소를 내부 호스트 루프백 주소로 정하고, 이 꼴의 주소가 호스트 밖에 나타나서는 안 된다고
못 박습니다. IANA 의 IPv4 특수목적 주소 레지스트리도 127.0.0.0/8 을 루프백으로 등재하고 그
근거로 RFC 1122 의 해당 절을 답니다. IPv6 쪽 루프백은 ::1/128 입니다. 링크로컬은 같은 링크
안에서만 통하는 주소입니다. RFC 3927 은 호스트가 인터페이스를 169.254/16 프리픽스 안의 IPv4
주소로 자동 설정하는 방법을 적은 문서입니다. 이 주소는 그 링크에 직접 연결되지 않은 장치와
통신하기에는 적합하지 않습니다. 애드혹 네트워크나 고립된 네트워크처럼 안정적이고 라우팅 가능한
주소를 얻을 수 없는 곳에서만 씁니다. IPv6 쪽 링크로컬 유니캐스트는 FE80::/10 입니다. 모든
인터페이스는 링크로컬 유니캐스트 주소를 최소 하나 가져야 합니다.
예시
문서에 적는 주소
문서와 예제에 쓰라고 따로 떼어 둔 대역이 있습니다. RFC 5737 은 IPv4 쪽으로
192.0.2.0/24(TEST-NET-1) · 198.51.100.0/24(TEST-NET-2) · 203.0.113.0/24(TEST-NET-3) 세
덩이를 내놓습니다. 이 세 덩이 안의 주소는 공개 인터넷에 나타나지 않아야 하고, IANA 나 인터넷
레지스트리와 조율 없이 씁니다.
IPv6 쪽 문서용 프리픽스는 2001:DB8::/32 입니다. RFC 3849 는 IPv6 네트워크 운영자가 이
프리픽스를 라우팅 불가 주소 공간 목록에 넣고, 패킷 필터를 두었다면 그 필터에도 넣어야 한다고
적습니다. RFC 4291 이 표기 규칙을 설명하며 든 2001:DB8::8:800:200C:417A 도 이 대역의
주소입니다.
리눅스 소켓 주소 구조체
리눅스의 ip(7) 은 IPv4 주소가 소켓 API(Application Programming Interface, 응용 프로그램
인터페이스) 안에서 어떤 모양으로 담기는지를 적어 둡니다.
struct sockaddr_in {
sa_family_t sin_family; /* address family: AF_INET */
in_port_t sin_port; /* port in network byte order */
struct in_addr sin_addr; /* internet address */
};
/* Internet address */
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};
sin_addr 이 IP 호스트 주소입니다. struct in_addr 의 s_addr 멤버가 호스트 인터페이스
주소를 네트워크 바이트 순서로 담습니다. 32비트 정수 하나가 주소 하나입니다.
쿠버네티스의 주소 배분
쿠버네티스 클러스터는 파드와 서비스와 노드에 겹치지 않는 IP 주소를 배분해야 합니다. 쓸 수 있는 주소 범위는 컴포넌트마다 설정해 둡니다. 네트워크 플러그인이 파드에 주소를 배분하도록 설정됩니다. 서비스는 kube-apiserver 가 배분합니다. 노드는 kubelet 이나 cloud-controller-manager 가 배분하도록 설정됩니다. 파드 하나가 주소 하나를 받는 자리입니다.
관련 항목
이 주소를 나누고 묶는 표기와 단위
서브넷 · 서브넷 마스크 · CIDR · 프리픽스 길이 · 네트워크 주소 · 브로드캐스트 주소 · 주소 공간
이 주소를 배분하고 바꾸는 절차
DHCP(Dynamic Host Configuration Protocol, 동적 호스트 구성 프로토콜) · NAT(Network Address Translation, 네트워크 주소 변환) · ARP(Address Resolution Protocol, 주소 결정 프로토콜) · 라우팅 · 라우팅 테이블 · 기본 게이트웨이 · 이름 해석 · DNS(Domain Name System, 도메인 네임 시스템)
이 주소의 버전과 그 공존 방식
이것의 하위 종류
유니캐스트 · 애니캐스트 · 멀티캐스트 · 루프백 · 링크로컬
이것이 속하는 상위 프로토콜과 이웃 계층
이것과 짝지어 접속점을 이루는 요소
이 주소가 배분되는 대상
이 주소를 나눠 주는 플랫폼과 구성 요소
쿠버네티스 · 클러스터 · 파드 · kube-apiserver · kubelet · cloud-controller-manager
이 주소를 달고 오가는 전송 단위
이 주소를 나눠 주는 기관과 이웃 번호
IANA · 지역 인터넷 레지스트리 · 자율 시스템 번호
이 주소에서 자주 나는 오류·장애
IPv4 주소 고갈 · 주소 충돌 · 사설 대역 겹침 · 멀티홈드 호스트 · IP 스푸핑
다른 이름: IP address · IP 어드레스 · 아이피 주소