IP
고친 사람 github-actions[bot]
IP 는 인터넷에서 데이터를 받는 쪽까지 보내 주는 약속입니다. 보내는 쪽이 적어 둔 주소만 보고, 중간 장비들이 한 구간씩 넘겨 목적지 쪽으로 밀어 줍니다. 무사히 닿았는지, 보낸 순서대로 닿았는지는 챙기지 않습니다. 「IP 주소」를 줄여 IP 라 부르기도 하고 계약 문서에서는 지식재산권을 뜻하지만, 이 편이 다루는 것은 데이터를 보내는 약속입니다.
쉽고 빠른 이해
IP 는 데이터 덩이 앞에 받는 곳 주소를 붙여 인터넷으로 내보내는 약속입니다. 봉투에 주소를 적어 우체통에 넣으면 중간 우체국들이 알아서 넘겨 주는 것과 닮았습니다.
세상의 네트워크는 회사 것, 집 것, 통신사 것이 저마다 다릅니다. IP 는 그 위에 공통 주소와 공통 덩이 모양을 하나씩 얹습니다. 그래서 어느 네트워크를 거치든 같은 방법으로 목적지를 찾아갑니다.
어떻게 도나:
- 보내는 쪽이 데이터 앞에 출발지와 목적지 주소를 붙입니다
- 중간 장비가 목적지 주소만 보고 다음 장비를 골라 넘깁니다
- 목적지 장비가 그 주소를 자기 것으로 알아보고 안에 든 데이터를 꺼냅니다
대가는 확인이 없다는 것입니다. 덩이가 버려지거나 순서가 뒤바뀌어도 IP 는 알려 주지 않습니다. 빠짐없이 순서대로 받아야 하는 프로그램은 그 일을 위 계층 프로토콜에 맡깁니다.
상세
IP 는 Internet Protocol 의 줄임말입니다. 이 절은 IP 가 나르는 덩이의 생김새와, 중간 장비가 그 덩이를 넘기는 판단을 봅니다.
IP 가 나르는 덩이 하나를 데이터그램이라고 부릅니다. 데이터그램은 받는 곳 주소를 스스로 달고 혼자 떠나는 데이터 한 덩이입니다. 앞 덩이가 어떻게 됐는지 몰라도 이 덩이 하나만 열어 보면 어디로 넘길지 정할 수 있습니다. 실무에서는 패킷이라는 넓은 말로도 자주 부릅니다.
네트워크가 하는 일은 여러 계층으로 나눠 봅니다. IP 는 여러 네트워크를 건너 목적지까지 보내는 인터넷 계층에 섭니다.
그 위는 전송 계층입니다. 양 끝 프로그램 사이를 챙깁니다. 그 아래는 링크 계층입니다. 장비와 장비 사이 한 구간을 실제로 건넙니다.
block-beta
columns 1
T["전송 계층"]
I["인터넷 계층 · IP"]
L["링크 계층"]
덩이 앞에 붙는 안내문
데이터그램은 안내문과 알맹이로 이루어집니다. 앞에 붙는 안내문을 헤더라고 합니다. 중간 장비는 알맹이를 들여다보지 않고 이 헤더만 읽습니다.
헤더를 읽으려면 낱말 둘을 먼저 풀어야 합니다. IP 주소는 네트워크에 붙은 기계마다 하나씩 주어지는 번호입니다. IPv4 에서는 192.168.0.1 처럼 점으로 나눈 네 칸에 적습니다. 한 칸이 8비트입니다.
나머지 하나는 홉입니다. 장비와 장비 사이 한 구간이 홉 하나입니다.
헤더가 적는 것은 크게 다섯입니다.
| 헤더가 적는 것 | 무엇에 쓰나 |
|---|---|
| 목적지 IP 주소 | 중간 장비가 다음에 어디로 넘길지 정합니다 |
| 출발지 IP 주소 | 받는 쪽이 답을 돌려보낼 곳을 압니다 |
| 남은 홉 수 | 길을 뱅뱅 도는 덩이를 어디선가 버리게 합니다 |
| 위 계층 표시 | 도착한 쪽이 알맹이를 위 계층의 어느 프로토콜에 넘길지 압니다 |
| 조각 정보 | 잘라 보낸 덩이를 받는 쪽이 도로 붙입니다 |
남은 홉 수는 앞으로 몇 홉을 더 건널 수 있는지를 적은 값입니다. 이름은 TTL(Time To Live, 살아 있을 시간)입니다. 장비를 하나 지날 때마다 하나씩 줍니다. 0 이 되면 그 덩이는 버려집니다.
길이 잘못 이어져 덩이가 같은 곳을 맴돌더라도 언젠가는 사라지게 하는 장치입니다.
홉 단위 전달
보내는 쪽은 목적지까지 가는 길 전체를 모릅니다. 아는 것은 바로 옆 장비뿐이고, 그 장비도 다시 자기 옆 장비만 압니다. 이렇게 한 홉씩 건넵니다. 홉과 홉 사이에서 덩이를 받아 넘기는 장비가 라우터입니다.
라우터가 다음 장비를 고르는 일이 라우팅입니다. 라우팅 테이블은 어떤 주소 대역이 어느 이웃 쪽에 있는지를 적어 둔 표입니다. 라우터는 이 표에서 목적지 주소에 맞는 줄을 찾습니다. 그 줄이 가리키는 이웃에게 덩이를 넘깁니다.
sequenceDiagram
participant 보내는 호스트
participant 라우터 A
participant 라우터 B
participant 받는 호스트
보내는 호스트->>라우터 A: 목적지 주소를 단 데이터그램
Note over 라우터 A: 라우팅 테이블에서 그 주소 대역을 찾아 이웃을 고른다
라우터 A->>라우터 B: 같은 데이터그램을 그대로 넘긴다
Note over 라우터 B: 라우팅 테이블을 다시 본다
라우터 B->>받는 호스트: 목적지 주소가 이 호스트의 것이다
Note over 보내는 호스트,받는 호스트: 잘 받았다는 답은 IP 가 돌려주지 않는다
라우터는 덩이를 넘긴 뒤 그 덩이를 잊습니다. 누가 누구와 통신 중인지 기억하지 않습니다. 그래서 다음 덩이는 사정에 따라 다른 길을 탈 수도 있습니다.
라우터의 판단 두 칸
라우터의 판단은 헤더 두 칸으로 끝납니다. 먼저 목적지 주소가 자기 것인지 봅니다. 자기 것이 아니면 남은 홉 수가 아직 있는지 봅니다.
flowchart TD
A[데이터그램 도착] --> B{목적지 주소가 나인가}
B -->|맞다| C[알맹이를 위 계층에 넘긴다]
B -->|아니다| D{남은 홉 수가 0인가}
D -->|맞다| E[버린다]
D -->|아니다| F[남은 홉 수를 하나 줄여 다음 장비로 넘긴다]
판단이 이만큼 단순해서 라우터는 덩이를 빠르게 흘려보낼 수 있습니다. 한 덩이를 처리하려고 앞뒤 덩이를 기다릴 일도, 연결마다 기억을 쌓을 일도 없습니다.
약속하지 않는 것
IP 의 약속은 보내 보겠다는 것 하나입니다. 이것을 최선형 전달이라고 부릅니다. 무엇을 약속하지 않는지를 알아야 위 계층을 고를 수 있습니다.
| 약속하지 않는 것 | 그래서 생기는 일 |
|---|---|
| 도착 | 라우터에 덩이가 몰리면 넘치는 만큼 버려집니다 |
| 순서 | 다른 길을 탄 뒤 덩이가 먼저 닿기도 합니다 |
| 중복 없음 | 같은 덩이가 두 번 닿기도 합니다 |
이 빈틈은 양 끝의 프로그램이 메웁니다. TCP(Transmission Control Protocol, 전송 제어 프로토콜)는 보내는 데이터에 번호를 매깁니다. 빠진 것은 다시 보내고 순서도 맞춥니다. UDP(User Datagram Protocol, 사용자 데이터그램 프로토콜)는 그 일을 하지 않고 IP 의 성질을 프로그램에 거의 그대로 넘깁니다.
가운데는 단순하게 두고 챙길 일은 양 끝에서 하는 설계입니다. 이 생각을 종단 간 원칙이라고 부릅니다. 가운데 장비가 할 일이 적어야 네트워크를 크게 넓힐 수 있기 때문입니다.
네트워크마다 다른 것을 덮는 공통 계층
IP 가 없다고 해 봅시다. 네트워크마다 주소를 붙이는 방법도, 한 번에 실을 수 있는 크기도, 전달하는 방식도 다릅니다. 두 네트워크를 이으려면 그 둘만을 위한 번역기를 만들어야 합니다. 네트워크가 늘어날수록 번역기 수가 걷잡을 수 없이 불어납니다.
flowchart TD
subgraph 없다["IP 가 없으면 · 네트워크 넷에 번역기 여섯"]
A1[네트워크 가] --- A2[네트워크 나]
A1 --- A3[네트워크 다]
A1 --- A4[네트워크 라]
A2 --- A3
A2 --- A4
A3 --- A4
end
subgraph 있다["IP 가 있으면 · 네트워크 넷에 얹는 곳 넷"]
B1[네트워크 가] --- P[IP]
B2[네트워크 나] --- P
B3[네트워크 다] --- P
B4[네트워크 라] --- P
end
없다 ~~~ 있다
IP 는 네트워크마다 다른 것을 덮어 버리는 얇은 공통 계층입니다. 주소를 붙이는 방법 하나와 덩이 모양 하나만 정합니다. 실제로 선을 타고 건너는 일은 아래 계층에 맡깁니다. 그래서 새 전송 기술이 나와도 그 위에 IP 를 얹으면 인터넷에 붙습니다.
중간 장비가 연결을 기억하지 않는다는 성질도 여기서 나옵니다. 장비 하나가 멈춰도 다음 덩이부터 다른 길로 돌아가면 됩니다. 수많은 네트워크를 이어 붙인 인터넷이 이 방식을 바탕으로 삼은 까닭입니다.
링크마다 다른 크기 상한
덩이가 지나는 구간마다 한 번에 실을 수 있는 크기에 상한이 있습니다. 이 상한을 MTU(Maximum Transmission Unit, 최대 전송 단위)라고 부릅니다. 상한보다 큰 덩이는 그대로 지나가지 못합니다.
이럴 때 덩이는 여러 조각으로 잘려 갑니다. 자르는 일이 단편화입니다. 받는 쪽이 조각을 도로 붙이는 일이 재조립입니다. 헤더의 조각 정보가 이 일에 쓰입니다.
조각도 각자 따로 갑니다. 하나만 잃어도 받는 쪽은 원래 덩이를 못 맞춥니다. 나머지 조각까지 버립니다.
flowchart TD
D["원래 데이터그램 · 헤더 + 알맹이"] --> 조각
subgraph 조각["상한에 맞춰 자른 조각 · 각자 따로 간다"]
F1["조각 1 · 헤더 + 알맹이 앞부분"]
F2["조각 2 · 헤더 + 알맹이 가운데"]
F3["조각 3 · 헤더 + 알맹이 뒷부분"]
end
조각 --> R["하나라도 못 닿으면 재조립 실패 · 닿은 조각도 버린다"]
그래서 보내는 쪽이 길의 상한을 미리 알아내 처음부터 그보다 작게 보내는 방법을 씁니다. 그 방법이 경로 MTU 탐색입니다.
두 판본 — IPv4 와 IPv6
IP 에는 판본이 둘 있고 지금은 둘이 함께 돌아갑니다. IPv4 의 주소는 32비트입니다. 붙일 수 있는 주소 개수가 한정돼 있어, 인터넷에 붙는 기계가 늘자 모자라게 됐습니다. 여러 대가 주소 하나를 나눠 쓰도록 주소를 바꿔 주는 NAT(Network Address Translation, 네트워크 주소 변환)가 이 모자람을 미뤄 왔습니다.
IPv6는 주소를 128비트로 늘렸습니다. 헤더도 손봐서 중간 라우터가 덩이를 자르지 않게 했습니다. 두 판본은 서로 알아듣지 못하므로 한쪽만 쓰는 상대와 이야기하려면 중간에 옮겨 주는 장치가 필요합니다.
잘못됐다고 알려 주는 곁 프로토콜
IP 자신은 결과를 알려 주지 않지만, 옆에 붙어 사정을 알리는 프로토콜이 하나 있습니다. ICMP(Internet Control Message Protocol, 인터넷 제어 메시지 프로토콜)입니다. 목적지를 못 찾겠다, 남은 홉 수가 다 됐다, 덩이가 너무 커서 못 지나간다 같은 알림을 출발지로 돌려보냅니다.
이 알림도 결국 IP 데이터그램에 실려 갑니다. 그래서 알림 자체도 도중에 버려질 수 있습니다. 중간 장비가 막아 두어 아예 안 오기도 합니다. 알림이 오면 도움이 되는 것이지 온다는 보장이 있는 것은 아닙니다.
IP 에 맡기는 일과 맡기지 않는 일
무엇을 IP 에 맡기고 무엇을 위 계층에 맡기는지를 가르면 고를 것이 분명해집니다.
| IP 가 하는 일 | IP 가 하지 않는 일 |
|---|---|
| 주소를 보고 목적지까지 보냅니다 | 도착했는지 확인하지 않습니다 |
| 성질이 다른 네트워크를 건넙니다 | 순서를 맞추지 않습니다 |
| 구간 상한에 맞춰 덩이를 자릅니다 | 어느 프로그램에게 줄지 가리지 않습니다 |
마지막 칸이 프로그램을 짜는 쪽에 바로 걸립니다. 한 기계 안에서는 여러 프로그램이 동시에 통신합니다. 알맹이를 누구에게 줄지 가리는 일은 전송 계층의 포트 번호가 맡습니다. 그래서 응용 프로그램은 IP 만 쓰지 않고 TCP 나 UDP 를 골라 얹습니다.
그래도 백엔드 일에서 IP 는 자주 튀어나옵니다. 서버에 붙은 주소를 ip addr 로 확인할 때, 연결이 어느 구간에서 끊기는지 traceroute 로 짚을 때, 방화벽에 10.0.0.0/8 같은 대역만 열어 둘 때가 그렇습니다.
관련 항목
IP 위에 얹혀 도는 프로토콜
TCP · UDP · QUIC · ICMP · IGMP · IPsec
IP 데이터그램 헤더를 이루는 구성 요소
헤더 · IP 주소 · TTL · 프로토콜 번호 · 체크섬 · 페이로드
IP 를 정의하는 판본과 문서
IPv4 · IPv6 · RFC · IETF · IANA
IP 데이터그램이 목적지까지 거치는 처리 단계
캡슐화 · 라우팅 · 포워딩 · 단편화 · 재조립 · MTU · 경로 MTU 탐색
IP 데이터그램을 받아 넘기는 장비
라우터 · 게이트웨이 · 스위치 · 방화벽 · NAT · 로드 밸런서
IP 주소를 나누고 풀어 주는 주소 체계
MAC 주소 · 서브넷 · 서브넷 마스크 · CIDR · ARP · DNS · 포트 번호
IP 전달에서 자주 나는 오류
패킷 손실 · 순서 뒤바뀜 · 혼잡 · 라우팅 루프 · IP 스푸핑
IP 가 따르는 설계 원칙
최선형 전달 · 종단 간 원칙 · 비연결형 · 패킷 교환 · 계층
IP 가 속하는 상위 분류
네트워크 · 인터넷 · 프로토콜 · 인터넷 계층 · TCP/IP 모델 · OSI 모델
IP 전달을 들여다보는 명령과 도구
ping · traceroute · tcpdump · Wireshark · netstat
다른 이름: Internet Protocol · 인터넷 프로토콜 · 인터넷 규약