데이터 링크 계층과 프로토콜
데이터 링크 계층은 하위 물리 계층(L1, 랜선이나 전파)에서 올라오는 의미 없는 전기 신호(0과 1의 나열)를 의미 있는 데이터 덩어리로 묶고 통제하는 역할을 합니다.
프레이밍(Framing)
물리 계층(랜선)을 타고 들어오는 것은 시작과 끝을 알 수 없는 101010… 형태의 무한한 전기 신호의 연속(Stream)입니다. 데이터 링크 계층은 이 신호의 흐름 속에서 범위를 지정하여 하나의 데이터 덩어리(Frame)로 경계를 짓는 작업을 수행합니다.
이 경계를 나누기 위해 다음과 같은 기법들을 고안했습니다.
문자 지향 프레이밍(Character-Oriented Framing)
과거 전화선을 모뎀에 꽂아 1:1로 통신하던 시절(PPP 프로토콜 등)에 주로 사용된 고전적인 방식입니다.
프레임의 시작과 끝에 특별한 패턴을 가진 제어 문자(FLAG 바이트)를 붙여 경계를 표시합니다.
바이트 채워넣기(Byte Stuffing)
전송하려는 순수 데이터(Payload) 안에 우연히 FLAG와 똑같이 생긴 바이트가 들어있다면, 수신자가 이를 ‘프레임의 끝’으로 오해할 수 있습니다. 이를 막기 위해 데이터 안의 FLAG 바로 앞에 탈출 문자(ESC)를 삽입하여 예외를 처리합니다. (프로그래밍 언어에서 문자열 내에 따옴표를 쓸 때 \"처럼 이스케이프 문자를 쓰는 것과 같은 원리입니다.)
비트 지향 프레이밍(Bit-Oriented Framimg)
라우터와 라우터를 전용선으로 연결하던 WAN 환경(HDLC 프로토콜 등)에서 사용된 방식입니다.
바이트 단위가 아니라 비트 단위로 경계를 나눕니다. 주로 시작과 끝을 알리는 플래그로 01111110 (1이 6개 연속) 패턴을 사용합니다.
비트 채워넣기(Bit Stuffing)
송신자는 데이터 안에 1이 연속으로 5개 등장하면, 무조건 강제로 0을 하나 끼워 넣습니다(11111 → 111110). 수신자는 1이 5개 연속으로 오고 뒤에 0이 오면 그 0을 빼버리고 원본을 복원합니다.
물리 계층 신호 기반 프레이밍
현재 전 세계의 LAN(유선 로컬 네트워크) 환경의 표준인 이더넷(IEEE 802.3) 에서 사용하는 현대적인 방식입니다.
데이터의 내용(Payload) 자체를 건드리지 않습니다. 대신 하드웨어(물리 계층) 수준에서 처리할 수 있는 특수한 전기 신호 패턴을 맨 앞에 덧붙여 프레임의 시작을 알립니다.
프리앰블(Preamble)과 SFD
프레임의 맨 앞에는 10101010이 7번 반복되는 7바이트의 프리앰블이 붙어 송수신기의 클럭 타이밍을 맞춥니다(예열). 그 직후 10101011이라는 1바이트의 SFD(Start Frame Delimiter) 가 등장하면, 수신자는 지금부터 진짜 목적지 MAC 주소와 데이터가 시작된다고 인식합니다.
- 프레임의 끝은 별도의 종료 플래그 없이, 전기 신호가 끊어지거나 상위 헤더에 명시된 ‘데이터 길이(Length)’를 보고 파악합니다.
프레임 길이 제한과 Jumbo Frame
이더넷은 페이로드의 최대 크기를 1500바이트(MTU, Maximum Transmission Unit) 로 제한하고 있습니다.
- 크기의 딜레마 : 프레임 크기가 너무 길면, 물리적 노이즈로 인해 중간에 단 1비트의 에러(CRC 오류)만 발생해도 그 거대한 프레임을 통째로 버리고 재전송해야 하므로 복구 비용이 커집니다. 반대로 너무 짧으면 실제 데이터 대비 헤더가 차지하는 용량(오버헤드) 비율이 커져 비효율적입니다.
- Jumbo Frame : AWS, GCP 같은 현대의 클라우드 데이터센터 내부는 케이블 품질이 좋아 에러가 거의 발생하지 않습니다. 따라서 내부 통신 효율을 극대화하기 위해 MTU를 9000바이트까지 늘려 한 번에 엄청난 양의 데이터를 실어 나르는 점보 프레임 설정을 활용합니다.
에러 탐지(Error Detection)
물리 계층(L1)을 통과하는 전기 신호나 광신호는 감쇠, 전자기장 간섭(EMI), 케이블 노후화 등으로 인해 필연적으로 $0$이 $1$로 바뀌는 비트 플립(Bit Flip) 을 겪습니다. 특히 네트워크에서는 단일 비트 오류보다 여러 비트가 뭉텅이로 훼손되는 버스트 에러(Burst Error) 가 빈번하게 발생합니다. 데이터 링크 계층은 훼손된 프레임이 상위 계층으로 올라가는 것을 막는 역할을 수행합니다.
FCS(Frame Check Sequence)
이더넷 프레임은 헤더(Header)와 페이로드(Payload)를 지나, 프레임의 맨 마지막 꼬리(Tailer)에 FCS라는 4바이트 크기의 물리적 공간을 둡니다.
IP나 TCP가 헤더 앞부분에 체크섬을 두는 것과 달리, L2가 꼬리에 검증 필드를 두는 이유는 ‘실시간 스트림 처리’ 때문입니다. 랜카드(NIC)는 프레임이 들어오는 족족 실시간으로 데이터를 읽으며 연산하고, 프레임이 끝나는 시점에 연산된 결괏값을 바로 덧붙이거나 검증하기 위해 트레일러 위치를 사용합니다.
순환 중복 검사(CRC, Cyclic Redundancy Check)
FCS 공간을 채우는 핵심 알고리즘이 바로 CRC입니다. CRC는 단순 덧셈(체크섬)이 아닌, 모듈로-2 연산(Modulo-2 Arithmetic, 배타적 논리합 XOR) 기반의 다항식 나눗셈을 사용합니다.
동작 매커니즘
- 생성 다항식 약속 : 송신자와 수신자는 통신 전 미리 생성 다항식(Generator Polynomial, $G(x)$) 을 비트열로 약속합니다. (현대 이더넷은 33비트 길이의 CRC-32 다항식을 사용합니다.)
- 송신자 연산(Division) : 송신자는 보낼 원본 데이터(MAC 헤더 + 페이로드) 뒤에 생성 다항식의 최고차항 수만큼 0을 덧붙인 거대한 이진수를 만듭니다. 이를 $G(x)$로 XOR 나눗셈합니다.
- 나머지 부착 : 나눗셈의 최종 나머지(Remainder, $R(x)$) 가 바로 CRC 값입니다. 송신자는 데이터 뒤에 $0$ 대신 이 $R(x)$를 채워 넣어(FCS 필드) 전송합니다.
- 수신자 검증 : 수신자는 도착한 전체 프레임(원본 데이터 + FCS)을 다시 $G(x)$로 나눕니다. 전송 중 단 1비트의 에러도 발생하지 않았다면 수학적으로 이 나눗셈의 나머지는 정확히 0이 떨어져야 합니다. 0이 아니면 프레임이 훼손된 것입니다.
패리티 비트보다 연산은 복잡하지만, 연속적으로 발생하는 버스트 에러(Burst Error)를 거의 100%에 가깝게 잡아내는 정확도를 가집니다. 랜카드(NIC)의 하드웨어 칩셋 단에서 처리되므로 지연(Latency)이 거의 없습니다.
이더넷(Ethernet)
이더넷은 OSI 7계층 중 물리 계층(L1) 과 데이터 링크 계층(L2) 에 걸쳐 동작하는 기술 규약입니다. 케이블의 규격부터 시작해 MAC 주소를 이용한 프레임 전달 방식까지 LAN 환경의 모든 것을 정의합니다.
Shared Media & CSMA/CD
초기 이더넷은 하나의 동축 케이블을 여러 대의 PC가 공유하는 버스(Bus) 토폴로지나 더미 허브(Hub)를 사용했습니다. 동시에 데이터를 보내면 신호가 엉키는 충돌이 발생했기에, CSMA/CD(반송파 감지 다중 접속 및 충돌 탐지) 라는 규칙을 도입했습니다.
- CS : 데이터를 보내기 전에 네트워크가 사용 중인지 확인합니다. (Carrier Sense)
- MA : 여러 장치가 네트워크를 공유하며 데이터를 전송합니다. (Multiple Access)
- CD : 충돌이 발생하면 잠시 기다린 후 데이터를 재전송합니다. (Collision Detection)
기기가 늘어닐수록 충돌 확률이 기하급수적으로 높아져 네트워크 성능이 심각하게 저하되는 반쪽짜리 통신(Half-Duplex)이었습니다.
Switched Fabric & Full-Duplex
지능형 장비인 L2 스위치(Switch) 를 각 포트마다 독립적인 차선을 깔아주었습니다. 이로써 송신과 수신을 동시에 할 수 있는 전이중 통신(Full-Duplex) 이 가능해졌습니다.
현대의 이더넷 환경에서는 물리적 충돌 자체가 일어날 수 없으므로, CSMA/CD 알고리즘은 사실상 폐기되었습니다. 이더넷은 충돌의 제약에서 벗어나 10Gbps, 100Gbps 이상의 초고속 매체로 발전할 수 있었습니다.
이더넷 프레임 구조
- Preamble & SFD (8byte) : 수신측 랜카드(NIC)의 클럭 주파수를 맞추기 위한
101010...형태의 예열 신호와 시작을 알리는 절취선입니다. (L1 계층 역할) - Destination / Source MAC Address (각 6byte) : 도착지와 출발지의 48비트 물리적 하드웨어 주소입니다. 스위치는 이 주소만 보고 패킷을 포워딩합니다.
- EtherType (2byte) : 페이로드에 담긴 상위 계층 프로토콜이 무엇인지(예: IPv4는
0x0800, ARP는0x0806) 명시하여 역다중화를 돕습니다. - Payload (46 ~ 1500byte) : 실제 상위 계층(IP 패킷)의 데이터가 담기는 공간입니다. 최대 크기를 MTU(Maximum Transmission Unit, 1500바이트) 로 엄격히 제한하여 한 기기가 매체를 독점하는 것을 막습니다.
- FCS (4byte) : 프레임의 훼손 여부를 검증하는 하드웨어 기반의 CRC-32 해시값입니다.
스위치(Switch)
과거의 더미 허브(Hub)는 1번 포트로 데이터가 들어오면 나머지 모든 포트로 데이터를 복사해서 전달했습니다(모든 포트로 브로드캐스트). 이로 인해 모든 PC가 하나의 충돌 도메인(Collision Domain) 에 묶여 성능 저하를 겪었습니다. 반면, 스위치는 들어온 데이터(프레임)의 MAC 주소를 읽고 해석하는 기능을 가지고 있습니다.
네트워크 트래픽을 통제하는 동작 원리
Learning: MAC 주소 학습
스위치는 전원이 켜지면 백지상태입니다. 하지만 특정 포트로 프레임이 들어오면, 프레임 헤더에 있는 출발지 MAC 주소(Souce MAC Address) 와 데이터를 보낸 포트 번호를 자신의 메모리에 기록합니다.
- 이 정보들이 쌓여 만들어지는 거대한 지도를 MAC 주소 테이블(또는 CAM 테이블) 이라고 합니다.
CAM(Content Addressable Memory)
스위치는 초당 수백만 개의 프레임을 처리해야 합니다. 소프트웨어 기반의 선형 탐색이나 해시 테이블을 사용하면 엄청난 지연이 발생합니다.
스위치 제조사들은 원가가 비싸지만 하드웨어 칩셋 단에서 $O(1)$의 속도로 한 번에 MAC 주소를 찾아낼 수 있는 특수 메모리인 CAM을 장착했습니다. 덕분에 스위치는 프레임이 들어오는 족족 회선 속도(Line-rate) 그대로 지연 없이 처리가 가능합니다.
Flooding: 모를 때는 브로드캐스트 후 학습
스위치가 목적지 MAC 주소를 자신의 테이블에서 찾을 수 없는 경우의 동작입니다. (초기 상태이거나, 브로드캐스트용 MAC 주소인 FF:FF:FF:FF:FF:FF일 경우)
이 때는 과거의 허브처럼 데이터가 들어온 포트를 제외한 나머지 모든 포트로 프레임을 복사해서 전송(Flooding) 합니다. 이를 통해 목적지 PC가 응답하면, 그 때 목적지의 MAC 주소를 학습하게 됩니다.
Forwarding & Filtering: 정확한 타겟팅
MAC 주소 테이블이 어느 정도 완성되면 스위치의 진가가 발휘됩니다.
- 포워딩 : 1번 포트로 들어온 프레임의 목적지 MAC 주소가 테이블에 적혀있다면, 기록된 포트로만 프레임을 스위칭(전달) 합니다.
- 필터링 : 목적지와 상관없는 다른 포트들로는 프레임이 넘어가지 못하게 차단하는 기능입니다. 이 필터링 덕분에 스위치의 각 포트는 독립적인 충돌 도메인을 갖게 되며, 여러 대의 PC가 동시에 데이터를 주고받아돋(전이중 통신, Full-Duplex) 전혀 충돌이 발생하지 않습니다.
Aging: 노후 데이터 삭제
PC의 전원이 꺼지거나 랜선을 뽑아 다른 포트에 꽂을 수도 있습니다. 따라서 스위치는 MAC 주소 테이블에 기록된 정보가 일정 시간(일반적으로 300초) 동안 갱신되지 않으면 해당 항목을 테이블에서 삭제합니다. 이를 통해 항상 최신의 네트워크 토폴로지 상태를 유지합니다.
MAC 주소(Media Access Control Address)
MAC 주소는 데이터 링크 계층(L2)에서 통신을 위해 랜카드(NIC, Network Interface Card)에 부여되는 물리적 주소입니다. 공장에서 하드웨어가 생산될 때 칩셋에 영구적으로 기록되어 나오기 때문에 BIA(Burned-In Address) 라고도 부릅니다.
MAC 주소의 48비트 구조
MAC 주소는 총 48비트(6바이트) 크기를 가지며, 일반적으로 00:1A:2B:3C:4D:5E처럼 16진수 12자리로 표현하고 콜론(:)이나 하이픈(-)으로 구분합니다. 이 48비트는 철저하게 두 부분으로 나뉘어 관리됩니다.
- OUI(Organizationally Unique Identifier, 앞의 24비트) : IEEE(국제전기전자공학회)에서 네트워크 장비 제조사(Apple, Cisco, Intel 등)에게 돈을 받고 할당해 주는 ‘제조사 고유 식별 번호’ 입니다. 이 앞자리만 봐도 해당 랜카드를 어느 회사에서 만들었는지 알 수 있습니다.
- UAA(Universally Administered Address, 뒤의 24비트) : 제조사가 자체적으로 자사의 제품에 순차적으로 부여하는 ‘기기 일련번호’ 입니다.
- 주소 공간 : 48비트 체계이므로 총 $2^{48}$(약 281조) 개의 고유한 주소를 생성할 수 있습니다.
주소 결정 프로토콜 ARP(Address Resolution Rrotocol)
ARP는 L3 논리 주소(IPv4)를 기반으로 L2 물리 주소(MAC)를 동적으로 알아내기 위해 설계된 프로토콜입니다.
ARP의 요청과 응답
기기가 통신을 시작하기 위해 상대방의 MAC 주소를 찾는 과정은 매우 직관적인 질의응답으로 이루어집니다.
- ARP Request(요청 - 브로드캐스트) : 송신자는 “IP 주소
192.168.1.10을 가진 기기는 자신의 MAC 주소를 응답하라”라는 내용의 ARP Request 패킷을 만듭니다. 이때 목적지 MAC 주소를 브로드캐스트 주소(FF:FF:FF:FF:FF:FF) 로 설정하여 같은 로컬 네트워크(서브넷)에 있는 모든 기기에게 전송합니다. - ARP Reply(응답 - 유니캐스트) : 브로드캐스트를 수신한 모든 기기는 패킷을 열어봅니다. 자신의 IP가 아니라면 조용히 패킷을 폐기(Drop)합니다. 하지만 목적지 IP와 자신의 IP가 일치하는 기기는 “그 IP가 접니다. 제 MAC 주소는
AA:BB:CC:DD:EE:FF입니다.”라는 내용의 ARP Reply 패킷을 만들어 송신자에게 유니캐스트(1:1) 로 정확히 되돌려줍니다.
ARP Cache Table
만약 패킷을 하나 보낼 때마다 네트워크 전체에 ARP Request(브로드캐스트)를 날린다면, 네트워크는 불필요한 트래픽(브로드캐스트 스톰)으로 금방 마비될 것입니다.
캐싱(Caching) : 이를 방지하기 위해 기기(PC, 라우터)는 한 번 알아낸 IP와 MAC 주소의 매핑 정보를 메모리 공간인 ARP 테이블에 일정 시간 동안 저장해 둡니다. (명령어 창에서
arp -a를 입력하면 확인할 수 있습니다.)에이징 (Aging) : 네트워크 토폴로지는 언제든 변할 수 있습니다(예: 기기 교체로 IP는 같지만 랜카드가 바뀐 경우). 따라서 ARP 테이블의 데이터는 일정 시간(보통 수 분)이 지나면 자동으로 삭제되어, 잘못된 MAC 주소로 데이터를 보내는 Stale 데이터 오류를 방지합니다.
차세대 프로토콜에서의 변화
주소 체계가 IPv4에서 IPv6로 넘어가면서, 네트워크에 엄청난 부하를 주는 브로드캐스트 기반의 ARP는 역사 속으로 사라졌습니다. IPv6에서는 ICMPv6 기반의 NDP(Neighbor Discovery Protocol) 가 ARP를 완전히 대체하여, 브로드캐스트 대신 멀티캐스트를 사용함으로써 네트워크 효율성과 보안을 향상시켰습니다.