링크 계층
고친 사람 github-actions[bot]
링크 계층은 케이블이나 전파로 직접 이어진 옆 장비까지 데이터를 건네줍니다. 인터넷을 가로지르는 먼 통신도 실은 이런 한 구간을 여러 번 이어 붙인 것입니다. 링크 계층은 그 한 구간을 책임집니다. 구간마다 선의 종류가 달라도 위 계층은 그 차이를 몰라도 됩니다.
쉽고 빠른 이해
링크 계층은 바로 옆에 이어진 장비까지 데이터를 건넵니다. 노트북에서 집 공유기까지가 그런 한 구간입니다.
이게 없으면 위 계층이 선의 종류마다 다른 방법으로 데이터를 실어 보내야 합니다. 랜선과 와이파이는 신호를 만드는 방법이 아예 다릅니다.
링크 계층은 이렇게 돕습니다:
- 보낼 데이터 앞뒤에 겉포장을 씌워 프레임 한 덩이로 만듭니다
- 같은 선에 붙은 장비 중 누구에게 주는 것인지 주소로 찍습니다
- 받는 쪽은 오는 길에 내용이 깨지지 않았는지 검사값으로 확인합니다
대가는 구간마다 겉포장을 씌우고 벗기는 만큼 지연이 붙는다는 것입니다. 겉포장이 차지하는 몫만큼 실제 데이터에 쓸 수 있는 대역폭도 줄어듭니다. 백엔드 코드가 이 계층을 직접 다룰 일은 없습니다. 다만 겉포장이 한 겹 더 붙는 통신망을 끼우면 큰 응답만 멈추는 식으로 문제가 올라옵니다.
상세
서울에서 부산으로 가는 택배는 트럭 한 대가 끝까지 몰고 가지 않습니다. 집하장에서 집하장으로, 구간마다 다른 트럭이 짐을 이어받습니다. 링크 계층은 이 구간 하나를 맡는 트럭입니다.
다만 택배 상자는 한 번 싸면 도착할 때까지 같은 상자입니다. 링크 계층은 구간이 바뀔 때마다 겉포장을 벗기고 새 겉포장을 씌웁니다.
링크 계층은 직접 이어진 두 장비 사이에서 데이터를 건네는 계층입니다. 링크는 장비와 장비를 잇는 한 구간을 뜻합니다. 노트북과 공유기를 잇는 와이파이 전파가 링크 하나이고, 공유기와 통신사 장비를 잇는 랜선이 또 다른 링크 하나입니다.
이 계층은 상대가 바로 옆에 붙어 있을 때만 일합니다. 멀리 있는 서버까지 어느 길로 갈지 고르는 일은 위 계층인 인터넷 계층이 맡습니다. 링크 계층은 그 길 위의 한 구간만 봅니다.
계층 구조에서 맨 아래
네트워크 소프트웨어는 통신을 여러 층으로 나눠 층마다 한 가지 일만 맡깁니다. 인터넷이 실제로 쓰는 모델은 네 층입니다. 위에서부터 응용 계층 · 전송 계층 · 인터넷 계층 · 링크 계층입니다. 링크 계층은 그 맨 아래에 있습니다.
이 네 층을 TCP-IP 모델이라고 부릅니다. 대표 프로토콜 둘의 이름에서 따온 것입니다.
맨 아래 칸은 세는 법이 하나가 아닙니다. 대학 교재가 함께 가르치는 OSI(Open Systems Interconnection, 개방형 시스템 상호연결) 7계층 모델은 이 한 칸을 두 층으로 나눕니다. 신호를 전선과 전파에 실어 보내는 일은 물리 계층이 맡습니다. 프레임을 만들고 주소를 찍는 일은 데이터 링크 계층이 맡습니다.
보낼 데이터는 위에서 아래로 내려오면서 층마다 겉포장을 얻습니다.
flowchart TD
A["응용 계층 · 브라우저가 주고받는 내용"] -->|"내려보낸다"| B["전송 계층 · 어느 프로그램에 줄지"]
B -->|"내려보낸다"| C["인터넷 계층 · 목적지까지 어느 길로"]
subgraph D["링크 계층 한 칸 · OSI 에서는 두 층"]
D1["데이터 링크 계층 · 프레임과 주소"]
D1 --> D2["물리 계층 · 신호"]
end
C -->|"내려보낸다"| D1
겉포장을 씌워 만든 프레임
링크 계층이 선 위로 내보내는 데이터 한 덩이를 프레임이라고 부릅니다. 프레임은 알맹이 앞뒤에 배달용 정보를 덧붙인 꼴입니다. 이 덧붙은 토막이 앞에서 말한 겉포장입니다.
앞에 붙는 토막을 헤더, 뒤에 붙는 토막을 트레일러라고 합니다. 헤더는 이 프레임을 누구에게 주는지 적습니다. 트레일러는 내용이 깨지지 않았는지 확인할 검사값을 답니다.
선 위로는 신호가 끊임없이 흐릅니다. 받는 쪽은 어디서부터 어디까지가 한 덩이인지 알아야 프레임을 떼어 낼 수 있습니다. 시작과 끝을 정해진 표시로 알려 주는 일을 프레이밍이라고 합니다.
block-beta columns 7 s["시작 표시"] a["헤더 · 받는 쪽 주소"] b["헤더 · 보내는 쪽 주소"] c["알맹이 · 위 계층 데이터"]:2 d["트레일러 · 검사값"] e["끝 표시"]
떼어 낸 다음은 내용이 성한지 볼 차례입니다. 검사값은 보낼 내용을 훑어 만든 짧은 숫자라, 내용이 한 비트라도 달라지면 이 숫자도 달라집니다. 이렇게 만든 값을 체크섬이라고 부릅니다.
받는 쪽은 검사값을 다시 계산해 프레임에 적힌 값과 맞춰 봅니다. 두 값이 같으면 알맹이를 위 계층으로 올립니다. 어긋나면 그 프레임을 버립니다.
flowchart TD
A["프레임 도착"] --> B["검사값을 다시 계산"]
B --> C{"적힌 값과 같나"}
C -->|"같다"| D["알맹이를 위 계층으로"]
C -->|"다르다"| E["그냥 버린다 · 보낸 쪽에 안 알림"]
E --> F["다시 채우는 일은 위 계층 TCP 몫"]
버렸다는 사실을 보낸 쪽에 알려 주지는 않습니다. 빠진 데이터를 다시 채우는 일은 위 계층의 TCP 같은 프로토콜이 맡습니다.
겉포장은 공짜가 아닙니다. 구간마다 씌우고 벗기는 만큼 시간이 듭니다. 헤더와 트레일러가 차지하는 몫만큼 알맹이에 쓸 수 있는 크기도 줄어듭니다.
한 구간씩 이어 달린다
먼 곳으로 보낸 데이터는 도중에 구간을 여러 번 갈아탑니다. 구간마다 선의 종류가 다릅니다. 주소 체계도 다릅니다. 그래서 링크 계층은 새 구간에 들어설 때마다 그 구간에 맞는 프레임을 새로 만듭니다.
겉포장의 헤더에는 그 구간에 붙은 장비의 주소가 적힙니다. 랜선과 와이파이에서 쓰는 이 주소를 MAC 주소(Media Access Control, 매체 접근 제어)라고 부릅니다. 알맹이 안쪽의 IP 주소는 이것과 달리 최종 목적지를 가리킵니다.
flowchart TD
subgraph S1["구간 1 · 노트북 → 집 공유기 · 와이파이"]
H1["헤더 · 노트북 MAC → 공유기 MAC"]
P1["패킷 · 내 IP → 서버 IP · 끝까지 그대로"]
T1["트레일러 · 검사값"]
H1 --- P1 --- T1
end
subgraph S2["구간 2 · 집 공유기 → 통신사 장비 · 이더넷"]
H2["헤더 · 공유기 MAC → 통신사 장비 MAC"]
P2["패킷 · 내 IP → 서버 IP · 끝까지 그대로"]
T2["트레일러 · 검사값"]
H2 --- P2 --- T2
end
subgraph S3["구간 3 · 통신사 장비 → 웹 서버 · 그 구간 규격"]
H3["헤더 · 그 구간에 붙은 장비의 주소 둘"]
P3["패킷 · 내 IP → 서버 IP · 끝까지 그대로"]
T3["트레일러 · 검사값"]
H3 --- P3 --- T3
end
S1 --> S2 --> S3
겉포장은 구간마다 갈리지만 그 안에 든 알맹이는 바뀌지 않습니다. 알맹이는 대개 패킷 하나입니다. 최종 목적지 주소를 품은 채 처음부터 끝까지 같은 내용으로 갑니다. 이렇게 안쪽 내용을 건드리지 않고 겉만 씌우는 방식을 캡슐화라고 합니다.
이 구간 안에서만 통하는 주소
MAC 주소는 랜 카드마다 박혀 나오는 48비트짜리 번호입니다. 같은 구간에 붙어 있는 장비끼리 서로를 가리킬 때만 씁니다. 구간을 넘어가면 그 주소는 쓸모가 없습니다. 다음 구간의 프레임에는 그 구간에 붙은 장비들의 주소가 새로 적힙니다.
보낼 때 상대의 IP 주소는 알아도 MAC 주소는 모르는 때가 많습니다. IP 주소를 대고 그 장비의 MAC 주소를 되묻는 절차가 ARP(Address Resolution Protocol, 주소 결정 프로토콜)입니다.
같은 랜(Local Area Network, 근거리 통신망)에 있는 장비들을 이어 주는 스위치는 프레임에 적힌 MAC 주소만 보고 어느 포트(선이 꽂힌 구멍)로 내보낼지 고릅니다. 라우터가 IP 주소를 보고 다음 구간을 고르는 것과 층이 다릅니다.
링크마다 규격이 다르다
링크 계층은 하나의 프로토콜이 아닙니다. 선의 종류마다 다른 프로토콜이 이 계층에서 일합니다. 유선은 이더넷, 무선은 와이파이, 전화선을 쓰던 시절의 PPP(Point-to-Point Protocol, 점대점 프로토콜)가 그런 예입니다.
규격이 다르면 한 번에 실을 수 있는 알맹이의 크기도 다릅니다. 이 상한이 MTU(Maximum Transmission Unit, 최대 전송 단위)입니다. 이더넷 링크의 MTU 는 1500바이트입니다. 경로 중간에 더 작은 MTU 를 가진 구간이 있으면 덩어리를 그 크기에 맞춰 잘라야 합니다.
위 계층은 이 차이를 하나씩 알 필요가 없습니다. 어느 링크든 프레임에 실어 옆으로 건네준다는 것만 같으면 됩니다. 덕분에 유선을 무선으로 바꿔도 그 위에서 도는 브라우저와 서버는 고칠 것이 없습니다.
언제 이 계층을 신경 쓰나
백엔드 코드는 이 계층을 직접 다루지 않습니다. 그래도 문제가 이 계층에서 올라오는 때가 있습니다.
MTU 가 그중 하나입니다. VPN(Virtual Private Network, 가상 사설망)을 끼우면 겉포장이 한 겹 더 붙습니다. MTU 상한은 그대로라서 알맹이에 남는 몫만 그만큼 깎입니다.
아래 두 줄은 전체 폭이 같습니다. 그 폭이 MTU 상한입니다.
block-beta columns 6 a1["이더넷 헤더"] a2["알맹이 · 넓다"]:5 b1["이더넷 헤더"] b2["VPN 겉포장"] b3["알맹이 · 좁아짐"]:4
이 사정을 모른 채 큰 덩어리를 보내면 연결은 맺힙니다. 그런데 큰 응답만 멈춥니다.
상대가 같은 랜 안에 있느냐도 이 계층이 가릅니다. 같은 구간에 붙은 장비끼리는 MAC 주소만 보고 바로 주고받습니다. 다른 구간에 있으면 라우터를 한 번 거쳐야 합니다. 그만큼 지연이 붙습니다.
관련 항목
링크 계층 위에 얹히는 계층
링크 계층을 둘로 가르는 OSI 쪽 계층
물리 계층 · 데이터 링크 계층 · OSI 7계층 · 매체 접근 제어 · 논리 링크 제어
링크 계층을 어디에 둘지 정하는 계층 모델
TCP-IP 모델 · 프로토콜 스택 · 계층 · 캡슐화
링크 계층에서 실제로 도는 프로토콜
이더넷 · 와이파이 · PPP · ARP · VLAN · 스패닝 트리 프로토콜
링크 계층이 씌우고 벗기는 데이터 단위
프레임 · 패킷 · 헤더 · 트레일러 · 페이로드 · 프레이밍 · PDU
링크 계층에서 장비를 가리키는 주소
MAC 주소 · 링크 계층 주소 · 브로드캐스트 · 멀티캐스트 · 유니캐스트 · 이웃 탐색
링크 계층이 정하는 크기 상한
MTU · 점보 프레임 · 경로 MTU 탐색 · MSS · 단편화
링크 위에 겉포장을 한 겹 더 씌우는 통신 방식
VPN · 터널링 · IPsec · GRE · 오버레이 네트워크
프레임을 받아 다음 구간으로 넘기는 장비
스위치 · 라우터 · 네트워크 인터페이스 카드 · 브리지 · 리피터 · 공유기
프레임을 버리게 만드는 오류와 검사값
오류 검출 · 체크섬 · CRC · 패킷 손실 · 충돌 도메인 · 재전송
링크 계층 하나로 묶이는 네트워크 구간
다른 이름: link layer · L2 · 2계층 · 네트워크 인터페이스 계층