테마
IP와 라우팅 2
IP와 라우팅에서 본 IP(Internet Protocol, 인터넷 프로토콜) 주소가 기기에 주어지고, 패킷(packet)이 라우터(router)를 거쳐 목적지까지 넘어가는 과정과 문제를 알리는 방법을 이어서 다룬다. 끝으로 링크(link, 장비 사이를 직접 잇는 한 구간)마다 다른 패킷 크기 한도와, 주소 고갈을 풀려고 나온 IPv6(Internet Protocol version 6, 인터넷 프로토콜 6판)를 본다.
DHCP
기기가 네트워크에 들어오면 쓸 IP 주소, 서브넷 마스크(subnet mask), 기본 게이트웨이(default gateway), DNS(Domain Name System, 도메인 이름 시스템) 서버 주소를 알아야 한다. DHCP(Dynamic Host Configuration Protocol, 동적 호스트 구성 프로토콜)는 이 값을 자동으로 나눠 주는 프로토콜이고, 과정은 네 메시지의 머리글자를 따 DORA라고 부른다.
다이어그램 로딩…
새 기기는 아직 주소가 없으므로 Discover를 같은 네트워크 전체에 브로드캐스트(broadcast)해 서버를 찾는다. 서버가 주소와 설정을 제안(Offer)하면, 기기는 고른 제안을 쓰겠다는 Request도 브로드캐스트로 보내 서버가 여럿이어도 어느 제안을 골랐는지 모두가 알게 한다. 마지막 Ack는 주소를 확정하고 빌려 쓸 기간을 알려 준다. 주소는 영구 배정이 아니라 기간이 정해진 임대(lease)다. 그래서 기기는 기간이 끝나기 전에 연장을 요청하고, 떠난 기기의 주소는 나중에 다른 기기에 다시 나눠 줄 수 있다.
라우터와 라우팅 테이블
여러 네트워크에 동시에 연결된 라우터가 목적지 IP 주소를 보고 다음에 넘길 곳을 정하는 일을 라우팅(routing)이라고 한다. 기준은 라우팅 테이블(routing table)이고, 각 항목은 "이 목적지 대역으로 가려면 이 인터페이스(라우터에서 네트워크 하나에 연결된 출입구)로, 이 다음 라우터에게 넘겨라"를 적은 것이다. 목적지가 여러 항목에 걸리면 네트워크 부분이 가장 긴, 즉 가장 구체적인 항목을 고른다. 이를 최장 접두사 일치(longest prefix match)라고 한다. 어느 항목에도 걸리지 않는 패킷은 기본 경로(default route)로 보낸다. 기본 경로는 0.0.0.0/0으로 적는데, 네트워크 부분이 0비트라 비교할 비트가 없어 모든 주소가 걸린다.
호스트(host)도 작은 라우팅 테이블을 가진다. 목적지가 자기 서브넷(subnet)이면 직접 보내고, 아니면 기본 게이트웨이로 보낸다. 가정에서는 공유기가 기본 게이트웨이 역할을 한다.
TTL과 ICMP
IPv4(Internet Protocol version 4, 인터넷 프로토콜 4판) 헤더(header)에는 8비트 TTL(Time To Live, 생존 시간) 필드가 있다. 라우터는 패킷을 넘길 때마다 TTL을 1씩 줄이고, 0이 되면 패킷을 버린다1. 라우팅 설정이 잘못돼 패킷이 라우터 사이를 끝없이 도는 경우에도, 결국 TTL이 바닥나 패킷이 사라지므로 네트워크가 막히지 않는다.
ICMP(Internet Control Message Protocol, 인터넷 제어 메시지 프로토콜)는 IP 전달 중 생긴 오류나 상태를 알리는 보조 프로토콜이다. TTL이 0이 돼 패킷을 버린 라우터는 출발지에 ICMP 시간 초과(Time Exceeded) 메시지를 보낸다. traceroute는 이 동작을 이용한다. TTL을 1, 2, 3으로 늘려 가며 보내면 첫째, 둘째, 셋째 라우터가 차례로 시간 초과를 돌려보내므로 경로의 라우터 목록이 드러난다. ping은 ICMP 에코 요청(Echo Request)을 보내고 에코 응답(Echo Reply)을 기다려, 상대에게 닿는지와 왕복 시간을 잰다. 방화벽(firewall)이 ICMP를 막으면 서버가 살아 있어도 ping은 실패할 수 있다.
단편화와 MTU
링크마다 한 번에 실을 수 있는 패킷 크기의 한도가 있는데, 이를 MTU(Maximum Transmission Unit, 최대 전송 단위)라고 한다. 이더넷(Ethernet)의 MTU는 보통 1500바이트다. IPv4에서는 패킷이 다음 링크의 MTU보다 크면 라우터가 패킷을 여러 조각으로 나눌 수 있고, 이를 단편화(fragmentation)라고 한다. 조각은 목적지에서만 다시 합쳐지며, 한 조각이라도 잃으면 패킷 전체가 쓸모없어진다. 그래서 요즘은 보통 헤더의 DF(Don't Fragment, 단편화 금지) 비트를 켜서 보낸다. 이 비트가 켜진 패킷이 다음 링크의 MTU보다 크면 라우터는 나누지 않고 버린 뒤 ICMP로 너무 크다고 알린다. 보내는 쪽이 이 알림을 받아 크기를 줄이는 이 방식을 경로 MTU 탐색(Path MTU Discovery)이라고 한다.
IPv6
IPv4 주소는 32비트라 약 43억 개뿐이고, 인터넷 기기가 늘면서 새로 나눠 줄 주소가 바닥났다. IPv6는 주소를 128비트로 늘려 이 문제를 근본적으로 푼다. 주소는 2001:db8::1처럼 16비트씩 콜론으로 끊어 16진수(hexadecimal)로 적고, 0이 이어지는 구간 한 곳을 ::로 줄여 쓸 수 있다. 주소가 넉넉해 기기마다 공인 IP 주소(public IP address)를 줄 수 있으므로, IPv4처럼 NAT(Network Address Translation, 네트워크 주소 변환)로 주소 하나를 나눠 쓰지 않아도 동작하도록 설계됐다. 헤더는 IPv4(20~60바이트 가변)와 달리 고정 40바이트라 라우터가 더 빨리 처리할 수 있다. 라우터의 일을 줄이려고 단편화도 출발지만 할 수 있게 했다. 그래서 라우터는 너무 큰 패킷을 버리고 ICMPv6로 알리며, 출발지가 경로 MTU 탐색으로 크기를 맞춘다.
면접 포인트
- "DHCP 과정은?" → Discover(브로드캐스트) → Offer → Request(브로드캐스트) → Ack. 주소는 임대.
- "라우터는 어디로 넘길지 어떻게 정하나요?" → 라우팅 테이블에서 최장 접두사 일치. 걸리는 항목이 없으면
0.0.0.0/0기본 경로. - "
traceroute는 어떻게 동작하나요?" → TTL을 1씩 늘려 보내고, 라우터가 돌려주는 ICMP 시간 초과로 경로를 알아낸다. - "IPv6가 왜 필요한가요?" → IPv4 32비트 주소 고갈. 128비트로 늘리고 NAT 의존을 줄인다.
참고
