Chapter 06링크 계층과 LAN

지금까지 우리는 네트워크 계층에서 IP 패킷이 어떻게 라우터들을 건너뛰며 전 세계를 가로지르는지 봤습니다. 그런데 그 한 칸 한 칸의 "건너뛰기" — 노트북에서 공유기까지, 공유기에서 통신사 장비까지, 라우터에서 다음 라우터까지 — 의 실제 운반은 누가 책임질까요? 답은 링크 계층(link layer)입니다. IP가 "서울에서 부산까지 가자"라고 큰 그림을 그린다면, 링크 계층은 "이 골목에서 다음 사거리까지 안전하게 가자"를 담당합니다. 케이블이든, 와이파이든, 광섬유든, 매체가 뭐든 간에 한 홉의 운명을 책임지는 일꾼이죠.

이번 장에서는 NIC(network interface card) 칩 안에서 일어나는 일부터, 같은 LAN(local area network) 안에서 호스트들이 서로를 찾는 ARP, 스위치가 어떻게 트래픽을 똑똑하게 분배하는지, 그리고 요즘 데이터 센터를 떠받치는 스파인-리프(spine-leaf) 토폴로지와 MPLS(multiprotocol label switching)까지 다룹니다. 길지만, 한 입씩 가볍게 베어물면 됩니다.

6.1 링크 계층의 역할

링크 계층의 일은 의외로 단순합니다. 한 노드에서 인접한 다음 노드까지 프레임(frame)을 안전하게 전달하기. "안전하게"가 무슨 뜻이냐면, 매체에 비트를 잘 실어 보내고, 깨진 비트는 잡아내고, 여러 호스트가 동시에 떠들면 충돌을 조정하는 일까지 포함합니다. IP가 우체국이라면 링크 계층은 동네 택배기사예요. 도시 간 이동은 IP가 알아서 하지만, 마지막 100미터를 어떻게 가져다줄지는 택배기사 몫이죠.

구체적으로 링크 계층이 제공하는 서비스는 다음과 같습니다.

  • 프레이밍(framing): 비트 스트림을 의미 있는 단위(프레임)로 자릅니다. 어디서 시작하고 어디서 끝나는지 표시해 줘야 수신측이 헷갈리지 않죠.
  • 매체 접근 제어(MAC, medium access control): 케이블 한 가닥을 여러 호스트가 공유한다면 누가 언제 말할지 정해야 합니다. 회의실 발언권 같은 거예요.
  • 신뢰성 있는 전달(선택): 일부 링크는 ACK까지 주고받으며 손실 복구를 합니다. 와이파이가 대표적. 반면 이더넷은 보통 안 합니다 — 어차피 케이블이라 손실이 거의 없으니 상위 계층(TCP)에 맡기죠.
  • 오류 검출/정정: 비트가 뒤집혔는지 알아내고, 가능하면 고쳐줍니다.
  • 흐름 제어: 송신측이 너무 빨라 수신측이 따라가지 못하면 속도를 늦추라고 신호합니다.

NIC 안에서 사는 계층

흥미로운 점은 링크 계층이 대부분 하드웨어로 구현된다는 거예요. 노트북의 이더넷 포트나 와이파이 칩 — 즉 NIC(network interface card), 다른 말로 어댑터(adapter) — 안에 작은 전용 칩이 들어 있고, 거기서 프레임 조립, CRC 계산, 매체 접근 결정이 일어납니다. OS는 그 칩에게 "이 패킷 좀 쏴줘"라고 부탁만 하면 끝. 덕분에 CPU는 다른 일을 할 수 있죠. 운영체제는 디바이스 드라이버를 통해 NIC와 대화하고, 네트워크 계층(IP)이 만든 데이터그램을 NIC에 넘겨줍니다. NIC는 그걸 프레임으로 감싸 매체로 내보내고, 반대로 들어온 프레임은 풀어서 IP로 올려보내고요.

한 입 메모. 같은 호스트라도 인터페이스마다 링크 계층은 따로 동작합니다. 노트북에 이더넷과 와이파이가 둘 다 켜져 있으면, 두 NIC가 각자 자기 매체에 맞는 프레임을 만들고 자기 MAC 주소를 갖죠. 그래서 ifconfig나 ip addr를 치면 인터페이스마다 MAC이 따로 나옵니다.

MAC 주소 vs IP 주소

여기서 학부생들이 가장 헷갈리는 지점. "IP가 있는데 왜 MAC이 또 필요해?" 좋은 질문입니다.

  • IP 주소네트워크 위치를 나타냅니다. 호텔 객실 번호 같은 거예요. 라우터들이 이걸 보고 어느 방향으로 보낼지 판단하죠. 호스트가 다른 네트워크로 옮기면 IP도 바뀝니다.
  • MAC 주소NIC 자체의 고유 식별자입니다. 출생증명서예요. 공장에서 박혀 나오고(이론상), 호스트가 어디로 옮겨도 안 바뀝니다. 6바이트(48비트)이고 보통 3c:22:fb:a1:5e:0c 같은 16진수로 표기합니다.

비유하자면 IP는 "호텔 304호"고 MAC은 "투숙객의 주민등록번호". 택배기사가 호텔 안에서 "304호 누구세요"하고 부르면, 그 사람은 오늘만 거기 묵을 뿐이죠. 다음 주엔 다른 호텔의 다른 호실이 될 수 있어요. 하지만 주민번호는 그대로. 이 두 주소가 어떻게 짝을 맞추는지가 6.4절의 ARP에서 다룰 핵심입니다.

주의. "MAC 주소는 영원히 안 바뀐다"는 거의 사실이지만, OS에서 임의로 바꿀 수 있습니다(MAC spoofing). 모바일 OS가 와이파이마다 무작위 MAC을 쓰는 것도 같은 메커니즘이에요. 프라이버시 보호 목적이죠.

6.2 오류 검출과 정정

케이블을 타고 가다 비트 하나가 0에서 1로 뒤집히면 어떻게 될까요? 그냥 두면 상위 계층까지 오염된 데이터가 올라가 큰일 납니다. 그래서 송신측은 데이터에 오류 검출 코드(EDC, error detection code)를 붙이고, 수신측은 이걸 검사해 깨진 프레임을 버립니다. 운이 좋으면 고치기까지 하죠. 학부 수업에서 다루는 대표 기법 셋을 살펴봅시다.

패리티 비트와 2D 패리티

가장 단순한 방법은 패리티 비트(parity bit)입니다. 데이터 비트에서 1의 개수가 짝수가 되도록(짝수 패리티) 끝에 0이나 1을 하나 더 붙이는 거예요. 수신측은 1의 개수를 세서 홀수면 "어, 오염됐네"하고 폐기. 단점은 명확합니다. 비트 두 개가 동시에 뒤집히면 패리티가 그대로라 못 잡아냅니다.

이걸 보강한 게 2차원 패리티(2D parity). 데이터를 격자로 배치하고 각 행과 열에 패리티를 붙입니다. 그러면 단일 비트 오류를 검출할 뿐 아니라 어느 행 어느 열에서 뒤집혔는지까지 알아내 정정할 수 있어요. 학부 실습에서 인기 있는 예제죠.

2D 패리티 예시 (짝수 패리티)

  데이터        행 패리티
  1 0 1 1  →  1
  0 1 1 0  →  0
  1 1 0 0  →  0
  0 0 1 1  →  0
  ─────────
  0 0 1 0  ← 열 패리티

  수신측이 (행 2, 열 3)에서 패리티 불일치를 보면
  바로 그 비트를 뒤집어 정정.

인터넷 체크섬

TCP/UDP/IP 헤더에 들어가는 인터넷 체크섬(internet checksum)은 더 간단합니다. 데이터를 16비트 워드들의 합으로 보고, 1의 보수 합을 구한 뒤 그 결과의 보수를 체크섬 필드에 넣어요. 수신측이 같은 방식으로 합치면 모두 1이 나와야 정상. 한 비트라도 어긋나면 어긋난 합이 나옵니다.

장점은 소프트웨어로 빠르게 계산 가능. 단점은 검출력이 약하다는 거예요. CRC만큼 든든하진 않지만, 어차피 링크 계층에서 CRC가 한 번 더 걸러주니 상위에서는 이 정도로 충분하다고 본 거죠.

CRC: 다항식 나눗셈으로 깔끔하게

이더넷·와이파이·블루투스가 죄다 쓰는 표준이 CRC(cyclic redundancy check)입니다. 핵심 아이디어는 데이터를 큰 이진수로 보고, 미리 정한 생성 다항식(generator polynomial) G(x)로 나눠서 나머지를 코드로 붙이는 거예요. 수신측이 같은 G로 나눠 나머지가 0이면 OK, 아니면 폐기.

왜 다항식이냐면, 비트열을 다항식 계수로 보고 모듈로-2 나눗셈을 하면 XOR만으로 끝나거든요. 회로로 구현하면 시프트 레지스터 몇 개로 끝. 즉 NIC 칩에서 와이어 속도(wire speed)로 계산 가능. 이게 CRC의 진짜 매력입니다.

CRC 직관

  데이터 D = 101110, 생성기 G = 1001 (x^3 + 1)
  D를 G의 차수만큼(3비트) 왼쪽 시프트 → 101110 000

      101110000  ÷  1001  (모듈로-2, XOR)
      1001
      ────
       0101 0000
        1001
        ────
         1000 00
         1001
         ────
            10 0   ← 나머지 = 100

  보낼 코드워드: D || R = 101110 100
  수신측이 같은 G로 나눠 나머지 0이면 통과.

이더넷이 쓰는 CRC-32는 32비트 나머지를 만들고, 표준 다항식으로 단일 비트 오류는 100% 검출, 짝수 비트 오류와 32비트 미만 버스트(burst) 오류도 거의 다 잡아냅니다. 그래서 "프레임이 통과했으면 깨끗하다"라는 가정을 안심하고 쓸 수 있는 거예요.

오류 검출과 정정의 차이. 검출은 "깨졌어!"만 알려주고, 정정은 "이 비트가 깨졌으니 이렇게 고쳐"까지 합니다. 정정에는 더 많은 잉여 비트가 필요해 비싸요. 그래서 보통 유선은 검출 후 재전송, 무선·우주통신처럼 재전송이 비싼 곳은 FEC(forward error correction)로 정정까지 함께 넣습니다.

6.3 다중 접근 프로토콜

케이블 한 가닥에 호스트가 여럿 매달려 있으면 누구든 아무 때나 떠들 수 있습니다. 그러다 두 명이 동시에 말하면? 신호가 섞여 알아들을 수 없게 되죠. 이게 충돌(collision)입니다. 이걸 막거나, 적어도 잘 수습하기 위해 만든 게 다중 접근 프로토콜(multiple access protocol)이에요. 크게 세 가지 철학이 있습니다.

채널 분할: 자원을 미리 쪼개기

가장 정직한 접근. 시간이나 주파수를 미리 나눠 각자에게 할당합니다.

  • TDMA(time division multiple access): 시간을 슬롯으로 쪼개 1번은 A, 2번은 B, ... 각자 자기 슬롯에서만 송신. 충돌 절대 없음. 단점은 할 말 없는 사람도 슬롯을 차지해 낭비가 생깁니다.
  • FDMA(frequency division multiple access): 주파수 대역을 쪼개 각자 다른 채널을 씀. 라디오 방송이 대표. 역시 충돌 없지만, 이용률이 낮을 때 비효율.

두 방식 다 트래픽이 일정하고 호스트 수가 정해진 환경(전통 전화망, 일부 셀룰러)에서 강해요. 인터넷처럼 트래픽이 폭발적으로 들쭉날쭉한 곳에선 답답하죠.

랜덤 액세스: 일단 보내고 충돌 나면 수습

"빈 시간만 골라 쓸까? 미리 약속하긴 귀찮아." 이게 랜덤 액세스의 철학입니다. 학부 수업에서 단계별로 발전을 보여주는 게 다음 라인업이에요.

슬롯 알로하(slotted ALOHA)

시간을 균등 슬롯으로 나누고, 보낼 게 있으면 다음 슬롯 시작에 맞춰 송신. 충돌 나면 다음 슬롯에서 동전 던져 확률 p로 재시도. 분석상 최대 효율은 약 0.37(=1/e). 절반도 못 쓴다는 뜻이지만, 단순함의 미덕이 있죠.

CSMA: 일단 들어보고 보내자

좀 더 똑똑해진 게 CSMA(carrier sense multiple access). "보내기 전에 매체 들어보고, 누가 떠들고 있으면 잠깐 기다려." 사람도 회의실에서 그렇게 하잖아요. 그래도 전파 지연 때문에 "들었을 땐 비어 있는데, 사실은 누가 막 시작한" 경우가 생겨 충돌은 0이 아닙니다.

CSMA/CD: 충돌 나면 즉시 멈춰

유선 이더넷이 오래 쓴 게 CSMA/CD(collision detection). 송신 중에도 매체를 모니터링해서 충돌이 감지되면 즉시 송신을 중단하고, 다른 호스트들에게 "충돌이야!" 신호를 짧게 보낸 뒤(jam signal) 무작위 시간 후 재시도해요. 재시도 간격은 이진 지수 백오프(binary exponential backoff)로, 충돌 횟수 n에 따라 0~(2^n − 1) 슬롯 중 무작위로 골라 기다립니다. 충돌이 잦을수록 더 오래 양보하는 거죠. 사회적 동물 같은 알고리즘.

CSMA/CA: 충돌을 처음부터 피하자

무선(와이파이)에선 충돌을 감지하기가 어렵습니다. 왜냐하면 송신 중인 자기 신호가 너무 강해 다른 신호를 못 듣고, 또 두 호스트가 서로의 신호를 못 들어도 AP는 둘 다 들리는 숨겨진 노드(hidden terminal) 문제가 있거든요. 그래서 무선은 CSMA/CA(collision avoidance)로 갑니다. 매체가 비면 일정 시간(IFS) 기다린 뒤 무작위 백오프 슬롯을 카운트다운하고, 다 세는 동안 매체가 계속 비어 있으면 송신. 추가로 RTS/CTS 핸드셰이크로 "내가 좀 보낼게" → "응, 길 비켜놨어"를 사전에 합의하기도 합니다.

구분CSMA/CDCSMA/CA
주요 환경유선 이더넷(허브 기반)무선 LAN(와이파이)
충돌 감지송신 중 매체 모니터링으로 감지감지 어려움 — 회피에 집중
충돌 후 동작즉시 중단 → jam → 백오프 → 재전송ACK 미수신을 충돌로 간주 → 재전송
사전 협상없음RTS/CTS(옵션)로 채널 예약
오늘날 비중스위치 보급으로 거의 사용 안 됨여전히 핵심
왜 CSMA/CD는 점점 잊히고 있을까? 풀 듀플렉스(full-duplex) 스위치가 대세가 되면서 호스트와 스위치 사이가 점대점이 되어 충돌 자체가 일어날 일이 거의 없거든요. 이론상 흥미로운 알고리즘이지만 실무 비중은 줄었습니다.

토큰 패싱: 발언권을 돌리자

한때 IBM의 토큰 링(Token Ring)이 쓰던 방식. 작은 메시지(토큰)가 노드들 사이를 빙빙 돌고, 토큰을 가진 노드만 송신할 수 있어요. 충돌이 원천적으로 없고 공정하지만, 토큰을 잃거나 노드가 죽으면 복구가 까다로웠죠. 이더넷에 밀려 거의 사라졌습니다.

6.4 스위치 LAN

오늘날 우리가 "이더넷 LAN"이라고 부르는 건 사실상 스위치(switch)들이 별모양으로 호스트를 잇는 구조입니다. 허브가 멍청한 멀티탭이라면, 스위치는 똑똑한 콘센트예요. 같은 회의실에 있는 사람끼리도 누가 누구한테 말 걸지를 알아서 라우팅해 줍니다. 이 절은 이더넷의 프레임부터 ARP, 스위치 학습, VLAN까지 한 흐름으로 봅니다.

이더넷 프레임 형식

이더넷이 매체 위로 던지는 단위가 프레임입니다. 골격은 다음과 같아요.

이더넷 II 프레임 형식

   8 byte    6 byte     6 byte    2 byte    46~1500 byte    4 byte
  ┌────────┬─────────┬─────────┬────────┬───────────────┬────────┐
  │ 프리앰블│ 목적지  │ 송신지  │ 타입/  │   페이로드    │  CRC   │
  │ + SFD  │  MAC    │  MAC    │  길이  │ (IP 데이터그램)│        │
  └────────┴─────────┴─────────┴────────┴───────────────┴────────┘
        ▲                          ▲                        ▲
        │                          │                        │
   비트 동기화용             0x0800=IPv4              CRC-32로 무결성 검사
   동일 패턴 반복            0x86DD=IPv6
                             0x0806=ARP
  • 프리앰블(preamble): 8바이트의 동기화 패턴. 수신측 클럭이 비트 경계를 잡도록 도와줍니다.
  • 목적지/송신지 MAC: 6바이트씩. 누구한테, 누구로부터.
  • 타입/길이 필드: 0x0800이면 페이로드는 IPv4, 0x0806이면 ARP. 위쪽에 어떤 프로토콜로 올려줘야 하는지 알려주는 다중화 키예요.
  • 페이로드: 최소 46바이트, 최대 1500바이트(이게 그 유명한 MTU). 짧으면 패딩으로 채웁니다.
  • CRC-32: 무결성 검사. 깨졌으면 조용히 폐기 — 이더넷은 재전송 안 합니다.

ARP: 옆집 누구야 묻기

호스트가 같은 LAN의 다른 호스트에게 IP 패킷을 보내려면 그 IP에 해당하는 MAC을 알아야 합니다. 그래야 이더넷 프레임의 목적지 MAC을 채울 수 있죠. ARP(address resolution protocol)가 이 짝짓기를 담당합니다. 동작은 단순하면서도 우아해요.

ARP 교환 시퀀스 (192.168.1.10 → 192.168.1.20에게 보내고 싶음)

  Host A (192.168.1.10)         스위치/LAN          Host B (192.168.1.20)
        │                            │                       │
        │  who-has 192.168.1.20 ?    │                       │
        ├───────브로드캐스트────────▶│ ────────────────────▶ │
        │  목적지 MAC = ff:ff:ff:ff:ff:ff                    │
        │                            │                       │
        │                            │   I am 192.168.1.20,  │
        │                            │   MAC=AA:BB:CC:11:22:33
        │ ◀──────────유니캐스트──────┼ ◀──────────────────── │
        │                            │                       │
        │  ARP 캐시에 저장 (TTL ~분 단위)                    │
        │  이제 IP 패킷을 이 MAC으로 감싸 송신                │
        ▼                            ▼                       ▼

핵심 포인트:

  • 요청은 브로드캐스트(목적지 MAC 모두 1)로 LAN 전체에 퍼집니다.
  • 응답은 해당 IP의 주인만 유니캐스트로 답합니다.
  • 받은 매핑은 ARP 캐시에 저장해 두고, 일정 시간(보통 수 분) 동안 재사용합니다.

리눅스 터미널에서 ARP 테이블은 이렇게 보입니다.

$ ip neigh show
192.168.1.1   dev wlp3s0 lladdr 8c:7f:3b:0a:91:dd REACHABLE
192.168.1.20  dev wlp3s0 lladdr aa:bb:cc:11:22:33 STALE
192.168.1.55  dev wlp3s0 lladdr 24:0a:c4:e2:5b:18 REACHABLE

그럼 다른 LAN의 호스트에게 보낼 땐? 그땐 ARP가 기본 게이트웨이(default gateway)의 MAC을 알아냅니다. 즉 이더넷 프레임의 목적지 MAC은 라우터, 안에 든 IP 패킷의 목적지 IP는 진짜 목적지. 라우터가 받아 풀어보고 다음 홉으로 넘기는 거죠. 한 홉마다 MAC은 새로 갈리지만 IP는 그대로 — 이게 5장에서 본 라우팅의 단면이에요.

ARP 스푸핑. 같은 LAN의 누군가가 거짓 ARP 응답을 마구 뿌려 "내가 게이트웨이야"라고 속이면, 트래픽이 그 사람을 거쳐 가게 됩니다. 같은 카페 와이파이를 의심해야 하는 이유. 그래서 회사 LAN에선 동적 ARP 검사(DAI) 같은 보안 기능을 켭니다.

스위치의 자기학습

스위치는 어떻게 "이 MAC은 1번 포트에서 들어오니까 그쪽으로 보내야지"를 알까요? 누가 알려주는 게 아니라 자기학습(self-learning)합니다. 알고리즘은 한 줄로 가능해요.

  1. 프레임이 어떤 포트로 들어오면, 그 프레임의 송신지 MAC들어온 포트 번호를 표(MAC 주소 테이블)에 기록.
  2. 같은 프레임의 목적지 MAC이 표에 있으면 그 포트로만 전달(forward).
  3. 없으면 들어온 포트를 제외한 모든 포트로 플러딩(flood). 어차피 정답이 어디 있는지 모르니 일단 다 뿌려보고, 응답이 돌아오면 학습.

예를 들어 4포트 스위치의 MAC 주소 테이블은 시간이 지나면 이렇게 채워집니다.

switch# show mac address-table

VLAN  MAC Address         Type      Port
----  ------------------  --------  -------
  1   3c:22:fb:a1:5e:0c   DYNAMIC   Gi0/1
  1   aa:bb:cc:11:22:33   DYNAMIC   Gi0/2
  1   8c:7f:3b:0a:91:dd   DYNAMIC   Gi0/3
  1   24:0a:c4:e2:5b:18   DYNAMIC   Gi0/4

Total entries: 4 (aging time: 300s)

일정 시간 트래픽이 없으면 항목이 만료(aging)되어 사라집니다. 호스트가 다른 포트로 옮기면 새 위치에서 곧 학습되고요. 즉 스위치는 플러그 앤 플레이예요. 관리자가 설정 안 해도 알아서 굴러갑니다.

스위치 vs 라우터 vs 허브

이 셋이 헷갈린다면 다음 표가 정리해 줍니다.

허브(hub)스위치(switch)라우터(router)
계층1계층(물리)2계층(링크)3계층(네트워크)
주소 인식없음 — 그냥 비트 복사MAC 기반 전달IP 기반 전달
충돌 도메인전체 공유 → 충돌 발생포트마다 분리인터페이스마다 분리
브로드캐스트 도메인전체 공유VLAN 단위로 공유인터페이스마다 분리
설정없음거의 자동(자기학습)라우팅 프로토콜 등 설정 필요
실무 위치박물관행LAN의 표준네트워크 간 경계

VLAN: 가상 LAN으로 쪼개기

물리적으로 같은 스위치에 꽂혀 있어도 논리적으로 다른 LAN처럼 분리하고 싶을 때가 있습니다. 임원실과 회의실, 게스트 와이파이와 직원 와이파이 같은 거요. VLAN(virtual LAN)이 이걸 해줍니다. 스위치 포트마다 VLAN ID를 붙이고, 다른 VLAN끼리는 같은 스위치 안에 있어도 통신이 안 되도록 막아요. 트렁크(trunk) 포트로 여러 스위치를 잇고, 프레임에 802.1Q 태그(4바이트)를 박아 어느 VLAN 소속인지 표시합니다. VLAN 사이를 통신하려면 결국 라우터(혹은 L3 스위치)가 끼어 IP 라우팅을 해줘야 해요.

6.5 데이터 센터 네트워크

요즘 데이터 센터에는 서버가 수만 대씩 들어찹니다. 이걸 어떻게 연결할까요? 옛날엔 전통 트리(tree) 토폴로지를 썼습니다. 잎(leaf)에 서버를, 가지에 스위치를, 꼭대기에 코어(core) 스위치를 두는 모양. 직관적이지만 결정적인 단점이 있어요. 위로 갈수록 트래픽이 몰리고(over-subscription), 코어 스위치 한 대가 죽으면 절반이 마비됩니다. "사장님이 출근 안 하시면 회사가 멈춰요" 같은 구조죠.

그래서 등장한 게 팻트리(fat-tree)와 일반화한 Clos 토폴로지. 위쪽 링크의 대역폭을 더 굵게 만들거나, 여러 경로를 동등하게 깔아 누구든 누구한테든 차이 없이 갈 수 있게 합니다.

스파인-리프: 데이터 센터의 표준

오늘날 데이터 센터의 사실상 표준은 스파인-리프(spine-leaf)예요. 두 계층뿐입니다. 모든 서버는 리프 스위치에 꽂히고, 모든 리프는 모든 스파인 스위치와 연결됩니다. 리프끼리 직접 연결은 없어요. 리프 → 스파인 → 다른 리프, 정확히 두 홉.

스파인-리프 (2계층 Clos)

           ┌────┐  ┌────┐  ┌────┐  ┌────┐
   Spine  │ S1 │  │ S2 │  │ S3 │  │ S4 │   ← 스파인 평면
           └─┬──┘  └─┬──┘  └─┬──┘  └─┬──┘
             │   ╲   │   ╳   │   ╲   │
             │    ╲ ╳    ╳    ╳ ╲    │   (모든 리프-스파인이 풀-메시)
             │    ╳ ╲   ╱ ╲   ╱ ╲    │
           ┌─┴──┐  ┌─┴──┐  ┌─┴──┐  ┌─┴──┐
   Leaf   │ L1 │  │ L2 │  │ L3 │  │ L4 │   ← 리프(ToR) 스위치
           └─┬──┘  └─┬──┘  └─┬──┘  └─┬──┘
             │       │       │       │
           서버들  서버들  서버들  서버들

이 구조의 장점은:

  • 예측 가능한 지연. 어떤 서버에서 어떤 서버로 가든 정확히 두 홉. 동서(east-west) 트래픽이 많은 클라우드 워크로드에 이상적.
  • 대역폭 확장이 깔끔. 스파인을 한 대 더 추가하면 전체 양방향 대역폭이 일정 비율로 늘어요. 코어 스위치를 더 큰 걸로 교체할 필요 없음.
  • 장애에 강함. 스파인 한 대 죽어도 나머지 N−1대로 나눠 흐릅니다. 서비스가 멈추는 게 아니라 살짝 느려질 뿐.

ECMP: 같은 비용이면 다 쓰자

리프에서 스파인 가는 길이 N개 있다면 어떻게 분산할까요? 정답은 ECMP(equal-cost multi-path). 라우팅 프로토콜이 동일 비용을 갖는 N개의 다음 홉을 모두 등재하고, 패킷마다 5튜플(소스/목적지 IP, 포트, 프로토콜)을 해시해 N개 중 하나로 보내는 거예요. 같은 흐름의 패킷은 항상 같은 경로로 가서 순서가 보장되고, 흐름들 사이에선 부하가 분산됩니다. TCP가 좋아하는 패턴.

물론 ECMP도 완벽하진 않아요. 한 흐름이 거대하면 그 경로만 막히는 elephant flow 문제가 있고, 해시 충돌로 두 큰 흐름이 같은 경로로 몰리기도 합니다. 그래서 동적 부하 분산 기법(예: flowlet 단위 재해시)이 발전 중이에요.

왜 전통 트리는 데이터 센터에서 사라졌을까? 클라우드 워크로드는 사용자→서버 트래픽(north-south)보다 서버→서버 트래픽(east-west)이 훨씬 많거든요. MapReduce, 마이크로서비스, 분산 학습 다 그렇죠. 트리에선 동서 트래픽이 죄다 코어를 거쳐 올라갔다 내려와야 합니다. 스파인-리프는 동서를 평평하게 처리하도록 설계됐어요.

6.6 MPLS와 링크 계층 가상화

마지막 절은 살짝 어른 동네 이야기. MPLS(multiprotocol label switching)는 통신사 백본(backbone)에서 오랫동안 사용된 기술인데, 학부 수업에서 자주 언급되는 이유가 있어요. "OSI에 안 맞는 어중간한 위치"라서 재밌거든요. 보통 2.5계층이라 부릅니다. 이더넷 프레임과 IP 패킷 사이에 끼어들어 라우터의 일을 절반쯤 대신해 줘요.

레이블 스위칭의 아이디어

전통 IP 라우팅은 라우터가 패킷마다 목적지 IP로 가장 긴 접두사 매칭(LPM)을 해 다음 홉을 정합니다. 이게 비싸요 — 큰 라우팅 테이블에서 매번 검색해야 하니까. MPLS는 입구 라우터(ingress, LER)에서 레이블(label)이라는 짧은 정수 태그를 패킷에 붙입니다. 백본의 코어 라우터(LSR)들은 레이블만 보고 단순 인덱싱으로 다음 홉을 정해요. 그리고 그 자리에서 레이블 스왑(swap)으로 다음 라벨로 갈아끼우면서 다음 라우터로 보냅니다. 출구(egress)에서 레이블을 떼고 일반 IP로 복귀.

MPLS 레이블 헤더 (4바이트)

    20 bit              3 bit   1 bit    8 bit
  ┌──────────────────┬──────┬───────┬─────────┐
  │      Label       │ TC   │   S   │   TTL   │
  └──────────────────┴──────┴───────┴─────────┘
                       ▲       ▲
                  트래픽 클래스  스택 바닥 표시(Stack=1)


  패킷이 백본을 지나는 모습
   ─────────────────────────────────────────────
   [ETH][L=17][IP][...]  →  LER1(push, swap to 31)
   [ETH][L=31][IP][...]  →  LSR (swap to 88)
   [ETH][L=88][IP][...]  →  LSR (swap to 22)
   [ETH][L=22][IP][...]  →  LER2(pop, IP 라우팅 복귀)
   [ETH][IP][...]

왜 이게 매력적인가

레이블 스위칭이 주는 진짜 가치는 다음과 같아요.

  • 트래픽 엔지니어링(TE). IP 라우팅은 "최단 경로"만 보지만, MPLS는 운영자가 임의의 경로를 미리 깔 수 있습니다. "이 흐름은 부산 거쳐 광주로, 저 흐름은 직진" 같은 명시적 경로(LSP) 설계가 가능. 백본의 링크 활용률을 균등하게 만드는 데 결정적이에요.
  • VPN과 가상화. 같은 백본 위에서 고객 A, B, C의 트래픽을 레이블로 격리할 수 있어요. MPLS L3VPN이 이걸 합니다.
  • 고속 처리. 짧은 정수 인덱싱이라 하드웨어가 빠르게 처리. 다만 요즘 라우터의 LPM 가속도 빨라져서 이 차이는 옛날만큼 결정적이지 않아요.
  • 다양한 페이로드 운반. "Multiprotocol"이라는 이름답게, 위에 IPv4/IPv6/이더넷 프레임 뭐든 얹을 수 있습니다. 그래서 통신사들이 백본을 통합할 때 즐겨 썼죠.

2.5계층이라는 위치

MPLS는 IP보다 아래(IP 패킷을 통째로 페이로드로 받음)에 있고, 이더넷보다 위(이더넷 프레임 안에 들어감)에 있습니다. 그래서 2.5계층이라는 별명이 붙었어요. 라우팅도 하고 스위칭도 하는, 둘 사이의 다리. 학부 시험에서 "MPLS는 몇 계층입니까?"가 나오면 "정확히는 2.5, 동작은 라우팅과 스위칭 사이"라고 답하면 멋집니다.

SD-WAN과 SR(segment routing)의 부상. 최근에는 MPLS-TE의 복잡한 시그널링(LDP/RSVP-TE)을 단순화한 세그먼트 라우팅(SR-MPLS, SRv6)이 백본에서 영역을 넓히고 있어요. 컨트롤러가 경로를 결정하고 헤더에 세그먼트 리스트만 박아 보내는 SDN 친화적 접근. 본질은 같은 레이블/태그 기반이지만 운영이 훨씬 깔끔합니다.

한 줄 요약

  • 링크 계층은 한 홉의 운반 책임자. NIC 안에 거의 다 들어 있고, MAC은 NIC의 평생 ID, IP는 호스트의 현 위치.
  • 오류는 패리티 → 체크섬 → CRC 순으로 정교해지고, 이더넷·와이파이의 표준은 CRC-32. 다항식 나눗셈이 시프트 레지스터 하나로 끝나는 게 매력.
  • 다중 접근은 채널 분할(낭비 있음)·랜덤 액세스(충돌 수습)·토큰 패싱(공정하지만 사라짐)의 셋. 유선은 CSMA/CD에서 풀 듀플렉스로, 무선은 CSMA/CA로.
  • 스위치는 자기학습으로 MAC 테이블을 채우고 포트별 전달을 합니다. ARP는 IP↔MAC 짝짓기, VLAN은 같은 스위치 안에 논리적 LAN을 여럿 만들기.
  • 데이터 센터는 전통 트리 대신 스파인-리프 Clos가 표준. ECMP로 다중 경로 부하 분산, 동서 트래픽에 친화적.
  • MPLS는 2.5계층 레이블 스위칭으로 트래픽 엔지니어링과 VPN을 가능하게 함. 본질은 "IP보다 빠른 단순 인덱싱과 운영자 통제권".