라우터란?
논리적으로 분리된 망, 혹은 물리적으로 분리된 망 사이를 지나가야 하는 패킷들에게 경로를 뽑아 자기가 아는 최상의 경로를 찾아낸 뒤 다른 망으로 패킷을 보내주는 역할을 하는 기계이다.
좀 쉽게 풀이한다면, 상위 통신망과 하위 통신망 사이를 중계해주는 기계라고 볼 수 있다. 라우터는 자신을 거쳐가는 모든 IP 패킷의 헤더를 검사하여 적절한 곳으로 전송하게 된다.
라우터의 구성요소와 내부구조
라우터의 내부 구조 살펴보기
라우터는 크게 아래 4가지 요소로 구성된다.
- 입력 포트
- 스위치 패브릭
- 출력 포트
- 라우팅 프로세서
아래에서 이러한 요소들을 자세하게 알아보자
라우터 입력 포트에서의 처리
입력 포트에서는 탈중앙화, 분산된 작동을 한다. IP 헤더 필드값을 사용하여 입력 포트 메모리 내 fowarding 테이블을 사용하여 출력 포트를 검색한다. 이는 라우터 내부의 공용 테이블을 사용하는것이 아니라 입력포트 내에서 처리하며, 이를 lookup (검색)이라고한다.
그리고 스위치 구조 (패브릭)에 패킷을 보내줘야하는데 스위치 패브릭의 처리 속도가 느려 이미 라인을 사용중이라면 대기가 필요하다. 이를 위해 입력 포트에서는 스위치 패브릭으로 패킷을 전송하기 위한 큐잉이 발생할 수 있다.
목적지 주소 기반 포워딩
라우터의 입력 포트에서 목적지 주소 기반 포워딩이라는 IP 주소만 패킷을 어느 포트로 보낼지 결정하는 간단한 경우를 가정해보자. 32비트 IP 주소의 경우, 포워딩 테이블을 억지로 구현한다면 모든 가능한 목적지 주소마다 하나의 엔트리가 필요할 것이다. 따라서 40억 개 이상의 가 능한 주소가 있어야 하므로 이 옵션은 불가능하다.
이 문제를 어떻게 처리할 수 있는지에 대한 예로서 라우터 0에서 3까지의 4개의 링크가 있으며 그 패킷을 다음과 같이 링크 인터페이스로 전달한다고 가정해보자. 이 경우 40억개의 엔트리가 아니라 4개면 충분하다.
이런 형식의 포워딩 테이블에서 라우터는 패킷의 목적지 주소의 prefix 를 테이블의 엔트리와 매칭하여 해당 링크로 전송한다.
예를 들어 설명하자면 목적지 주소가 " 11001000 0001011 00011000 10101010" 이라고 한다면 이 주소의 앞 21번째 비트 프리픽스가 테이블의 첫 번째 엔트리 링크 인터페이스 0으로 전송하게 된다. 만약 0, 1, 2 인터페이스의 엔트리와 매칭되지 않으면 인터페이스 3으로 가게되는 것이다.
이때 고려해야할 점은 예로 들었던 "11001000 0001011 00011000 10101010"은 2번째와 3번째 모두 매칭되는 것으로 생각할 수 있다. 다수의 매치가 있을 때는 라우터는 최장 프리픽스 매칭 규칙 (longest prefix matching rule)을 사용한다. 즉, 테이블에서 가장 긴 매치 엔트리를 찾아 해당하는 링크 인터페이스로 패킷을 보내게 되는 것이다. 위 예제의 경우 2번째 엔트리인 링크 인터페이스 1로 전송한다.
스위칭 패브릭 Switching Fabrics
스위치 구조는 패킷이 입력포트에서 출력포트로 실제로 스위칭되는 구조를 통과하므로 라우터의 핵심이라고 할 수 있다.
스위칭 페브릭은 어떠한 구조로 구성되어 있나?
- 메모리를 통한 스위칭
- 버스를 통한 스위칭
- 상호연결 네트워크를 통한 스위칭
위 구조의 스위치들을 알아보도록 하자.
메모리를 통한 스위칭
가장 단순한 초기의 라우터는 프로세서를 직접 제어해서 입력과 출력 포트 사이에서 패킷을 스위칭 하였다. 일반적인 컴퓨터의 I/O와 같이 동작하며 입력 포트로 도착한 패킷은 메모리에 복사되어 프로세서가 포워딩 테이블에서 출력포트를 결정한 다음 출력으로 전송하는 방식이다.
이러한 메모리 방식은 입력과 출력이 공유 시스템 버스를 통해 한 번에 하나의 메모리 읽기쓰기 작업이 가능하다. 한 패킷이 2 번씩 차지하기 때문에 최대 출력은 기존 버스 속도의 절반이다. 비효율적인 방법으로 더 이상 사용하지 않는다.
버스를 통한 스위칭
이 접근 방식에서 입력포트는 라우팅 프로세서의 개입 없이 공유 버스를 통해 직접 출력 포트로 패킷을 전송한다.
이는 미리 준비된 입력 포트 내부의 레이블이 로컬 풀력 포트를 나타내는 패킷으로 전송한다. 모든 패킷이 하나의 버스를 건너가야 하므로, 라우터의 교환 속도는 버스 속도에 의해 제한된다.
상호 연결 네트워크를 통한 스위칭
동시에 여러 개의 패킷을 병렬적으로 보낼 수 있다. 다른 입력포트에서 다른 출력포트로 가는 N개의 패킷은 동시에 전송가능하다. 다만 동일한 출력포트로 보내지는 경우 대기가 필요하다.
입력 포트의 큐잉
라우터에서는 큐잉이 발생하는데 이는 실제로 어디서 일어나는 것일까. 패킷 큐는 출력 포트와 입력 포트 모두에서 형성될 수 있다. 먼저 입력 포트의 큐잉을 살펴보자
지연없이 구조를 통해 도착하는 모든 패킷을 전송하기에 스위치 구조가 입력 라인 속도에 비해 충분히 빠르지 않으면 어떻게 되는가? 스위치 패브릭이 느리면 입력 큐잉이 발생한다.
진파랑 패킷이 큐잉되면서 연파랑 패킷은 갈 수 있지만 blocked 되었다. 라인의 앞쪽에서 다른 패킷이 막고 있으므로 입력 큐에서 대기중인 패킷은 사용할 출력 포트가 사용 중이지 않아도 스위치 구조를 통해 전송되기 위해 기다려야한다. 이를 Head-of-the-Line (HOL) Blocking 이라고 한다.
이는 NR (포트 갯수 x 라인 전송률) 속도의 스위치 패브릭으로 해결가능하다.
출력 포트의 큐잉
출력 포트에서 큐잉이 발생할 경우 NR 속도의 스위치 패브릭으로 해결이 불가능하다. 나가는 속도는 라인의 전송률 R로 고정되어 있기 때문에 도착한 패킷은 출력 큐에서 대기해야만 한다. 결국 대기 중인 패킷의 수가 출력 포트에서 사용가능한 메모리를 다 소모할 만큼 충분히 많아질 수 있다.
들어오는 패킷을 저장하는 메모리가 충분하지 않을 경우 도착한 패킷을 삭제 (Drop-Tail) 하거나 이미 대기중인 하나 이상의 패킷을 우선순위(priority)에 따라 제거하여 새로 도착한 패킷을 저장하기 위한 공간을 확보해야한다. (AQM, active queue management 알고리즘) 어떤 경우에는 버퍼가 차지 전에 송신자에게 혼잡 신호를 제공하는이 바람직할 수 있다. (ECN, RED)
큐잉된 패킷의 전송 순서를 정하기 위한 패킷 스케줄링이 존재한다.
얼마나 많은 버퍼가 요구되는가?
불일치가 지속되는 시간이 길어질수록 큐는 더 길어지며, 결국 버퍼가 가득차게 될 것이다. 그렇다면 포트에 얼마나 많은 버퍼를 설정해야할까? 많을수록 좋은 것이 아닐까? 이에 대해 알아보도록 하자.
몇년 동안 퍼버 크기에 대한 규칙은 링크 용량이 C일 때, 버퍼링의 양 B은 RTT 와 같아야한다를 기준으로 하였다. 좀 더 최근의 이론과 실험에서는 많은 수의 독립적인 TCP 흐름이 링크를 통과할 때, 필요한 버퍼링은 B = RTT * C / N^(1/2) 이라고 제안하고 있다.
다만 버퍼가 클수록 패킷 도착 속도의 변동을 흡수하여 손실을 감소하기에 다다익선이 아닌가라는 의구심을 품을 수 있다. 하지만 버퍼가 적정선 이상 커진다면 bufferbloat 버퍼블로트 라는 문제가 발생할 수 있다.
라우터가 과도하게 큰 버퍼를 사용하는 경우 매우 속도가 빠른 네트워크라 할지라도, 패킷 지연(큐잉지연)으로 인해 VoIP, 온라인 게이밍, 심지어는 일반적인 웹 서핑 등 수많은 상호작용 서비스의 실질적인 사용이 불가능하게 될 수 있다. packet lost을 줄이기 위해 버퍼를 늘리면 RTT, cwnd, 지연시간이 늘어나며 악순환된다는 것이다.