[Network] 네트워크 계층: 데이터 평면

서정범·2023년 4월 23일
0

네트워크

목록 보기
16/26


앞서 데이터 평면에서는 라우터 내부에서 일어나는 동작을 다룬다고 했습니다.

여기서 중요하게 다뤄지는 개념은 포워딩(fowarding)입니다.

먼저, 라우터 내부 구조에 대해서 알아보겠습니다.

라우터 내부

라우터 내부에는 크게 4가지로 구분됩니다.

  • 입력 포트
  • 스위칭 구조
  • 출력 포트
  • 라우팅 프로세서

  • <입력 포트>

입력 포트와 출력 포트에서 3개의 상자가 보입니다.

먼저, 입력포트의 맨 왼쪽 상자와 출력포트의 맨 오른쪽 상자는 라우터로 들어오는 입력 링크의 물리계층 기능을 수행합니다. 또한, 입력 링크의 반대편에 있는 링크 계층과 상호 운용하기 위해 필요한 링크 계층 기능을 수행합니다.

입력 포트에서 가장 중요한 부분은 가장 오른쪽 상자에서 수행하는 검색 기능입니다. 여기서 포워딩 테이블을 참조하여 도착되는 패킷이 스위칭 구조를 통해서 전달되는 라우터 출력 포트를 결정합니다. 즉, 입력 포트에서 어느 출력 포트로 전달할 지 결정하는 역할은 스위칭 구조에서 일어나는 것이 아니라는 점입니다.

즉, 라우터는 물리 계층 -> 링크 계층 -> 네트워크 계층 -> 스위칭 구조 -> 네트워크 계층 -> 링크 계층 -> 물리 계층 순으로 동작한다고 보면 됩니다.

  • <스위칭 구조>

스위칭 구조는 라우터의 입력 포트와 출력 포트를 연결합니다.

  • <출력 포트>

출력 포트는 스위칭 구조에서 수신한 패킷을 저장하고 필요한 링크 계층 및 물리적 계층 기능을 수행하여 출력 링크로 패킷을 전송합니다. 여기서, 링크가 양방향인 경우에는 일반적으로 동일한 링크의 입력 포트와 한 쌍을 이룹니다.

  • <라우팅 프로세서>

라우팅 프로세서는 제어 평면 기능을 수행합니다. 여기서 기존의 라우터SDN 라우터를 구분짓고 갑니다.

  • 기존의 라우터: 라우팅 프로토콜을 실행하고 라우팅 테이블과 연결된 링크 상태 정보를 유지 관리하며 라우터의 포워딩 테이블을 계산합니다.
  • SDN 라우터: 라우팅 프로세서는 원격 컨트롤러와 통신하여 원격 컨트롤러에서 계산된 포워딩 테이블 항목을 수신하고 라우터의 입력 포트에 이러한 항목을 설치합니다. 또한, 네트워크 관리 기능을 수행합니다.

앞으로 패킷이 어떻게 포워딩되는지에 대해 알아볼 것인데 이때 신경써야 되는 점이 다음과 같습니다.

  • 패킷의 전달 속도 >> 처리 속도
  • 처리 속도 >> 패킷의 전달 속도
  • 여러 입력 포트에서 같은 출력 포트로 패킷들을 전달하는 경우
  • 이때의 우선 순위
  • 이때 발생 가능한 충돌

이때 입력 포트와 출력 포트는 특정 상황에서 사용하는 개념입니다.

라우터에는 '외부 포트'와 '내부 포트'라는 용어가 아니라, 일반적으로 'WAN 포트''LAN 포트'라는 개념이 있습니다. 라우터는 이 두 가지 포트를 통해 외부 네트워크와 내부 네트워크를 연결합니다.

  1. WAN 포트 (Wide Area Network 포트): 인터넷 서비스 제공자(ISP)로부터 오는 신호를 받아들이는 포트입니다. 이 포트를 통해 외부 네트워크에 연결되어 인터넷에 접속할 수 있습니다.
  2. LAN 포트 (Local Area Network 포트): 가정이나 사무실의 내부 네트워크에 있는 기기들과 연결되는 포트입니다. 이 포트를 통해 라우터는 내부 네트워크에 있는 기기들과 통신할 수 있습니다.

그런데 '내부 포트'와 '외부 포트'는 포트 포워딩 관련된 용어입니다. 이는 라우터의 물리적인 포트가 아닌, 포트 포워딩 설정에서 외부 네트워크와 내부 네트워크 사이의 포트 매핑을 나타냅니다.

입력 포트와 출력 포트라는 개념은 여기에 해당하지 않습니다. 포트 포워딩의 경우 외부에서 들어오는 요청(입력)을 내부 네트워크의 특정 기기와 연결된 포트로 전달(출력)하는 것입니다. 따라서 내부 포트와 외부 포트가 각각 입력 포트와 출력 포트의 역할을 수행하게 됩니다. 그러나 이들은 라우터의 물리적인 포트와는 별개의 개념입니다.

입력 포트

입력 포트에서 수행되는 검색은 라우터 동작의 핵심입니다.

입력 포트는 적절한 출력 포트로 패킷으로 전달하기 위해서 포워딩 테이블을 이용합니다.

어떻게 포워딩 테이블을 이용하는지 알아보겠습니다.

먼저, IP 주소를 사용해서 패킷을 전달한다고 생각해 보겠습니다.

32비트 IP 주소의 경우 모든 가능한 목적지 주소마다 엔트리를 짜준다면, 40억개 이상의 가능한 주소가 있어야 하므로 이 옵션은 불가능합니다.

그래서 이때 사용하는 것이 링크 인터페이스입니다.

링크 인터페이스목적지 주소의 범위(프리픽스)를 이용합니다.

이것을 이용하려면 입력 포트에서 받은 패킷의 목적지 주소를 프리픽스와 비교하는 작업이 필요합니다.

최장 프리픽스 매칭 규칙(longest prefix matching rule)을 적용합니다.

이러한 방식의 검색을 이용해서 패킷의 출력 포트가 결정되면 패킷을 스위칭 구조로 보낼 수 있습니다.

일부 설계에서, 다른 입력 포트로부터 패킷이 현재 스위칭 구조를 사용하고 있다면 패킷의 차단, 대기열 처리 및 스케줄링으로 처리가 가능합니다.

이 부분에 대해선 뒤에서 다룰 것입니다.

변환기(스위치 구조)

스위칭 구조를 통해 입력 포트에서 출력 포트로 실제로 스위칭되므로 스위칭 구조는 라우터의 핵심입니다.

  • 메모리를 통한 교환: 가장 단순하고, 초기의 라우터는 CPU(라우팅 프로세서)를 직접 제어해서 입력 포트와 출력 포트 사이에서 패킷을 스위칭하는 전통적인 컴퓨터입니다. 라우팅 프로세서가 헤더에서 주소를 꺼내 출력 포트를 결정하는 방식입니다.
    • 좀더 자세히 설명하자면, 패킷이 도착하면 입력 포트는 라우팅 프로세서에게 인터럽트를 보내 패킷을 프로세서 메모리에 복사합니다. 헤더를 통해서 주소를 추출한 후 적절한 출력 포트를 찾아 해당 포트의 버퍼에 복사합니다.
    • 최근 라우터 중에서는 입력 회선 카드에서 이 과정을 수행하기도 합니다. 공유 메모리 멀티 프로레서와 매우 흡사합니다.
  • 버스를 통한 교환: 입력 포트는 라우팅 프로세서의 개입 없이 공유 버스를 통해 직접 출력 포트로 패킷을 전송합니다. 이는 일반적으로 미리 준비된 입력 포트 스위치 내부 라벨(헤더)이 로컬 출력 포트를 나타내는 패킷에게 전송되거나 버스에 패킷을 전송하여 수행됩니다. 라벨의 경우 출력 포트에서 삭제됩니다.
    • 이 방식의 단점은 모든 패킷이 하나의 버스를 건너가야 하므로, 라우터의 교환 속도버스 속도에 의해 제한된다는 점입니다.
  • 인터커넥션 네트워크를 통한 교환: 공유 버스의 대역폭 제한을 극복하는 한 가지 방법은 이전의 다중 프로세서 컴퓨터 구조에서 프로세서를 인터커넥션하는 데 사용된 것과 같은 보다 복잡한 인터커넥션 네트워크를 사용하는 것입니다.
    • 각 수직 버스는 교차점에서 수평 버스와 교차하며 스위치 구조 컨트롤러에 의해 언제든지 열거나 닫을 수 있습니다.
    • 여러패킷을 병렬로 전달할 수 있습니다.

보다 정교한 인터커넥팅 네트워크는 다단계 스위칭 구조를 통해 서로 다른 입력포트의 패킷이 동일한 출력 포트를 향해 동시에 전달할 수 있도록 여러 단계의 스위칭 요소를 사용합니다. 시스코 CRS는 3단계 논 블록킹(non-blocking) 스위칭 전략을 사용합니다.

큐잉

결국 입력 포트이건 출력 포트이건 들어오는 패킷을 내보내기 전에 저장해두는 작업이 필요로 합니다.

이 과정에서 패션 큐가 사용될 것입니다.

대기열의 위치와 범위는 트래픽 로드, 스위칭 구조의 상대 속도 및 회선 속도에 따라서 달라집니다.

메모리가 없을 경우 패킷 손실이 발생할 수 없기 때문에 이 부분은 중요한 요소입니다.

먼저, 입력 큐잉스위칭 구조에 관련해서 살펴보자.

만약, 모든 패킷을 전송하기에 스위칭 구조가 충분히 빠르지 않은 경우에 어떤일이 발생할 수 있을까?

두 입력 포트에서 같은 출력 포트로 보낸다고 했을 경우 스위칭 구조가 느리게 작용할 경우 입력 버퍼에서 기다릴 수 밖에 없습니다.

이 현상은 입력 대기 중인 스위치에서의 HOL(head-of-the-line) 차단이라고 합니다.

이 경우에는 회선의 앞쪽에서 다른패킷이 막고 있으므로 입력 큐에서 대기 중인 패킷사용할 출력 포트가 사용 중이지 않아도 스위칭 구조를 통해 전송되기 위해 기다려야 합니다.

이번에는 출력 큐잉에 대해서 살펴봅시다.

N개의 입력 포트가 있고 스위칭 구조의 속도 RswitchR_{switch}는 전달 속도 RlineR_{line}보다 N배 빠릅니다.

이때 N개의 패킷이 하나의 출력포트에 전송된다고 가정해 봅시다.

N개의 도착 패킷은 출력링크를 통한 전송 큐에 대기해야만 합니다.

그 와중에 새로운 N개의 패킷이 도착할 수 있습니다. 결국, 대기 중인 패킷의 수가 출력 포트에서 사용 가능한 메모리를 소모할 만큼 충분히 많아질 수 있습니다.

이제 이것을 어떻게 처리해야 되는지 살펴봅시다.

들어오는 패킷을 저장할 메모리가 충분하지 않을 때 도착한 패킷을 폐기[drop-tail] 정책으로 알려짐시키거나 이미 대기중인 하나 이상의 패킷을 폐기하여 새로운 패킷을 저장하기 위한 공간을 확보해야 합니다.

어떤 경우에는, 버퍼가 가득차기 전에 패킷을 폐기(도는 헤더를 마킹)시켜 송신자아게 혼잡 신호를 제공하는 것이 바람직할 수 있습니다. "패킷 폐기"와 "패킷 마킹"을 이용하는 AQM(active queue management) 알고리즘 중 하나인 RED(Random-Early-Detection)이 있습니다.

이 그림은 3개의 패킷이 도착하여 하나의 출력 포트에 전송된 후 이후에 두 개의 새로운 패킷이 스위치의 수신 측에 도달한 경우입니다.

하나의 패킷은 이미 출력 포트 버퍼에 쌓여 있는 곳에 전달해야 하고, 다른 하나는 비어 있는 출력 포트 버퍼에 전달되야 합니다. 이 경우에 무엇을 전달해야 효율적일까요?

이것을 결정하는 것이 패킷 스케줄러입니다.

버퍼 사이즈에 대한 버퍼링(B)의 양은 평균 왕복 시간(round-trip-time,RTT)에 링크 용량(C)를 곱한 것이였습니다. 이것이 최근에는 B=RTIC/NB = RTI · C / \sqrt{N}로 제안되고 있습니다.

패킷 스케줄링

일반적으로 라우터에서 패킷을 스케줄링 하는 방식은 FIFO입니다. 또한, 라운드 로빈 큐잉(round-robin queueing)이 있는데, 여기에서 고객은 다시 우선순위 큐잉과 같이 클래스로 나뉘지만 각 클래스의 고객에게는 차례대로 서비스가 제옹됩니다.

First-In-First-Out (FIFO)

FIFO 스케줄링 규칙은 출력 링크 큐에 도착한 순서와 동일한 순서로 출력 링크에서 전송할 패킷을 선택합니다.

FIFO에서 패킷은 도착한 순서와 동일한 순서로 나가게 됩니다. 이 부분에 대해서는 크게 언급할 부분이 없습니다. 다음 그림을 보고 넘어가도록 하겠습니다.

우선순위 큐잉

이 방식은 간단하게 말하자면 도착한 패킷을 우선순위 클래스로 분류해서 전달하는 방식입니다.

각 우선순위 클래스에는 일반적으로 고유한 큐가 있습니다.

전송할 패킷을 선택할 때 우선순위 큐는 전송대기 중인 패킷으로 차있는 상태이고 가장 높은 우선순위 클래스에서 패킷을 전송합니다. 동일한 우선순위를 가지는 패킷들을 선택하는 것은 FIFO 방식으로 행해집니다.

동작 방식은 아래 그림과 같습니다.

라운드 로빈(Round robin)과 WFQ(Weighted Fair Queuing)

라운드 로빈 큐잉 규칙에서는 패킷은 우선순위 큐잉과 같이 클래스로 분류됩니다. 그러나 클래스 간에는 엄격한 서비스 우선순위가 존재하지 않으며, 라운드 로빈 클래스 간에 서비스를 번갈아서 제공합니다.

작업 보존(working-conserving) 큐잉 규칙에서는 전송을 위해 큐에서 기다리는 패킷이 있다면, 링크유휴 상태가 되는 것을 허용하지 않습니다. 작업 보존 라운드 로빈 규칙에서는 클래스에서 패킷을 찾지만 아무것도 찾지 못하면 시퀀스의 다음 클래스를 즉시 검사합니다.

이 그림에서는 2개의 클래스 라운드 로빈 대기열의 작동을 보여줍니다.

패킷 1, 2, 4는 클래스 1에 속하며 패킷 3, 5는 두 번째 클래스에 속합니다.

패킷 1은 출력 큐에 도착하면 즉시 전송을 시작합니다. 패킷 1이 전송되는 동안 패킷 2와 3이 도착하고 전송을 대기합니다. 패킷 1의 전송이 완료되면 링크 스케줄러는 클래스 2 패킷을 찾고 패킷 3을 전송합니다.

패킷 3의 전송이 완료되면 스케줄러는 클래스 1패킷을 찾고 패킷 2를 전송합니다. 패킷 2의 전송이 완료되면 패킷 4만이 큐에 있기 때문에 바로 패킷 4를 전송합니다.

라우터에서 널리 구현된 라운드 로빈 큐잉의 일반적인 형태는 소위 WFQ 규칙입니다.

기본적인 동작 방식은 라운드 로빈과 유사하지만, WFQ는 각 클래스마다 다른 양의 서비스 시간(가중치)을 부여 받는다는 점에서 차이가 있습니다.

인터넷 프로토콜(IP): IPv4, 주소 지정, IPv6

이전부터 IP 데이터그램에 대해서 많이 언급을 했습니다.

이번에는 이 부분에 대해서 자세히 알아보도록 하겠습니다.

IPv4 데이터그램 형식

먼저 Ipv4 데이터그램의 주요 필드를 확인하겠습니다.

  • 버전 번호: 4비트로 데이터그램의 IP 프로토콜 버전을 명시합니다. 버전에는 Ipv4Ipv6가 있습니다.
  • 헤더 길이: IPv4 데이터그램은 헤더에 가변 길이의 옵션을 포함하므로 이 4비트로 IP 데이터그램에서 실제 페이로드가 시작되는 곳을 결정합니다. 대부분 IPv4 데이터그램은 옵션을 포함하지 않으므로 대체로 Ipv4 데이터그램 헤더는 20바이트입니다.
  • 서비스 타입: Ipv4 헤더에 포함된 서비스타입(TOS) 비트는 서로 다른 유형의 IP 데이터그램을 구별합니다. 예를 들어, 실시간 데이터그램(IP 전화 통신 어플리케이션)과 비실시간 트래픽(FTP)을 구분하는 데 유용합니다.
  • 데이터그램 길이: 바이트로 계산한 IP데이터그램의 전체 길이입니다. 이 필드의 크기는 16비트이므로 IP 데이터그램의 이론상 최대 길이는 65,535이지만 1,500바이트보다 큰 경우는 거의 없습니다. 따라서, 최대 크기의 이더넷 프레임의 페이로드 필드에 IP 데이터그램이 장착될 수 있습니다.
  • 식별자, 플래그, 단편화 오프셋: IP 단편화와 관계가 있습니다.
  • TTL(Time-to-live): 이 필드 값은 라우터가 데이터그램을 처리할 때 마다 감소하도록 합니다. TTL 필드가 0이 되면 라우터가 데이터그램을 폐기합니다. 해당 패킷이 네트워크 내에서 너무 오래 있어서 버려져야 하는지 여부를 라우터에게 알려주는 역할을 하는 것입니다.
  • 프로토콜: IP 데이터그램이 최종 목적지에 도착했을 때만 사용되는데, 이 필드 값은 IP 데이터그램에서 데이터 부분이 전달될 목적지의 전송 계층의 특정 프로토콜을 명시합니다.
  • 헤더 체크섬: 라우터가 수신한 IP 데이터그램의 비트 오류를 탐지하는데 도움을 줍니다. 헤더 체크섬은 헤더에서 각 2바이트를 수로 처리하고 이 1의 보수를 합산하여 계산한 것입니다. 라우터는 보통 오류가 검출된 데이터그램폐기합니다. TTL 필드와 옵션 필드의 값은 변경되므로 체크섬각 라우터에서 재계산되고 저장되어야 합니다.

    왜 필요한가?

    1. IP 헤더만 IP 계층에서 체크섬을 수행하지만 TCP/UDP 체크섬은 전체 TCP/UDP 세그먼트를 계산
    2. TCP/UDP와 IP는 동일한 프로토콜 스택에 속할 필요가 없다. 원리상 TCP는 IP가 아닌 다른 네트워크 프로토콜 위에서 운영될 수 있고 IP는 TCP/UDP로 전달되지 않는 데이터를 전달할 수 있습니다.
  • 출발지와 목적지 IP 주소: 출발지가 데이터그램을 생성할 때, 자신의 IP 주소를 출발지 IP 주소 필드에 삽입하고 목적지 IP 주소를 목적지 IP 주소 필드에 삽입합니다.
  • 옵션: 옵션 필드는 IP 헤더를 확장합니다. 모든 데이터그램 헤더 옵션 필드에 정보를 포함하지 않는 방법으로 오버헤드를 해결하기 위해 헤더 옵션은 거의 사용되지 않습니다. 데이터그램 헤더가 가변 길이로 데이터 필드 시작점을 초기에 결정할 수 없어 옵션은 문제를 복잡하게 만듭니다. 또한 일부 데이터그램은 옵션 처리 유무에 따라 라우터에서 IP 데이터그램을 처리하는 데 필요한 시간이 크게 달라집니다.
  • 데이터(페이로드): 대부분의 경우 IP 데이터그램의 데이터 필드는 목적지에 전달하기 위해 전송 계층 세그먼트를 포함하지만 ICMP 메시지와 같은 다른 유형의 데이터를 담기도 합니다.

IPv4 데이터그램 단편화

먼저 데이터그램의 단편화의 필요성을 알고 가야합니다.

모든 링크 계층 프로토콜이 같은 크기 네트워크 계층 패킷을 전달할 수 없습니다. 어떤 프로토콜은 큰 데이터그램을 전달하는 반면에 다른 프로토콜은 작은 데이터그램만을 전달할 수 있습니다.

링크 계층 프레임이 전달할 수 있는 최대 데이터 양을 MTU(maximum transmission unit)라 부릅니다. 각 IP 데이터그램은 한 라우터에서 다른 라우터로 전송하기 위해 링크 계층 프레임 내에 캡슐화되므로 링크 계층 프로토콜의 MTU는 IP 데이터그램 길이에 엄격한 제한을 둡니다. 여기서 중요한 점은 각 프로토
콜이 서로 다른 MTU를 가질 수 있다는 점
입니다.

좀더 이해해 보기위해 상황 하나를 가정해봅시다.

각 라우터는 각 다른 MTU를 가진 서로 다른 링크 계층 프로토콜을 가집니다. 한 링크에서 IP 데이터그램을 받으면 여러분은 출력 링크를 결정하기 위해 전달 테이블을 검사할 것입니다. 이때 출력 링크가 IP 데이터그램의 길이보다 작은 MTU를 가지는 당황스러운 상황이라면 어떻게 이 커다란 IP 패킷을 링크 계층 프레임의 페이로드 필드로 짜 맞출 것인가?

그래서 IP 데이터그램의 페이로드를 두 개 이상의 더 작은 데이터그램으로 분할하고 각각의 더 작아진 IP 데이터그램을 별도의 링크 계층 프레임으로 캡슐화하여 출력 링크로 보내지는 것입니다. 이러한 작은 데이터그램 각각을 조각(fragment, 단편)이라고 합니다.

당연히 조각들은 목적지 전송 계층에 도달하기 전에 재결합 되어야 합니다. 그런데, 이 작업을 라우터에서 수행한다면 해야하는 모든 일에다가 이 작업까지 수행을 해야 하는 것입니다. 따라서, Ipv4 설게자는 네트워크 라우터가 아닌 종단 시스템에서 데이터그램 재결합을 하도록 결정했습니다.

목적지 호스트는 일련의 데이터그램을 수싢하면 이것을 재결합해야 하는데 그 때 사용되는 것이 IP 데이터그램 헤더에 포함되어 있던 아래 3가지 입니다.

  1. 식별자: 어느 원본의 데이터그램 조각인지 결정하기 위해 데이터그램의 식별자 번호를 검사합니다.
  2. 플래그: 조각이 손실될 수 있는데, 목적지 호스트가 원본 데이터그램의 마지막 조각을 수신했음을 확신하기 위해 마지막 데이터그램 조각의 플래그 비트는 0으로, 다른 모든 조각의 플래그 비트는 1로 설정됩니다.
  3. 단편화 오프셋: 조각이 분실되었는지 결정하기 위해, 원본 데이터그램 내에 조각의 위치를 명시하기 위해 사용됩니다.

Ipv4 주소체계

호스트는 일반적으로 네트워크와 연결되는 하나의 링크를 가집니다. 호스트 IP가 데이터 그램을 보낼 때 이 링크를 통해 데이터 링크를 통해 데이터링크를 보냅니다. 호스트와 물리적 링크 사이의 경계를 인터페이스라고 부릅니다. 이때 라우터와 라우터 연결되는 경우도 존재하는데 이것의 경계 또한 인터페이스입니다.

각 링크마다 하나의 인터페이스를 가지고 하나의 라우터는 여러 개의 인터페이스를 가집니다.

각 IP 주소는 32비트 길이(4바이트)로 십진 표기법(dotted-decimal notation)을 사용합니다.

여기서 서브넷(subnet)에 대한 개념이 나옵니다.

일반적으로, IP 주소는 32개의 숫자로 이루어 진다고 말했고, 이것들을 전부 표기하면서 사용하는 것은 효율적이지 않습니다. 그래서 우리는 인터페이스를 사용하여 라우터 인터페이스를 통해서 호스트 인터페이스에 전달해주는 방식을 채택합니다. 아래 그림을 봐봅시다.

여기서 보면 223.1.1.0/24로 표기가 되어 있습니다.

이것은 앞의 24비트(3바이트)는 서브넷이라는 것을 의미하고 32비트 주소의 왼쪽 24비트가 서브넷 주소라는 것을 가르킵니다. 뒤의 숫자가 무엇이 오든 해당 인터페이스를 통해 가라는 것을 의미합니다. 여기서 24는 서브넷 마스크(subnet mask)라고 부릅니다.

서브넷을 결졍하려면 먼저 호스트나 라우터에서 각 인터페이스를 분리하고 고립된 네트워크를 만듭니다. 이 고립된 네트워크 종단점은 인터페이스의 끝이 됩니다. 이렇게 고립된 네트워크 각각을 서브넷이라고 부릅니다.

좀 더 글로벌 인터넷 환경의 예시를 통해서 살펴보자면 다음과 같습니다.

인터넷 주소 할당 방식에 CIDR(Classless Interdomain Routing-사이다)라는 것이 있습니다.

CIDR은 서브넷 주소체계 표기를 일반화하고 있습니다. 서브넷 주소체계로서, 32비트 IP 주소는 두 부분으로 나누고, 이것은 다시 점으로 된 십진수의 형태의 a.b.c.d/xa.b.c.d/x를 가지며, 여기서 xx주소 첫 부분의 비트 수입니다.

a.b.c.d/xa.b.c.d/x 형식 주소에서 최상위 비트(most significant bit, MSB)를 의미하는 xx는 IP 주소의 네트워크 부분을 구성합니다. 이를 해당 주소의 프리픽스(prefix) 또는 네트워크 프리픽스라고 합니다.

CIDR이 채택되기 전에는 IP 주소의 네트워크 부분을 8, 16, 24 비트로 제한했고 이 비트들을 서브넷 주소로 갖는 서브넷을 각각 A, B, C 클래스 네트워크로 분류했기 때문에 이러한 주소체계는 클래스 주소체계(classful addressing)라고 알려졌습니다.

CIDR의 필요성에 대해선 책에서 회사의 인수 과정을 통해서 설명을 해주었는데 완벽하게 이해가 안되어서 현재 정리를 하기가 애매합니다. 나중에 정리하도록 하겠습니다.

호스트 주소 획득: 동적 호스트 구성 프로토콜

한 기관은 ISP로부터 주소 블록을 획득하여, 개별 IP 주소를 기관 내부의 호스트와 라우터 인터페이스에 할당합니다.

호스트에 IP 주소를 할당하는 것은 수동으로 구성이 가능하지만 일반적으로 동적 호스트 구성 프로토콜(Dynamic Host Configuration Protocol, DHCP)을 더 많이 사용합니다.

DHCP는 다음과 같은 기능을 수행합니다.

  1. 호스트 IP 주소 할당
  2. 서브넷 마스크, 첫 번째 홉 라우터 주소나 로컬 DNS 서버 주소 같은 추가 정보를 얻게 해준다.

네트워크에서 자동으로 호스트와 연결해 주는 DHCP의 능력 때문에 플러그 앤 플레이 프로토콜 또는 제로 구성 프로토콜이라고 합니다.

이것의 필요성은 간단한 예시를 통해서 알 수 있습니다.

한 학생이 랩탑을 기숙사에서 도서관으로 또 강의실로 이동한다고 생각해 봅시다. 학생은 각 지역에서 새로운 서브넷에 접속할 것이며, 각 지역마다 새로운 IP 주소가 필요할 것입니다.

많은 사용자가 이동하고, 주소들이 제한된 시간 동안에만 필요할 경우 DHCP는 더할 나위 없이 적합합니다.

DHCP는 클라이언트/서버 프로토콜입니다. 만약 서버가 현재 서브넷에 없다면, 해당 네트워크에 대한 DHCP 서버 주소를 알려줄 DHCP 연결 에이전트(일반적으로 라우터)가 필요합니다.

새롭게 도착한 클라이언트와 서버는 DHCP 프로토콜 4단계의 과정을 거치면서 DHCP 연결 에이전트는 IP 주소를 클라이언트에게 할당해 줍니다.

  • DHCP 서버 발견(DHCP server discovery): DHCP 발견 메시지(DHCP discover message)를 사용하며 수행됩니다.
    • 클라이언트는 포트 67번으로 IP 데이터그램으로 캡슐화된 UDP 패킷을 보내는데, 호스트는 자신이 접속될 IP 주소를 모르고 해당 네트워크의 DHCP 서버의 주소도 모릅니다.
    • 이때 DHCP 클라이언트는 DHCP 발견 메시지를 포함하는 IP 데이터그램을 생성하는데, 이 메시지 내의 목적지 IP 주소를 브로드캐스팅 IP 주소 255.255.255.255로 설정하고 출발지 IP 주소는 0.0.0.0으로 설정합니다.
    • 즉, DHCP 클라이언트는 링크 계층으로 IP 데이터그램을 보내며 이 프레임은 서브넷에 연결된 모든 노드로 브로드캐스팅됩니다.
  • DHCP 서버 제공(DHCP server offer): DHCP 제공 메시지를 클라이언트로 응답합니다. 이 또한 브로드캐스트를 이용합니다.
    • 서브넷에는 여러 DHCP 서버가 존재하기 때문에, 클라이언트는 여러 DHCP 제공 메시지로부터 가장 최적의 위치DHCP 서버를 선택합니다.
    • 여기에는 여러 정보를 포함하는데, 수신된 발견 메시지의 트랜잭션 ID, 클라이언트에 제공된 IP 주소, 네트워크 마스크 그리고 IP 주소 임대 기간을 포함합니다.
  • DHCP 요청(DHCP request): 클라이언트는 하나 또는 그 이상의 서버 제공자 중에서 선택할 것이고 제공자에게 파라미터 설정으로 돌아오는 DHCP 요청 메시지로 응답할 것입니다.
  • DHCP ACK: 서버는 DHCP 요청 메시지에 대해 요청된 파라미터를 확인하는 DHCP ACK 메시지로 응답합니다.

이동성 측면에서 DHCP는 하나의 커다란 결점이 있습니다.

노드가 새로운 서브넷에 연결하고자 할 때마다 새로운 IP 주소를 DHCP로부터 얻기 때문에, 이동 노드가 서브넷 사이를 이동할 때 원격 응용에 대한 TCP 연결은 유지될 수 없습니다.

TCP 연결에 필요한 4가지 구성 요소를 생각하면 될 것 같습니다.

네트워크 주소 변환(NAT)

현재까지 네트워크 주소 할당 체계에 대해서 알아봤습니다.

SOHO(small office, home office) 네트워크 확산으로 인해서 SOHO가 장치를 연결하기 위해 LAN을 설치할 때마다 ISP는 모든 SOHO의 IP장치를 수용할 수 있는 주소 범위를 할당해야 합니다.

만약, 큰 주소 블록이 필요한 상황에서 해당 주소의 인접한 부분을 ISP가 이미 할당한 상태라면 어떻게 해야할까요?

이런 상황에서는 네트워크 주소 변환(NAT)으로 주소를 할당할 수 있습니다.

해당 그림을 봐봅시다.

"NAT 가능" 라우터의 운영을 보여주고 있습니다.

현재 해당 라우터를 보면 두 개의 인터페이스를 가지고 있는 것을 확인할 수 있습니다. 왼쪽의 인터페이스의 경우 왼쪽에 있는 라우터와의 연결이 되어있는 인터페이스이고, 오른쪽의 경우 홈 네트워크와 연결되어 있는 인터페이스라고 볼 수 있습니다.

홈 네트워크 4개 인터페이스 모두 같은 네트워크 주소 10.0.0.0/24를 갖습니다.

주소 공간 10.0.0.0/8은 사설망또는 그림의 홈 네트워크와 같은 사설 개인 주소를 갖는 권역(realm)을 위해 예약된 IP 주소 공간 세 부분 중의 하나입니다.

여기서 사설망, 사설 개인 주소를 갖는 권역이라는 부분이 굉장히 중요합니다.

즉, 현재 138.76.29.7은 글로벌 인터넷 네트워크에서 사용되는 IP 주소이고, 10.0.0.0/24는 해당 홈 네트워크에서만 사용 가능한 네트워크 주소 공간이라고 생각하면 됩니다.

이것이 왜 중요할까요?

만약 수십만 개의 홈 네트워크가 있고, 이 중에 많은 네트워크들이 같은 주소 공간 10.0.0.0/24를 사용하고 있다고 생각해 봅시다. 홈 네트워크 내부의 장비는 서로 10.0.0.0/24 주소체계를 이용하여 서로 패킷을 전송하고 이 홈 네트워크를 벗어나 글로벌 인터넷으로 가는 패킷 전달은 이 주소들을 사용할 수는 없습니다.

하지만 생각해봅시다. 결국 글로벌 인터넷에서만 사용 가능한 IP주소는 굉장히 적은 양(혹은 한개)이 사용 되었지만 거기에 수많은 홈 네트워크 내부의 장비들에게 IP 주소를 할당해 준 것입니다.

본질적으로 NAT 가능 라우터는 외부에서 들어오는 홈 네트워크의 상세한 사항을 숨깁니다. 그렇다면, 어떻게 컴퓨터가 주소를 얻고, 라우터가 한 IP 주소를 어디에서 얻는 것일까요? 이 역할을 수행하는 것이 DHCP입니다. 정확히는 라우터는 ISP의 DHCP 서버로부터 주소를 얻고, NAT-DHCP 라우터로 제어되는 홈 네트워크 주소 공간에서 DHCP 서버를 실행하여 컴퓨터에게 주소를 제공합니다.

WAN에서 같은 목적지 IP 주소를 갖는 NAT 라우터에 데이터그램이 도착하면 내부 호스트는 어떻게 받는 것일까요? 그 방법은 NAT 변환 테이블(NAT translation table)를 사용하는 것입니다.

먼저 송신자 호스트 10.0.0.1인 홈 네트워크가 IP 주소 128.119.40.186인 웹 서버(포트 80)에게 웹 페이지를 요청한다고 가정해봅시다.

이때의 동작 방식을 봐봅시다. (위의 그림을 참고해가면서 봐봅시다)

  1. 호스트 10.0.0.1은 임의의 출발지 포트 번호 3345를 할당하고 LAN에 데이터그램 전송
  2. NAT 라우터에서는 글로벌 네트워크쪽 인터페이스에 사용되고 있지 않은 새로운 포트(5001)를 생성하고 포트 번호를 교환한 후(3345 -> 5001) 목적지 호스트로 전송
  3. 이 과정에서 라우터 내부의 NAT 해석 테이블의 엔트리를 추가합니다.(참고로 포트 번호의 필드는 16비트)
  4. 웹 서버는 요청을 처리한 후 응답을 보냅니다.
  5. 라우터는 홈 네트워크 브라우저의 IP 주소(10.0.0.1)와 목적지 포트 번호(3345)로부터 얻은 목적지 IP 주소와 목적지 포트 번호를 사용해서 NAT 변환 테이블을 작성합니다.
  6. 라우터는 데이터그램의 목적지 주소와 포트 번호를 다시 기록하고, 홈 네트워크 내부로 데이터그램을 전송합니다.

IPv6

네트워크의 활성화로 인해서 빠른 속도로 IP 주소 공간이 고갈되고 있는 상황에서 NAT기술은 굉장히 유의미한 기술이였습니다.

하지만, 근본적인 문제는 해결되지 않습니다.
따라서, 새로운 IP 프로토콜인 IPv6가 개발되었습니다.

이번에는 IPv6 데이터그램 포맷에 대해서 살펴보겠습니다.

  • 확장된 주소 기능" IPv6는 IP 주소 크기를 32비트에서 128비트로 확장했으므로 IP 주소 고갈되는 일은 발생하지 않을 것입니다. 또한, IPv6는 유니캐스트, 멀티캐스트 주소뿐만 아니라 새로운 주소 형태인 애니캐스트 주소(anycasy address)가 도입되었습니다.
  • 간소화된 40바이트 헤더: 40바이트 고정 길이 헤더는 라우터가 IP 데이터그램을 더 빨리 처리하게 해줍니다. 기존에 IPv4의 많은 필드가 생략되거나 옵션으로 남겨졌습니다.
  • 흐름 라벨링: IPv6는 정의하기 어려운 흐름(flow)을 가지고 있습니다.
  • 버전: 4비트 필드로 IP 버전 번호를 인식합닏. IPv6의 이 필드 값은 "6"입니다.
  • 트래픽 클래스: IPv4의 TOS 필드와 비슷한 의미로 만든 8비트 필드는 흐름내의 특정 응용 데이터그램에 우선 순위를 부여하는 데 사용됩니다.
  • 흐름 라벨: 20비트 필드로 데이터그램의 흐름을 인식하는데 사용됩니다.
  • 페이로드 길이: 이 16비트 값은 IPv6 데이터그램에서 고정 길이 40바이트 패킷 헤더 뒤에 나오는 바이트 길이이며 부호 없는 정수(unsigned integer)입니다.
  • 다음 헤더: 데이터그램의 내용(데이터 필드)이 전달될 프로토콜을 구분합니다.
  • 홉 제한: 이 필드의 내용은 라우터가 데이터그램을 전달할 때 마다 1씩 감소합니다. 홉 제한 수가 0보다 작아지면 데이터그램을 버립니다.
  • 출발지와 목적지 주소: 다양한 형태로 제공됩니다.
  • 데이터: IPv6 데이터그램의 페이로드 부분입니다.

여기서 IPv4에는 존재하지만 IPv6에는 사라진 필드가 존재합니다.

  • 단편화/재결합: IPv6에서는 단편화와 재결합을 출발지와 목적지만이 수행합니다. 이 기능을 수행하는데 시간이 걸리므로 삭제하고 종단 시스템이 하도록 하는 것이 네트워크에서 IP 전달 속도를 증가시킵니다.
  • 헤더 체크섬: 트랜트포트 계층 프로토콜과 데이터 링크 프로토콜이 체크섬을 수행하므로 IP 설계자는 네트워크 계층의 체크섬 기능이 만복되는 것을 생략해도 된다고 생각해서 뺐습니다.
  • 옵션: 옵션 필드는 더 이상 표준 IP 헤더 필드가 아닙니다. 대신 옵션 필드는 IPv6 헤더에서 "다음 헤더" 중 하나가 될 수 있습니다.

IPv4에서 IPv6로 전환

IPv6 프로토콜을 개발했다곤 하지만, 이전까지 쓰던 IPv4가 많고 상용화과 되어 있는 주소 체계이기 때문에 IPv6와 IPv4를 같이 사용할 수 있는지 확인해봐야 합니다.

결론부터 말씀드리자면, 일반적인 방식으로는 불가능합니다.

IPv4로 구축된 시스템은 IPv6 데이터그램을 처리할 수 없습니다.

이 문제를 해결하기 위해서 터널링이라는 방법이 생겨납니다.

두 IPv6 노드가 IPv6 데이터그램을 사용해서 작동한다고 가정해봅시다.

이들은 IPv4 라우터를 통해 연결되어 있는데, 두 IPv6 사이에 있는 IPv4 라우터들을 터널이라고 합니다.

터널의 송신측에 있는 IPv6 노드는 IPv6 데이터그램을 받고 IPv4 데이터그램의 데이터 필드에 이것을 넣습니다.

그림이 워낙 잘나와있어서 추가적인 설명은 필요하지 않을 것 같다.

여기서 신경쓰이는 점은 IPv6는 터널링 과정이 추가가 되었으니깐 IPv4를 사용하는 것보다 전달 속도가 더 느리지 않을까라는 의문점이 생깁니다.

결론부터 말씀드리자면, IPv4가 아주 조금 더 빠르긴 하지만 미세한 정도라고 합니다.

IPv4보다 IPv6의 이점은 다음과 같습니다.

  1. 보안 강화
  2. 지리적 제한 X
  3. 보다 효율적인 라우팅
  4. 끝과 끝 연결
  5. 자동 구성

일반적인 포워딩 및 소프트웨어 기반 네트워크(SDN)

전용 하드웨어, 소프트웨어, 및 인터페이스 관리를 갖춘 중간 상자, 2계층 스위치 및 3계층 라우터의 확산은 의심의 여지없이 많은 네트워크 사업자에게 비용적인 측면에서 문제가 되었스빈다.

그러나 소프트웨어 정의 네트워킹(SDN)은 최근 네트워크 계층 기능과 특정 링크 계층 기능을 제공하기 위한 통합된 접근 방식을 약속했으며, 현재 제공되고 있습니다.

먼저, 이 과정을 다시 한번 정리해 보겠습니다. (위에서 봤던 내용 정리 입니다.)

목적지 IP 주소("매칭")을 검색한 후 패킷을 스위칭 구조로 지정된 출력 포트("액션")로 포워딩하는 작업을 수행합니다.

이 과정에서 "매칭"은 여러 다른 계층의 프로토콜들의 헤더에 대해서 수행이 가능한 일반적인 "검색 추가 방법"이 필요합니다.

"액션"은 하나 이상의 출력 포트(목적지 기반 포워딩 같이)로 패킷을 전달하고, 인터페이스에서 나가는 패킷을 부화 균등화(로드 밸런싱과 같이)하고 헤더 값을 다시 쓰고, 의도적으로 패킷을 차단/삭제(방화벽과 같이) 및 추가 처리 작업(DPI와 같이)을 위해 특수 서버로 패킷을 보내는 등의 작업을 수행합니다.

다음 그림을 봐봅시다.

각 패킷 스위치의 검색 추가 작업 테이블을 보여주며 테이블은 원격 컨트롤러를 통해 계산, 설치 및 업데이트됩니다.

개별 패킷 스위치의 제어 구성 요소가 서로 상호 작용할 수는 있지만 실제로는 일반화된 검색 추가 작업 기능이 원격 컨트롤러를 통해 구현되고 이 테이블을 계산, 설치 및 업데이트 합니다.

여기서 오픈플로(OpenFlow)라는 개념이 등장합니다.

오픈플로(OpenFlow)

오픈플로(OpenFlow)는 네트워크를 경유하는 네트워크 스위치나 라우터의 포워딩 플레인에 접근 권한을 제공하는 통신 프로토콜입니다.

오픈플로는 네트워크 컨트롤러가 스위치망을 통해 네트워크 패킷의 경로를 정의할 수 있게 합니다. 컨트롤러는 스위치와는 구별됩니다.

참고: 위키백과

오픈 플로는 다음과 같은 기능을 수행합니다.

  • 들어오는 패킷에 대한 헤더 값들의 세트가 매칭될 것입니다. 만약 플로우 테이블 항목과 일치하지 않은 패킷은 더 많은 처리를 위해 원격 컨트롤러로 전송될 수 있습니다.
  • 패킷들에 의해 업데이트 되는 카운터 세트는 플로우 테이블 요소들과 일치됩니다.
  • 패킷이 플로우 테이블 항목과 일치될 때 여러가지 동작들이 가능해집니다. (전송, 삭제, 복사본)

매치(Match)

OpenFlow 1.0 검색 추가 작업 규칙에서는 일치(match)할 수 있는 11개의 패킷 헤더 필드와 수신 포트 ID를 보여줍니다.

첫번째 관찰은 OpenFlow의 일치 개념이 프로토콜 헤더의 세 계층에서 선택된 필드에 일치하도록 허용합니다. 여기서 말하는 세 계층은 링크 계층, 네트워크 계층, 트랜스포트 계층을 의미합니다.

진입 포트는 패킷이 수신되는 패킷 스위치의 입력 포트를 나타냅니다.

플로우 테이블 항목에는 와일드 카드도 있을 수 있습니다.

마지막으로 IP 헤더의 모든 필드가 일치 할 수 있는 것은 아닙니다. 예를 들어, OpenFlow는 TTL 필드 또는 데이터그램 길이 필드에 기반한 일치를 허용하지 않습니다.

여기서 중요한 문구가 있습니다.

한번에 한 가지 일을 하고, 잘하라. 인터페이스추상화의 최소 필수 요소를 차지합니다. 일반화 하지 마라. 일반화는 일반적으로 잘못되었다.

액션(Action)

가장 중요한 액션들은 다음과 같습니다.

  • 포워딩(Fowarding): 들어오는 패킷은 특정 실제 출력 포트로 전달되거나 모든 포트를 통해 브로드캐스트되거나(선택한 포트를 제외하고) 선택된 포트 세트를 통해 멀티캐스트 될 수 있습니다.
  • 드롭핑(Dropping): 아무 동작이 없는 플로우 테이블 항목은 일치된 패킷을 삭제해야 합니다.
  • 수정필드(Modify-field): 패킷이 선택된 출력 포트로 전달되기 전에 10개의 헤더 필드의 값을 다시 쓸 수 있습니다.

매칭-플러스-액션 작업

이 과정을 통해서 다음과 같은 기능들을 수행합니다.

  • 간단한 포워딩
  • 부화 균등화(Load Balancing)
  • 방화벽

일단 간단한 포워딩의 경우 앞에서 봤던 것과 같이 호스트의 인터페이스와 라우터의 인터페이스의 연결과 IP Src, IP Dst를 플로우 테이블에 업데이트 하면서 작업을 수행합니다.

부화 균등화의 경우 송신측 네트워크에서 같은 라우터 인터페이스로 패킷을 전달하려고 할 때 하나의 패킷은 바로 연결된 인터페이스를 통해 전달하고, 다른 하나 패킷은 다른 라우터를 거쳐서 전달하는 과정이 존재할 수 있고 이러한 기능 수행이 가능하다는 것을 의미합니다.

방화벽은 플로우 테이블에 없는 항목이면 전달하지 않고 플로우 테이블에 있는 항목만 전달하는 것을 의미합니다.


Reference

profile
개발정리블로그

0개의 댓글