네트워크 계층은 어떤 일을 할까요?
바로 옆 노드 통신을 넘어서 최적의 길찾기 역할을 합니다.
메일을 보낼 때 최종 목적지 노드에 도달하려면 어떻게 가야하는지 네비게이션처럼 알려주는 것을 라우팅(Routing)이라고 하며,
이러한 라우팅을 해주는 계층이 바로 네트워크 계층입니다.
네트워크 계층이 없다면 우리는 바로 옆 노드에 있는 장치로만 메일 전달을 할 수 있을 것입니다.
그런데 네트워크 계층은 라우팅을 어떠한 원리로 할 수 있는 것일까요?
송신자, 수신자에서만 재설정되는 트랜스포트 계층(Transport Layer)과 달리 네트워크 계층은 모든 호스트(host), 라우터(router)에서 재설정됩니다.
라우터란 컴퓨터 네트워크 간에 패킷을 전송하는 네트워크 장치로, 패킷의 위치를 추출하여 그 위치에 대한 최적의 경로를 지정하며, 이 경로를 따라 패킷을 다음 장치로 전달하도록 합니다.
이러한 네트워크 계층은 포워딩(Forwarding)과 라우팅(Routing)이라는 두가지 기능을 가지고 있습니다.
- 포워딩
- 라우터의 input부터 output까지 패킷이 옮겨지는 것을 말합니다.
- data plane의 영역입니다.
- 라우팅
- source부터 destination까지의 경로를 구축하는 것을 말합니다.
- control plane의 영역입니다.
(data plane과 contol plane은 네트워크 계층을 두 계층으로 나눈 것이라 생각하시면 됩니다.)
과거에는 라우터 내에서 포워딩, 라우팅을 둘 다 했었으나, 포워딩은 하드웨어 영역에서 발생하여 nanosecond 단위가 소모되는 반면, 라우팅은 소프트웨어 영역에서 발생하므로 millisecond 단위가 소모됩니다.
따라서 이토록 오버헤드가 큰 라우팅을 따로 분리하여 원격 서버(remote server)에서 관리하는 것을 SDN(Software-defined network)라고 하며, 이것이 현재 대세라고 합니다.
포워딩은 하드웨어에 의해 발생하므로 fabric, 즉 선의 종류에 라우터의 성능이 달려있습니다.
SDN이 원격 서버에서 라우팅을 통해 경로를 설정하면 → control plane
이에 맞게 각 라우터에서 포워딩을 수행하게 되는 것입니다 → data plane
이번 글에서는 포워딩을 수행하는 data plane 영역에 대해 알아보도록 하겠습니다!
목차
- 라우터 포트의 queueing
- input 포트 queueing
- output 포트 queueing
- 패킷 스케줄링
- IP 데이터그램 포맷
- IP fragmetation
- IP addressing
- 서브넷(Subnet)
- Hierarchical addressing
- Logest prefix metching
- DHCP
- NAT
- IPv6
라우터 포트의 queueing
input 포트와 output 포트는 queue가 쌓이는 버퍼를 이용합니다.
따라서 라우터의 포트에 queueing delay나 data loss가 발생할 수 있게 됩니다.
자세히 봅시다.
input 포트 queueing
Switch fabric이 input 포트보다 느리면 input queue에 queueing이 발생할 수 있습니다.
이로 인해 앞에 있는 패킷이 뒤에 있는 패킷의 포워딩을 막는 현상인 HOL(head of the line) Blocking이 발생할 수 있습니다.
왼쪽 그림을 보면 위 쪽의 붉은 패킷이 붉은 output 포트로 가기 때문에 아래의 붉은 패킷이 가지 못하고 기다리고 있습니다.
그로 인해 그 뒤에 있는 초록색 패킷은 현재 지나갈 수 있는 상황에도 불구하고 wait을 하게 됩니다.
output 포트 queueing
switching하는 속도보다 output line speed가 느리면 queueing이 발생할 수 있습니다.
패킷 스케줄링
따라서 어떤 패킷을 link로 보낼지에 대한 스케줄링이 필요합니다.
즉, 어느 패킷을 송신할지 정하는 것을 말합니다.
패킷 스케줄링의 종류는 아래와 같습니다.
- FCFS (First Come, First Served)
- Priority queue
- output으로 도착하는 패킷들을 high-priority와 low-priority로 분류합니다.
- high-priority queue를 먼저 비우고 low-priority queue를 비웁니다.
- 만약 low-priority queue가 비워지지 않았는데 high-priority 패킷들만 계속 도착한다면 기아 상태(starvation)가 발생할 수 있습니다.
- 기아 상태(starvation)? 프로세스가 끊임없이 필요한 컴퓨터 자원을 가져오지 못하는 상황을 말합니다.
- Round Robin
- queue들을 순회하면서 시간 단위로 패킷들을 보냅니다.
- Weighted Fair Queueing(WFQ)
- 일종의 Round Robin으로, queue에 가중치가 존재해서 각각 다른 시간씩 패킷을 보냅니다.
IP 데이터그램 포맷
트랜스포트 계층에서 세그먼트(segment)였던 것이 네트워크 계층에서는 데이터그램(datagram)이라 부릅니다.
그래서 보내는 쪽이 세그먼트를 데이터그램으로 캡슐화하고, 받는 쪽에서 세그먼트로 바꾸어 트랜스포트 계층으로 전달합니다.
이번 글에서 여태껏 패킷이라 표현한 것이 곧 데이터그램입니다!
이러한 데이터그램의 크기는 아래와 같습니다.
20bytes(데이터그램 헤더) + 20bytes(TCP 헤더) + 애플리케이션 오버헤드
IP fragmentation
네트워크 link는 MTU(Max Transfer Size)를 가지기 때문에, 이를 능가하는 데이터가 지나가면 패킷을 잘라줘야 합니다.
여기서 잘린 패킷은 각각 offset을 갖고, 목적지에 도착하면 재조립(reassemble)됩니다.
오른쪽 이미지를 봅시다.
여기서 데이터그램의 크기는 4000bytes이고, link의 MTU는 1500bytes입니다.
- 데이터그램 = 20bytes(데이터그램 헤더) + 3980bytes(data = 세그먼트 사이즈)
- 각 패킷은 1500bytes까지 가질 수 있으므로, 20bytes의 데이터그램 헤더를 생각하면 각 패킷은 1480bytes까지의 data를 가질 수 있습니다.
- 따라서 3980bytes의 기존 data는 1480, 1480, 1020 bytes로 잘리게 되고, 마지막 데이터그램의 사이즈는 1020bytes + 20bytes = 1040bytes가 되는 것입니다.
- 잘린 패킷의 ID, fragflag, offset은 나중에 재조립할 때 사용됩니다.
IP addressing
기본적으로 IP는 router의 소재지(locality)에 맞게 계층적(hierarchy) 구조로 할당되게 되어있습니다.
위 그림을 보면 알 수 있듯, 인접한 호스트들의 IP는 왼쪽 bit들이 서로 유사합니다.
이는 longest prefix matching을 가능케 하는 부분입니다. (라우터는 포트마다 IP를 가지고 있습니다!)
longest prefix matching(가장 긴 접두사 일치)는 인터넷 프로토콜 네트워킹에서 라우터가 라우팅 테이블에서 항목을 선택하는 데 사용하는 알고리즘을 나타냅니다. 전달 테이블의 각 항목이 하위 네트워크를 지정할 수 있기 때문에 하나의 대상 주소가 둘 이상의 전달 테이블 항목과 일치할 수 있습니다.
서브넷(Subnet)
Isolated 네트워크로 라우터를 거치지 않고 도달할 수 있는 네트워크입니다. (= LAN)
위 그림의 서브넷의 개수는 3개인 것을 볼 수 있죠.
아래 그림의 200.23.16.0/23 에서 23은 서브넷 파트의 bit 수를 의미합니다.
서브넷 내에서의 각 호스트는 IP의 호스트 파트로 구분됩니다.
아래 그림에서 호스트 파트는 9bit이므로 512개의 호스트를 할당할 수 있습니다.
Hierarchical addressing
IP addressing의 할당 방식은 local에 대해 계층 구조를 가집니다.
즉, 더 가까운 호스트일수록 IP의 왼쪽 bit가 더 많이 유사해지고, 서브넷일 때 최고로 유사합니다.
이로 인해 위에서 언급한 longest prefix matching이 가능한 것입니다.
Longest prefix matching
포워딩은 어떤 방식으로 해야하냐의 문제를 봅시다.
초기 방식은 destination-based 포워딩으로 소프트웨어 단에서 if문을 사용하여 하나하나 비교해주는 방식이었습니다.
이는 매우 비효율적이겠죠?
따라서 하드웨어 단에서 동작하는 longest prefix matching 방식의 포워딩 테이블을 고안하게 되었습니다.
- IP와 테이블 내에서 가장 길게 매칭되는 목적지 주소 범위의 link interface를 찾아갑니다.
- 위 이미지의 *은 don't care을 의미합니다. 즉, 어떤 수가 되어도 상관없습니다.
- 예를 들어, 11001000 00010111 00010110 10100001는 0에, 11001000 00010111 00011000 10101010은 1에 매칭될 것입니다.
DHCP
호스트에게 네트워크를 일정시간 임대해주는 서버입니다.
즉 서브넷의 호스트들을 관리한다고 볼 수 있습니다.
호스트가 네트워크에 join하면 서버가 IP 주소를 동적으로 할당하며, 주소의 재사용이 가능합니다.
- 호스트가 DHCP discover 메시지를 브로드캐스트합니다. (optional)
- discover 메시지 : 클라이언트가 서버를 찾기 위해 브로드캐스팅합니다. → 탐색
- DHCP 서버가 DHCP offer 메시지로 응답합니다. (optional)
- offer 메시지 : 서버가 클라이언트에게 할당 후보 IP 주소를 제시합니다. → 제안
- 호스트가 DHCP request 메시지를 보냅니다.
- request 메시지 : 서버를 선택한 클라이언트가 원하는 구성을 요청합니다. → 요청
- 후보로 제시된 IP 주소의 사용을 요청합니다.
- IP 주소의 유효기간 연장을 요청합니다.
- request 메시지 : 서버를 선택한 클라이언트가 원하는 구성을 요청합니다. → 요청
- DHCP 서버가 DHCP ack 메시지를 보냅니다.
- ack 메시지 : 긍정 응답을 합니다. → 요청 수락
- IP 주소 뿐만 아니라 여러 다른 정보를 보낼 수 있습니다.
- ack 메시지 : 긍정 응답을 합니다. → 요청 수락
NAT
기존의 IPv4는 32bit 주소를 할당하는데, 사물인터넷 시대가 도래하면서 호스트 수가 기하급수적으로 늘어 32bit의 주소가 부족해지기 시작했습니다.
이를 해결하기 위해 두가지 방식이 등장했는데 하나는 IPv6, 하나는 NAT!
NAT은 IP address가 부족한 문제를 해결하며, 보안을 향상시킵니다.
NAT은 서브넷의 라우터에 NAT translation table이 존재하는데, 이는 라우터의 IP와 포트를 호스트의 IP, 포트로 맵핑해줍니다.
따라서 라우터 내 모든 호스트의 IP는 외부에 보이지 않게 되며, 외부에서는 맵핑되는 라우터의 IP, 포트를 목적지로 생각합니다.
그에 따라 라우터는 portnum의 크기인 16bit, 즉 65536개까지의 호스트를 하나의 IP만으로 맵핑할 수 있어, IP 부족의 문제가 크게 해소되는 것입니다.
IPv6
32bit의 기존 IP address는 너무 작기 때문에 128bit로 늘린 것을 말합니다.
따라서 IPv6의 데이터그램 헤더 크기는 기존 20bytes에서 40bytes로 늘었습니다.
위 이미지를 통해 볼 수 있듯이 IPv4에 비해 사라진 것들이 있습니다.
- checksum (라우터의 처리 속도를 위해)
- fragmentation / reassembly
- options
IPv6에 맞게 라우터를 일괄적으로 바꾸는 것은 사실상 불가능합니다.
따라서 터널링(Tunneling) 기법을 사용해서 차근차근 라우터를 바꾸는 방법을 이용합니다.
IPv6 format 자체를 IPv4 format으로 캡슐화하는 것을 말합니다.
.
.
.
이번 글은 이렇게 마무리하도록 하겠습니다.
다음 글에서는 네트워크 계층의 contol plane에 대해 알아봅시다 😁