네트워크 계층
이번 포스트는 ‘혼자 공부하는 네트워크‘라는 책을 통해 네트워크 계층에 대해 알아보는 목적을 갖고 있다. 이 계층에서는 프로토콜과 패킷에 관한 내용을 많이 살펴볼 예정이다. 또 LAN을 넘어 통신하기 위한 IP 주소와 라우팅에 대해서 살펴볼 것이다.
우선, 이런 좋은 책을 만들어주신 강민철 님에게 감사하다는 것을 전하고 시작하도록 하겠다. 강민철 님은 어려운 내용들을 쉽게 설명해내는 능력이 매우 띄어난 저자로, 같은 설명인 것 같은데도 머리 속에 더 잘 남게해주신다. 개발 관련해서 처음 배우는 학문이나 여러 번 공부했는데 머리 속에 박혀있지 못한 것이 있다면 강민철 님의 책이나 강의를 추천한다.
그럼 시작해보자.
1. LAN을 넘어서는 네트워크 계층
LAN을 넘어서 다른 네트워크와 통신하기 위해서는 네트워크 계층의 역할이 필수다. 네트워크 계층에서는 IP 주소를 이용해 송수신지 대상을 지정하고, 다른 네트워크에 이르는 경로를 결정하는 라우팅을 통해 다른 네트워크와 통신한다.
1.1 데이터 링크 계층의 한계
물리 계층과 데이터 링크 계층만으로는 LAN을 넘어서 통신하기 어려운 이유가 대표적으로 두 가지 있다.
첫째, 물리 계층과 데이터 링크 계층만으로는 다른 네트워크까지의 도달 경로를 파악하기 어렵다.
두 계층은 기본적으로 LAN 을 다루는 계층이다. 다른 LAN의 컴퓨터와 데이터를 주고 받는다면 해당 패킷은 서로에게 도달하기까지 소많은 네트워크 장비를 거치고 다양한 경로를 통해 이동한다. 그런데 이런 통신을 빠르게 하려면 그 중에 최적의 경로로 패킷이 이동해야 한다. 그런 걸 가능하게 만들기 위해 패킷이 이동할 최적의 경로를 결정하는 것을 라우팅이라고 한다.
물리 계층과 데이터 링크 계층의 장비로는 라우팅을 수행할 수 없지만, 네트워크 계층의 장비로는 가능하다. 라우팅을 수행하는 대표적인 장비로 라우터가 있다.
둘째, MAC 주소만으로는 모든 네트워크에 속한 호스트의 위치를 특정하기 어렵다.
현실적으로 모든 호스트가 모든 네트워크에 속한 모든 호스트의 MAC 주소를 서로 알고 있기는 어렵다. 그래서 MAC 주소만으로 이 세상의 모든 호스트를 특정하기 어렵다.
네트워크 통신을 택배에 비유해보면, 택배의 수신인 역할을 하는 정보가 MAC 주소라고 할 수 있다. 그럼 수신지 역할을 하는 정보는 네트워크 계층의 IP 주소다. 택배 배송 과정에서 ‘수신인’과 ‘수신지’를 모두 활용하고 ‘수신인’보다 ‘수신지’를 우선으로 고려하는 것처럼, 네트워크에서도 MAC 주소와 IP 주소를 함께 사용하고, 기본적으로 IP 주소를 우선으로 활용한다.
MAC 주소를 물리 주소라고도 부르는 것처럼 IP 주소는 논리 주소라고도 부른다. MAC 주소는 일반적으로 NIC마다 할당되는 고정된 주소지만, IP 주소는 호스트에 직접 할당이 가능하다. DHCP$^{Dynamic\ Host\ Configuration\ Protocol}$라는 특정 프로토콜을 통해 자동으로 할당받거나 사용자가 직접 할당할 수 있고, 한 호스트가 복수의 IP 주소를 가질 수도 있다.
1.2 인터넷 프로토콜
네트워크 계층의 가장 핵심적인 프로토콜 하나를 꼽자면 단연 인터넷 프로토콜$^{IP:\ Internet\ Protocol}$이다. IP에는 IP 버전 4(IPv4)와 IP 버전 6(IPv6), 두 가지 버전이 있다. 일반적으로 IP 또는 IP 주소를 이야기할 때 주로 IPv4를 의미하는 경우가 많다. 이 포스트에서도 IPv4를 중심으로 살펴보겠다.
1.2.1 IP 주소 형태
IPv4 주소는 4바이트(32비트)로 주소를 표현할 수 있고, 숫자당 8비트로 표현되기에 0~255 범위 안에 있는 네 개의 10진수로 표기된다. 각 10진수는 점(.)으로 구분되며, 점으로 구분된 8비트(0~255 범위의 10진수)를 옥텟$^{octet}$이라 한다. 다음의 192, 168, 1, 1 각각은 8비트로 표현된 옥텟인 셈이다.
1
192.168.1.1
1.2.2 IP의 기능
IP의 기능은 다양하지만 대표적으로 두 가지가 있다. IP 주소 지정과 IP 단편화이다.
IP 주소 지정은 IP 주소를 바탕으로 송수신 대상을 지정하는 것을 의미한다.
IP 단편화는 전송하고자 하는 패킷의 크기가 MTU라는 최대 전송 단위보다 클 경우, 이를 MTU 크기 이하의 복수의 패킷으로 나누는 것을 의미한다.
MTU$^{Maximum\ Transmission\ Unit}$ 란 한 번에 전송 가능한 IP 패킷의 최대 크기를 의미한다. IP 패킷의 헤더도 MTU 크기에 포함된다는 점에 유의하자. 일반적은 MTU 크기는 1500바이트이고, MTU 크기 이하로 나누어진 패킷은 수신지에 도착하면 다시 재조합된다.
1.2.3 IPv4
IPv4 패킷은 프레임의 페이로드로 데이터 필드에 명시된다.
IPv4 패킷의 모든 필드 중에서도 가장 핵심이 되는 부분은 1) 식별자, 2) 플래그, 3) 단편화 오프셋, 4) TTL, 5) 프로토콜, 6) 송신지 IP 주소, 7) 수신지 IP 주소로 총 7개이다. 이 중에서 식별자, 플래그, 단편화 오프셋 필드는 IP 단편화 기능에 관여하고, 송신지 IP 주소, 수신지 IP 주소는 IP 주소 지정 기능에 관여한다.
- 식별자
식별자$^{identifier}$는 패킷에 할당된 번호다. 메세지 전송 과정에서 여러 조각으로 쪼개져 전송된 IPv4 패킷을 수신지에서 재조립하기 위해 필요하다.
- 플래그
플래그$^{flag}$는 총 세 개의 비트로 구성된 필드다. 이 중에 첫 번째 비트는 항상 0으로 예약된 비트로 현재는 사용되지 않는다. 사용되는 나머지 두 개의 비트 중 하나는 DF라는 이름이 붙은 비트다. 이는 Don’t Fragment의 약어로 , IP 단편화를 수행하지 말라는 표시다. 만일 이 비트가 1로 설정되어 있다면 IP 단편화를 수행하지 않고, 0으로 설정되어 있다면 IP 단편화가 가능하다.
또 하나의 비트는 MF라는 비트다. 이는 More Fragment의 약어로, 단편화된 패킷이 더 있는지를 나타낸다. 0이면 이 패킷이 마지막 패킷이라는 거고, 1이면 쪼개진 패킷이 아직 더 있다는 것이다.
- 단편화 오프셋
단편화 오프셋$^{fragment\ offset}$은 패킷이 단편화되기 전에 패킷의 초기 데이터에서 몇 번째로 떨어진 패킷인지를 나타낸다. 단편화되어 전송되는 패킷들은 수신지에 순서대로 도착하지 않을 수 있다. 그렇기 때문에 단편화된 패킷이 초기 데이터에서 몇 번째 데이터에 해당하는 패킷인지 알아야 한다. 이를 판단하기 위해 단편화 오프셋이 활용된다.
- TTL
TTL은 Time To Live의 약어로 패킷의 수명을 의미한다. 멀리 떨어진 호스트끼리 통신하면 패킷은 여러 라우터를 거쳐 이동하게 되는데, 하나의 라우터를 거칠 때마다 TTL이 1씩 감소하고, TTL 값이 0으로 떨어진 패킷은 폐기된다.
패킷이 호스트 또는 라우터에 한 번 전달되는 것을 홉$^{hop}$이라고 한다. TTL 필드가 필요한 이유는 무의미한 패킷이 네트워크 상에 지속적으로 남아있는 것을 방지하기 위함이다.
- 프로토콜
IP 패킷의 프로토콜은 상위 계층의 프로토콜이 무엇인지 나타내는 필드이다. 예를 들어 전송 계층의 대표적인 프로토콜인 TCP는 1번, UDP는 17번이다.
- 송신지 IP 주소와 수신지 IP 주소
송수신지의 IPv4 주소를 알 수 있는 곳이다.
1.2.4 IPv6
할당 가능한 IPv4 주소의 개수가 전 세계 인구 수에 미치지 못해 등장한 주소 방식이다. 16바이트(128비트)로 주소를 표현할 수 있고, 콜론(:)으로 구분된 8개 그룹의 16진수로 표기된다. 따라서 할당 가능한 주소 개수는 이론적으로 2$^{128}$개로 사실상 무한에 가까운 개수이다.
IPv6 패킷의 기본 헤더는 IPv4에 비해 간소화되어 있다.
이 중에 주요한 필드인 다음 헤더, 홉 제한, 송신지 IP 주소, 수신지 IP 주소를 살펴보자.
- 다음 헤더
다음 헤더는 상위 계층의 프로토콜이나 확장 헤더를 가리킨다. 여기서 말하는 확장 헤더는 IPv4에 비해 간소화된 IPv6의 기본 헤더에 헤더 정보가 더 필요할 경우에 추가되는 헤더를 말한다. 확장 헤더는 기본헤더와 페이로드 데이터 사이에 위치한다.
확장 헤더로 사용되는 예시를 들어보면, 송신지에서 수신지에 이르는 모든 경로의 네트워크 장비가 패킷을 검사하도록 하는 홉 간 옵션$^{Hop-by-Hop\ Options}$, 수신지에서만 패킷을 검사하도록 하는 수신지 옵션$^{Destination\ Options}$, 라우팅 관련 정보를 운반하는 라우팅, 단편화를 위한 단편$^{Fragment}$, 암호화와 인증을 위한 ESP$^{Encapsulating\ Security\ Payload}$, AH$^{Authentication\ Header}$ 확장 헤더가 있다.
- IPv6의 단편화
IPv6는 IPv4와 다르게 기본 헤더에 단편화 관련 필드가 없고, 대신 단편화 확장 헤더를 통해 단편화 여부를 나타낸다.
단편화 확장 헤더에도 다음 헤더 필드가 있는데, 기본 헤더처럼 확장 헤더에도 다음 헤더 필드가 있는 이뉴는 또 다른 확장 헤더 혹은 상위 프로토콜을 가리키기 위해서이다.
예약됨(reserved)와 예약(res) 필드는 0으로 설정되어 사용되지 않는다.
단편화 오프셋(fragment offset)과 M 플래그(M flag), 식별자(Identification) 필드는 각각 IPv4의 단편화 오프셋, MF 플래그, 식별자 필드와 같은 역할을 수행한다.
단편화 오프셋은 전체 메세지에서 현재 단편화된 패킷의 위치를 나타낸다. M 플래그는 1일 경우 더 많은 단편화 패킷이 있음을, 0일 경우엔 마지막 패킷임을 나타낸다. 식별자는 동일한 메세지에서부터 단편화된 패킷임을 식별하기 위해 사용된다.
- 홉 제한
홉 제한 필드는 IPv4 패킷의 TTL 필드와 비슷하게 패킷의 수명을 나타내는 필드다.
- 송신지 IP 주소와 수신지 IP 주소
두 필드를 이용해 IPv6 주소 지정이 가능하다.
IPv4 패킷 구성 요소의 옵션과 패딩 필드는 선택적으로 존재하는 것으로 IPv4 헤더의 길이는 가변적이다. 반면 IPv6 기본 헤더는 40바이트로 고정적이다.
IPv6 도 현재 유망한 프로토콜로 떠오르고 있는 만큼 다수의 장비에서 지원한다. 그래도 아직까지는 일반적으로 IPv4가 많이 사용된다.
1.2.5 ARP
택배를 전송할 때 수신자보단 수신지 정보를 우선적으로 고려하는 것처럼, MAC 주소와 IP 주소는 함께 사용하지만, 기본적으론 IP 주소를 사용한다. 그래서 ‘상대 호스트의 IP 주소는 알지만, MAC 주소는 알지 못하는 상황’이 생길 수 있다. 하지만 패킷을 올바르게 송신하기 위해선 상대 호스트의 MAC 주소까지 알아야 한다. 이럴 때 ARP라는 프로토콜을 사용한다.
ARP$^{Address\ Resolution\ Protocol}$는 IP 주소를 통해 MAC 주소를 알아내는 프로토콜이다. 동일 네트워크 내에 있는 송수신 대상의 IP 주소를 통해 MAC 주소를 알아낼 수 있다.
ARP의 동작 방식은 다음과 같다.
- ARP 요청
- ARP 응답
- ARP 테이블 갱신
순서대로 살펴보자.
- ARP 요청
우선 호스트 A는 네트워크 내의 모든 호스트에게 브로드캐스트 메세지를 보낸다. 이 메세지는 ARP 요청$^{ARP\ Request}$라는 ARP 패킷이다. ARP 요청은 ‘10.0.0.2 와 통신하고 싶은데, 이 분의 MAC 주소가 무엇인가요?’라고 말하는 것과 같다.
- ARP 응답
네트워크 내의 모든 호스트가 ARP 요청 메세지를 수신하지만, 10.0.0.2를 제외한 나머지 호스트는 자신의 IP 주소가 아님을 확인하고 이를 무시한다.
10.0.0.2 는 자신의 MAC 주소를 담은 메세지를 호스트 A 에게 전송한다. 이 유니캐스트 메세지는 ARP$^{ARP\ Reply}$라는 ARP 패킷이다. 10.0.0.2 의 MAC 주소가 포함된 메세지를 수신한 A는 B의 MAC 주소를 알게 된다.
- ARP 테이블 갱신
ARP 를 활용할 수 있는 모든 호스트는 ARP 테이블 이라는 정보를 유지한다. 이 테이블에 ARP 요청/응답으로 받아 기록해둔 MAC 주소는 일정 시간이 지나면 삭제되거나, 임의로 삭제할 수도 있다.
그런데 서로 다른 네트워크에 속한 호스트끼리 통신할 때는 어떻게 될까? 그러한 경우에는 라우터를 거치게 될 것이다. 따라서 호스트 A가 라우터 A의 MAC 주소를 아는지 확인하고 모른다면 ARP 요청/응답 과정을 거쳐 패킷을 전송하게 된다.
라우터 A는 패킷을 라우터 B로 전달하기 위해 ARP 요청/응답 과정을 거쳐 라우터 B에게 패킷을 전송한다. 그 후 라우터 B가 호스트 B 에게 패킷을 전달하기 위해 ARP 요청/응답 과정을 다시 거쳐 호스트 B 에게 전달할 수 있게 된다.
다만 이 설명은 매우 간략화된 것으로 라우터끼리의 통신 과정에는 ARP만 사용하는 것은 아니다.
2. IP 주소
하나의 IP 주소는 크게 네트워크 주소와 호스트 주소로 이루어진다. 그리고 이 두 가지를 ‘네트워크를 표현하눈 부분’과 ‘호스트를 표현하는 부분’이라고 표현할 수 있다. 전자는 호스트가 속한 특정 네트워크를 식별하는 역할을 하고, 후자는 네트워크 내에서 특정 호스트를 식별하는 역할을 한다.
이런 구조의 IP 주소를 어떻게 관리하고 호스트를 할당할 수 있는지 알아보자.
2.1 네트워크 주소와 호스트 주소
네트워크 주소는 네트워크 ID, 네트워크 식별자 등으로 부르기도 하며, 호스트 주소는 호스트 ID, 호스트 식별자 등으로도 부른다.
네트워크 주소가 16비트, 호스트 주소도 16비트인 IP 주소의 형태를 살펴보자.
1
2
172.16.12.45
10101100.00010000.00001100.00101101
두번째의 옥텟(.) 로 끊어서 앞이 네트워크 주소, 뒤가 호스트 주소다.
IP 주소는 네트워크 주소가 8비트 호스트 주소 24비트로 할당할 수도 있고 거꾸로 호스트 주소를 8비트로 할당할 수도 있다. 이렇듯 IP 주소에서 네트워크 주소와 호스트 주소를 구분하는 범위는 유동적일 수 있다. 그럼 이 둘을 어떻게 할당하는 것이 좋을까?
호스트 주소 공간을 크게 할당하면 호스트가 할당되지 않은 다수의 IP 주소가 낭비될 수 있고, 반대로 적게 할당하면 호스트가 사용할 IP 주소가 부족해질 수 있다. 이런 고민을 해결하기 위해 생겨난 개념이 바로 IP 주소의 클래스다.
2.2 클래스풀 주소 체계
클래스는 네트워크 크기에 따라 IP 주소를 분류하는 기준이다. 클래스를 이용하면 필요한 호스트 IP 개수에 따라 네트워크 크기를 가변적으로 조정해 네트워크 주소와 호스트 주소를 구획할 수 있다. 클래스를 기반으로 IP 주소를 관리하는 주소 체계를 클래스풀 주소 체계$^{classful\ addressing}$라고 한다.
실제 클래스를 살펴보면 A, B, …, E 클래스로 총 다섯 개의 클래스가 있다. 이 중 D와 E는 각각 멀티캐스트를 위한 클래스, 특수한 목적을 위해 예약된 클래스이기 때문에, 네트워크 크기를 나누는 데에 실질적으로 사용되는 클래스는 A, B, C다.
먼저 A 클래스는 B와 C 클래스에 비해 할당 가능한 호스트 주소의 갯수가 많다. 네트워크 주소는 비트 ‘0’으로 시작하고 1옥텟으로 구성되며, 호스트 주소는 3옥텟으로 구성된다. 즉, 이론상으로 2$^{7}$(128)개의 A 클래스 네트워크가 존재할 수 있고, 2$^{24}$(16,777,216)개의 호스트 주소를 가질 수 있다. A 클래스로 나타낼 수 있는 IP 주소의 최솟값을 10진수로 표현하면 0.0.0.0, 최댓값을 10진수로 표현하면 127.255.255.255다. 요컨대 가장 처음 옥텟의 주소가 0~127일 경우 A 클래스 주소임을 짐작할 수 있다.
B 클래스는 네트워크 주소가 비트’10’으로 시작하고 2옥텟으로 구성되며, 호스트 주소도 2옥텟으로 구성된다. 이론상으로 2$^{14}$(16,384)개의 B 클래스 네트워크와 각 네트워크에 속한 2$^{16}$(65,534)개의 호스트 주소를 가질 수 있다. B 클래스 IP 주소의 최솟값을 10진수로 표현하면 128.0.0.0, 최댓값을 10진수로 표현하면 191.255.255.255다. 따라서 가장 처음 옥텟 주소가 128~191일 경우 B 클래스 주소임을 짐작할 수 있다.
C 클래스는 비트 ‘110’로 시작하고 3옥텟으로 구성되며, 호스트 주소는 1옥텟으로 구성된다. 이론상으로 2$^{21}$(2,097,152)개의 C 클래스 네트워크가 존재할 수 있고, 각 네트워크는 2$^{8}$(256)개의 호스트 주소를 가질 수 있다. C 클래스로 나타낼 수 있는 IP 주소의 최솟값을 10진수로 표현하면 192.0.0.0, 최댓값을 10진수로 표현하면 223.255.255.255다. 가장 처음 옥텟의 주소가 192~223일 경우 C 클래스 주소임을 짐작할 수 있다.
그리고 기억해둬야 할 점이 더 있는데, 호스트의 주소 공간을 모두 사용할 수 있는 것은 아니라는 것이다. 호스트 주소가 전부 0인 IP 주소와 호스트 주소가 전부 1인 IP 주소는 특정 호스트를 지칭하는 IP 주소로 활용할 수 없다. 전자는 해당 네트워크 자체를 의미하는 네트워크 주소로 사용되고, 후자는 브로드캐스트를 위한 주소로 사용되기 때문이다.
즉, A 클래스에 실제로 할당할 수 있는 주소는 16,777,216 - 2 개인 16,777,214개다. 마찬가지로 B 클래스는 65,536 - 2 개인 65,534개, C 클래스는 256 - 2 개인 254 개다.
2.3 클래스리스 주소 체계
클래스풀 주소 체계를 이용하면 네트워크 영역을 결정하고 할당 가능한 호스트의 주소 공간을 유동적으로 관리할 수 있지만, 한계가 있다. 클래스별 네트워크 크기가 고정되기 때문에 여전히 다수의 IP 주소가 낭비될 가능성이 크다는 문제 때문이다.
단적인 예로 A 클래스 네트워크 하나당 할당 가능한 호스트 IP 주소는 1,600만 개 이상이고, B 클래스 네트워크 하나당 할당 가능한 호스트 IP 주소는 6만개가 넘는다. 단일 조직에서 이 정도의 호스트가 필요한 경우는 별로 없다. 게다가 사전에 정해진 A, B, C 클래스 외에는 다른 크기의 네트워크를 구성할 수도 없다.
그래서 클래스풀 주소 체계보다 더 유동적이고 정교하게 네트워크를 구획할 수 있는 클래스리스 주소 체계가 등장했다. 이름처럼 클래스 개념 없이 클래스에 구애받지 않고 네트워크의 영역을 나누어서 호스트에게 IP 주소 공간을 할당하는 방식이다. 오늘날에 주로 사용되고 있다.
2.3.1 서브넷 마스크
클래스풀 주소 체계는 클래스를 이용해 네트워크 주소와 호스트 주소를 구분하지만, 클래스리스 주소 체계는 클래스를 이용하지 않으므로 IP 주소상에서 네트워크 주소와 호스트 주소를 구분 짓는 지점은 임의의 지점이 될 수 있다. 클래스리스 주소 체계는 네트워크와 호스트를 구분 짓는 수단으로 서브넷 마스크를 이용한다.
서브넷 마스크는 IP 주소상에서 네트워크 주소는 1, 호스트 주소는 0으로 표기한 비트열을 의미한다. 네트워크 내의 부분적인 네트워크(서브네트워크)를 구분 짓는(마스크) 비트열인 셈이다. 서브넷 마스크를 이용해 클래스를 원하는 크기로 더 잘게 쪼개 사용하는 것을 서브네팅이라고 한다.
A, B, C 클래스의 기본 서브넷 마스크는 다음과 같다.
- A 클래스: 255.0.0.0
- B클래스: 255.255.0.0
- C클래스: 255.255.255.0
2.3.2 서브네팅: 비트 AND 연산
서브넷 마스크를 이용해서 네트워크 주소와 호스트 주소를 구분 짓는 방법은 IP 주소와 서브넷 마스크를 비트 AND 연산하는 것이다(각각을 2진수로 변환해서).
비트 AND 연산$^{bitwise\ AND\ operation}$이란 피연산자가 모두 1인 경우엔 1, 아닌 경우엔 0이 되는 연산이다.
2.3.3 서브넷 마스크 포기: CIDR 표기법
서브넷 마스크를 표기하는 방법은 크게 두가지가 있다.
- 10진수로 표기하는 방법
- ‘IP 주소/서브넷 마스크상의 1의 개수’ 형식으로 표기하는 방법
여기서 두번째 방법을 CIDR$^{Classless\ Inter-Domain\ Routing\ rotation}$이라고 부른다. IP 주소와 서브넷 마스크를 함께 표현할 수 있는 간단한 표기로 많이 활용된다.
예를 들어 C 클래스의 기본 서브넷 마스크(255.255.255.0)를 CIDR 표기법으로 표기하면 /24로 표기할 수 있다.
2.4 공인 IP 주소와 사설 IP 주소
MAC 주소와 다르게 IP 주소는 고갈될 수 있다, 라는 이야기는 반만 맞는 이야기다. 왜냐하면 전 세계에서 고유한 IP 주소가 있고, 그렇지 않은 주소가 있기 때문이다. 전자가 공인 IP 주소, 후자가 사설 IP 주소다.
2.4.1 공인 IP 주소
네트워크 통신(인터넷)을 이용할 때 사용하는 IP 주소다. 이는 ISP나 공인 IP 주소 할당 기관을 통해 할당받을 수 있다.
2.4.2 사설 IP 주소와 NAT
사설 IP 주소는 사설 네트워크에서 사용하기 위한 IP 주소다. 사설 네트워크란 인터넷, 외부 네트워크에 공개되지 않은 네트워크를 의미한다. 우리가 사용하는 모든 네트워크 기기는 IP 주소를 전부 별도로 할당받지는 않았을 것이다. 그 이유는 LAN 내의 많은 호스트가 사설 IP 주소를 사용하기 때문이다.
IP 주소 공간 중에서 사설 IP 주소로 사용하도록 특별히 예약된 공간이 있다. 다음 범위에 속하는 IP 주소가 그렇다.
- 10.0.0.0/8(10.0.0.0 - 10.255.255.255)
- 172.16.0.0/12(172.16.0.0 - 172.31.255.255)
- 192.168.0.0/16(192.168.0.0 - 192.168.255.255)
사설 IP 주소의 할당 주체는 일반적으로 라우터다. 할당 받은 사설 IP 주소는 해당 호스트가 속한 사설 네트워크상에서만 유효한 주소라서 얼마든지 다른 네트워크 상의 사설 IP 주소와 중복될 수 있다. 그래서 사설 IP 주소만으로는 일반적인 인터넷 접속을 비롯한 외부 네트워크 간의 통신이 어렵다.
그래서 사용되는 기술이 NAT이다. NAT$^{Network\ Address\ Translation}$는 IP 주소를 변환하는 기술이다. 주로 사설 네트워크와 공인 IP 주소를 변환하는 데 사용된다. NAT를 통해 사설 IP 주소를 사용하는 여러 호스트는 적은 수의 공인 IP 주소를 공유할 수 있게 된다.
2.5 정적 IP 주소와 동적 IP 주소
이제 호스트에 IP 주소를 할당하는 방법을 알아보자. 그런 방법에는 크게 두 가지 방법이 있는데, 하나는 정적 할당이고 또 하나는 동적 할당이다. 전자는 수작업을 통해, 후자는 일반적으로 DHCP라는 프로토콜을 통해 이루어진다.
2.5.1 정적 할당
정적 할당은 호스트에 직접 수작업으로 IP 주소를 할당하는 방시이다. 이 방식으로 할당된 IP 주소를 정적 IP 주소$^{static\ IP\ address}$라고 부른다.
기본 게이트웨이
기본 게이트웨이(default gateway)는 호스트가 속한 네트워크 외부로 나가기 위한 기본적인 첫 경로(첫 번째 홉)을 의미한다.
그래서 네트워크 외부와 연결된 라우터(공유기)의 주소를 의미하는 경우가 많다.
2.5.2 동적 할당과 DHCP
정적 할당으로만 IP 주소를 할당하다보면 호스트 수가 많아질 수록 관리하기 어려워진다.
이럴 때 사용 가능한 IP 주소 할당 방식이 바로 동적 할당이다. 직접 일일이 입력하지 않아도 호스트에 IP 주소가 동적으로 할당된다. 이렇게 할당된 IP 주소를 동적 IP 주소$^{dynamic\ IP\ address}$라고 부른다. 동적 IP 주소는 사용되지 않을 경우 회수되고, 할당받을 때마다 다른 주소를 받을 수도 있다.
IP 동적 할당에 사용되는 대표적인 프로토콜이 바로 DHCP$^{Dynamic\ Host\ Configuration\ Protocol}$이다. 이는 사실 응용 계층에 속하지만, 네트워크의 개념을 이해하는 데 도움이 되므로 동작 과정을 한 번 살펴보자.
DHCP를 통한 IP 주소 할당은 IP 주소를 할당받고자 하는 호스트(이하 클라이언트)와 해당 호스트에게 IP 주소를 제공하는 DHCP 서버 간에 메세지를 주고받음으로써 이루어진다. 여기서 DHCP 서버의 역할은 일반적으로 라우터(공유기)가 수행하지만, 특정 호스트에 DHCP 서버 기능을 추가할 수도 있다. DHCP 서버는 클라이언트에게 할당 가능한 IP 주소 목록을 관리하다가, 클라이언트가 요청하면 IP 주소를 할당한다.
유의할 것은 DHCP로 할당받은 IP 주소는 사용할 기간(임대 기간)이 정해져 있다는 점이다. 임대 기간은 DHCP 서버에서 설정하기 나름이지만, 일반적으로 수 시간에서 수일로 설정된다. 이 기간이 끝난 IP 주소는 다시 DHCP 서버로 반납된다. 그래서 DHCP를 통해 IP 주소를 할당받는 것을 ‘IP 주소를 임대한다’라고 표현하기도 한다.
IP 주소를 할당받는 과정에서 클라이언트와 DHCP 서버 간에 주고받는 메세지의 종류는 크게 네 가지가 있다.
- DHCP Discover
- DHCP Offer
- DHCP Request
- DHCP Acknowledgement(이하 DHCP ACK)
클라이언트는 DHCP 서버와 DHCP Discover, DHCP Offer, DHCP Request, DHCP ACK 순으로 메세지를 주고받으며 IP 주소를 할당받는다. 참고로 이 메세지들을 주고받는 건 DHCP 패킷을 주고받는 것과도 같다. 그렇다면 DHCP Discover 메세지부터 알아보자.
- DHCP Discover(클라이언트 → DHCP 서버)
Discover 이란 이름처럼 클라이언트는 DHCP Discover 메세지를 통해 DHCP 서버를 찾는다. 이는 브로드캐스트로 전송된다. DHCP Discover 메세지를 전송하는 시점에 클라이언트는 아직 IP 주소를 할당받지 못했기 때문에 송신지 IP 주소는 0.0.0.0 으로 설정된다.
- DHCP Offer(DHCP 서버 → 클라이언트)
DHCP 서버는 DHCP Discover 메세지를 받은 뒤 클라이언트에게 DHCP Offer 메세지를 보낸다. 이 메세지는 Offer 이란 이름처럼 클라이언트에게 할당해줄 IP 주소를 제한하는 메세지다. 클라이언트에게 제안할 주소뿐 아니라 서브넷 마스크, 임대 기간 등의 정보도 포함되어 있다.
- DHCP Request(클라이언트 → DHCP 서버)
DHCP Request는 DHCP Offer 메세지에 대한 응답이다. 이것도 브로드캐스트로 전송된다. 이건 마치 ‘DHCP Offer 메세지 잘 받았는데, 이 IP 주소를 써도 되죠?’라고 묻는 것과 같다.
- DHCP ACK(DHCP 서버 → 클라이언트)
마지막으로 DHCP 서버는 클라이언트에게 DHCP ACK 메세지를 보낸다. 이 메세지는 마치 최종 승인과도 같은 메세지다. DHCP ACK 메세지까지 받은 클라이언트는 이제 할당받은 IP 주소를 자신의 IP 주소로 설정한 뒤 임대 기간동안 사용한다.
임대 기간이 지나 DHCP 서버에 주소가 반납되면 다시 위의 과정을 거쳐 재할당 받아야 하는데, 기간이 끝나기 전에 연장할 수도 있다. 이를 임대 갱신$^{lease\ renewal}$이라 한다. 임대 갱신은 IP 주소의 임대 기간이 끝나기 전 기본적으로 두 차례 자동으로 수행된다. 자동으로 수행되는 임대 갱신 과정이 모두 실패하면 그때 반납된다.
3. 라우팅
라우팅에 대해 모두 다루기엔 깊은 주제라 라우팅의 분류에 주안점을 두고 살펴보려 한다.
3.1 라우터
네트워크 계층의 장비로 라우터만 알아도 큰 문제가 없을 정도로 핵심 기능을 담당한다. L3 스위치$^{L3\ switch}$라고 불리는 장치도 대표 장치긴 하지만, 오늘날 라우터와 L3 스위치는 기능상 상당 부분 유사해 엄밀히 구분하지 않는 경우가 많다.
3.2 라우팅 테이블
라우팅의 핵심은 라우터가 저장하고 관리하는 라우팅 테이블이다. 이는 특정 수신지까지 도달하기 위한 정보를 명시한 일종의 표와 같은 정보다. 라우터는 라우팅 테이블을 참고해 수신지까지 도달 경로를 판단한다.
라우팅 테이블에 포함된 정보는 라우팅 방식에 따라, 호스트의 환경에 따라 달라질 수 있다. 하지만 공통적이고 핵심적인 정보로 수신지 IP 주소와 서브넷 마스크, 다음 홉이 있고, 이외에도 라우팅 테이블에 명시되는 대표적인 정보로 네트워크 인터페이스와 메트릭이 있다.
- 수신지 IP 주소와 서브넷 마스크: 최종적으로 패킷을 전달할 대상을 의미한다.
- 다음 홉: 최종 수신지까지 가기 위해 다음으로 거쳐야 할 호스트의 IP 주소나 인터페이스를 의미한다. 게이트웨이라고 명시되기도 한다.
- 네트워크 인터페이스: 패킷을 내보낼 통로이다. 인터페이스(NIC) 이름이 직접적으로 명시되거나 인터페이스에 대응하는 IP 주소가 명시되기도 한다.
- 메트릭: 해당 경로로 이동하는데 드는 비용을 의미한다. 일상에서와 같이 라우터가 라우팅 테이블에 있는 경로 중에서 패킷을 내보낼 경로를 선택할 때도 메트릭이 낮은 경로를 선호한다.
그런데 라우팅 테이블에 없는 경로로 패킷을 전송해야 할 때가 있다. 이 경우 기본적으로 패킷을 내보낼 경로를 설정해서 해당 경로로 패킷을 내보낼 수 있다. 이 기본 경로를 디폴트 라우트$^{default\ route}$라고 한다. 디폴트 라우트는 모든 IP 주소를 의미하는 0.0.0.0/0으로 명시한다. 그리고 이것이 기본 게이트웨이로 나아가기 위한 경로가 된다.
3.3 정적 라우팅과 동적 라우팅
라우팅 테이블은 정적 라우팅, 동적 라우팅으로 크게 두 가지 방법으로 만들어진다. 이는 IP 주소를 할당하는 방법에 수동으로 직접 할당하는 것과 DHCP를 이용해 자동으로 할당되게 하는 것이 있었다. 정적 라우팅과 동적 라우팅도 이와 유사하다.
3.3.1 정적 라우팅
정적 라우팅은 사용자가 수동으로 직접 채워 넣은 라우팅 테이블의 항목을 토대로 라우팅되는 방식이다.
3.3.2 동적 라우팅
네트워크의 규모가 커지고 관리해야 할 라우터가 늘어나면 정적 라우팅만으로는 관리가 버겁다. 수동으로 입력하는 과정에서 실수를 할 수 있고 라우팅되는 경로상에 예상하지 못한 문제가 생길 수도 있다.
그런 우려되는 상황들을 대비할 수 있는 방식이 동적 라우팅이다. 이는 자동으로 라우팅 테이블 항목을 만들고, 이를 이용해 라우팅하는 방식을 의미한다. 이 방법을 사용하면 라우팅 테이블 항목이 수시로 변할 수 있다.
모든 라우터는 특정 수신지까지 도달하기 위한 최적의 경로를 찾아 라우팅 테이블에 추가하려고 노력한다. 이를 위해서 라우터끼리 정보를 교환하게 되는데, 이 과정에서 사용되는 프로토콜이 (동적) 라우팅 프로토콜이다.
3.4 라우팅 프로토콜
라우팅 프로토콜은 라우터끼리 정보를 교환하며 패킷이 이동할 최적의 경로를 찾기 위한 프로토콜이다.
라우팅 프로토콜은 크게 AS 내부에서 수행되느냐, AS 외부에서 수행되느냐에 따라 종류를 나눌 수 있다. 전자를 IGP$^{Interior\ Gateway\ Protocol}$, 후자를 EGP$^{Exterior\ Gateway\ Protocol}$라고 한다. 대표적인 IGP로는 RIP와 OSPF가 있고, 대표적인 EGP로 BGP가 있다.
3.4.1 IGP: RIP와 OSPF
대표적인 IGP로 RIP$^{Routing\ Information\ Protocol}$와 OSPF$^{Open\ Shortest\ Path\ First}$가 있다. 이 프로토콜들은 최적의 경로를 선정하는 과정에 거리 벡터가 사용되느냐, 링크 상태가 사용되느냐로 구분할 수 있다. RIP는 거리 벡터를, OSPF는 링크 상태를 사용하는 라우팅 프로토콜이다.
RIP는 거리 벡터 기반의 라우팅 프로토콜이다. 거리 벡터 라우팅 프로토콜이란 거리를 기반으로 최적의 경로를 찾는 것인데, 거리는 패킷이 경유한 라우터의 수, 즉 홉의 수를 의미한다.
OSPF는 링크 상태 라우팅 프로토콜이다. 네트워크가 노드와 간선(링크)으로 이루어져 있듯 OSPF는 링크 정보를 비롯한 현재 네트워크 상태를 그래프 형태로 링크 상태 데이터베이스$^{LSDB:\ Link\ State\ Database}$에 저장한다. 링크 상태 데이터베이스에는 라우터들의 연결 관계, 연결 비용 등 현재 네트워크의 상태를 그래프로 표현하기 위한 데이터가 저장되어 있다. 라우터는 링크 상태 데이터베이스를 기반으로 현재 네트워크 구성을 마치 지도처럼 그린 뒤 최적의 경로를 선택한다.
OSPF에선 최적의 경로를 결정하기 위해 대역폭을 기반으로 메트릭을 계산한다. 대역폭이 높은 링크일수록 메트릭이 낮은 경로로 인식한다. 또 RIP와 다르게 OSPF는 네트워크 구성이 변경되었을 때 라우팅 테이블이 갱신된다.
그런데 네트워크 규모가 매우 커졌을 땐 링크 상태 데이터베이스에 모든 정보를 저장하는 것이 어려워지고 최적의 경로를 갱신하는 연산에 비용이 많이 들 것이다.
그래서 OSPF에서는 AS를 에어리어라는 단위로 나누고, 구분된 에어리어 내에서만 링크 상태를 공유한다. 각 에어리어에는 번호가 부여되어 있고, 에어리어 경계에있는 ABR$^{Area\ Border\ Router}$이라는 라우터가 에어리어 간의 연결을 담당한다.
3.4.2 EGP: BGP
대표적인 EGP로는 BGP$^{Border\ Gateway\ Protocol}$ 가 있다. 이건 AS 간의 통신에서 사용되는 대표적인 프로토콜로, 엄밀하게는 AS 간의 통신이 ‘가능한 프로토콜’이다. AS 간의 통신을 위한 BGP는 eBGP$^{external\ BGP}$, AS 내의 통신을 위한 BGP는 iBGP$^{internal\ BGP}$라고도 한다.
AS 간에 정보를 주고받기 위해선 AS 내에서 eBGP를 사용하는 라우터(이하 BGP 라우터)가 하나 이상 있어야 하고, 또 다른 AS의 BGP 라우터와 연결되어야 한다. 이 연결은 BGP 라우터 간에 BGP 메세지를 주고받음으로써 이루어지는데, BGP 메세지를 주고받을 수 있도록 연결된 BGP 라우터를 피어$^{peer}$라고 정의한다. 즉, 다른 AS와의 BGP 연결을 유지하기 위해선 BGP 라우터끼리 연결되어 피어가 되어야 한다. 그리고 이렇게 피어 관계가 되도록 연결하는 과정을 피어링이라고 한다.
BGP는 RIP와 OSPF에 비해 최적의 경로를 결정하는 과정이 복잡하고, 일정하지 않은 경우가 많다. 경로 결정 과정에서 수신지 주소와 더불어 다양한 ‘속성’과 ‘정책’이 고려되기 때문이다.
BGP의 속성이란 경로에 대한 일종의 부가 정보이다. 종류가 다양한데, 대표적인 것으로 AS-PATH와 NEXT-HOP 그리고 LOCAL-PREF가 있다.
BGP(eBGP)는 크게 두 가지 특징을 갖는다.
- BGP는 AS 간 라우팅을 할 때 거치게 될 ‘라우터’의 수가 아닌 ‘AS’의 수를 고려한다.
- BGP는 RIP처럼 단순히 수신지에 이르는 ‘거리’가 아닌, 메세지가 어디를 거쳐 어디로 이동하는지를 나타내는 ‘경로’를 고려한다.