Date-link layer는 두 개의 레이어로 나눠진다.
- Date Link Control (DLC)
- Media Access Control (MAC)

오늘은 Data Link Control (DLC)가 하는 framing, flow control, error control에 대해 알아본다
4. Data Link Control(DLC)의 핵심 기능
위에서 살펴봤듯, Data-Link Layer는 두 개의 계층으로 나뉘고, 그중 DCL이 데이터 전달을 담당한다.
링크가 전용 링크인지, 브로드캐스트인지 관계없이 인접한 두 노드 간의 통신절차를 따른다.
데이터 링크 제어 기능에는 framing, flow control, error control이 있다.
4.1 Framing
Data-Link 계층에서 Physical layer로 메시지를 보낼 때, Physical layer에서 받아보기 편한 방식으로 변경해야한다.
이 과정을 Framing이라고 한다. 즉, 메시지를 잘라서 Frame 단위로 변환하는 과정이다.
데이터링크 계층의 프로토콜마다 프레이밍 형식이 다르다
Frame에는 Header / Data / Trailer가 포함되는데,
Header에는 주소(MAC Address) 등이 들어가고
Trailer에는 오류 검출 정보(CRC 등)가 들어간다.

정리하면, 데이터링크 계층은 캡슐화를 통해 FRAME 단위로 쪼갠 후,
쪼개진 각 FRAME마다 데이터링크 계층에서 식별할 수 있는 헤더를 추가한다.
IP주소 뿐만 아니라 데이터의 MAC주소까지 헤더에 추가된다.
🔎Frame Size
Frame 사이즈는 어떻게 정할까?
Frame의 크기가 너무 크면 흐름 및 오류 제어에 비효율적이다.
왜냐하면 전달된 하나의 큰 프레임의 메시지에서 단 한 비트의 오류라도 생기면…
전체 프레임의 재전송이 필요하기 때문이다.
반대로 프레임이 너무 작으면 오버헤드가 난다.
Header와 Trailer가 많이 붙기 때문이다.
따라서 적절한 Frame 크기를 선택하는 것이 중요하다.
- 고정 크기 프레이밍 (Fixed-size Frame)
- 영역을 정의할 필요가 없다
- 가변 크기 프레이밍 (Variable-size Frame)
- 한 프레임의 끝, 다음 프레임의 시작을 정의하는 방법이 필요하다(delimitering)
- Character-Oriented Framing / Bit-Oriented Framing
🔎Framing 방식
Frame을 구분하는 방법은 두 가지이다.
Character(Byte)-Oriented Framing / Bit-Oriented Framing
1. Character-Oriented Framing
= Byte-Oriented Framing
Byte 단위로 Frame을 구분한다.
Frame의 시작과 끝에 특수 문자로 구성된 Flag(1Byte)를 붙인다.
Flag: 무엇인가를 기억해야 하거나 또는 다른 프로그램에게 약속된 신호를 남기기 위한 용도로 사용되는 미리 정의된 비트
- 시작 Header : source, destination address 및 기타 제어 정보
- 끝 Trailer : 오류 검출 중복 비트

이렇게 Flag로 프레임의 시작과 다음 프레임의 시작을 나타낸다.
- 문제점1 : Data = Flag
- Flag bit와 data의 bit가 일치하는 경우, 프레임 단위 구분이 모호해진다. 플래그에 사용되는 문자가 데이터의 일부가 되면! 수신기는 데이터 중간이라도 이러한 패턴이 발생하면 프레임 끝에 도달했다고 생각하고 중단함
- 해결책 : Byte Stuffing
→ Flag와 동일한 패턴의 문자가 있는 경우 프레임의 데이터 섹션에 특수 바이트 ESC를 추가한다. 데이터에서 이 문자들이 등장할 때는(문제점2) ESC(escape character) 문자를 한 번 더 채워준다 - ESC : 탈출문자! 미리 정의된 비트 패턴을 가지고 있다
- 수신기는 이 ESC 탈출 문자를 접할 때마다 ESC를 데이터 섹션에서 제거하고 다음 문자부터 데이터로 처리
- 문제점2 : Data = ESC
- 텍스트에 하나 이상의 ESC가 포함되어 있을 때, flag와 동일한 바이트가 있으면?
- 해결책 : Byte Stuffing
→ 텍스트의 일부인 ESC문자도 다른 ESC로 표시해야한다. 이는 두 번째 ESC가 텍스트의 일부임을 나타내기 위해 추가ESC문자가 추가됨을 의미한다

2. Bit-Oriented Framing
- 문제점
- flag를 01111110이라는 비트 패턴으로 사용했을때,
- 데이터에 flag 패턴(01111110)와 동일한 비트열이 온다면! 수신자에게 이것이 프레임의 끝이 아니라는 것을 알려야한다.
- 이를 구별하기 위해 데이터에서 1이 연속으로 5번 나올 때마다 뒤에 0비트를 채운다

4.2 Flow Control
데이터를 전송할 때는 수신자가 데이터를 제대로 받을 수 있는지와 전송 중 오류가 발생하지 않았는지를 함께 확인해야 한다.
이를 위해 데이터링크 계층에서는 Flow Control(흐름 제어)과 Error Control(오류 제어)을 수행한다.
흥미로운 점은 두 기능이 서로 독립적인 것이 아니라 함께 동작한다는 것이다.
예를 들어 ACK(Acknowledgement)는 수신자가 데이터를 정상적으로 받았다는 것을 알려주는 신호인데, 송신자의 전송 속도를 조절하는 Flow Control에도 사용되고, 데이터가 정상적으로 도착했음을 확인하는 Error Control에도 사용된다.
🔎Connectionless와 Connection-Oriented
DLC(Data Link Control) 프로토콜은 크게 두 가지 방식으로 나뉜다.
connectionless(비연결지향) vs connection-oriented(연결지향)
1. Connectionless(비연결 지향)은 각 프레임이 서로 독립적으로 전송되며, 프레임 간의 순서나 연결을 유지하지 않는다.
2. Connection-Oriented(연결 지향)은 프레임마다 순서 번호를 부여하여 논리적인 연결을 유지한다.
오류를 검출하거나 재전송하는 기능은 대부분 Connection-Oriented 방식에서 사용된다!
🔎Flow Control
Flow Control은 송신자가 수신자보다 너무 빠르게 데이터를 보내지 않도록 제어하는 기능이다.
만약 보내는 속도가 받는 속도보다 빠르면?
수신자는 들어오는 데이터를 모두 처리하지 못하고 버퍼(Buffer)에 임시 저장하게 된다.
하지만 버퍼의 크기는 제한되어 있기 때문에 계속 데이터가 들어오면 결국 버퍼가 가득 차게 된다.
이러한 문제를 해결하는 방법은 크게 두 가지이다.
- 버퍼가 가득 찬 프레임을 폐기한다.
- 송신자에게 속도를 줄이거나 잠시 전송을 멈추도록 요청한다.
🔎Flow Control Protocol
데이터링크 계층에서는 흐름 제어와 오류 제어를 위해 대표적으로 네 가지 프로토콜을 정의한다.
- Simple Protocol
- Stop-and-Wait Protocol
- Go-Back-N(GBN)
- Selective Repeat(SR)
1. Simple Protocol
Simple Protocol은 가장 기본적인 데이터링크 프로토콜이다.

흐름 제어나 오류 제어가 없고, 수신자가 수신한 프레임을 즉시 처리한다고 가정한다.
즉,
- 프레임이 손실되지 않고,
- 오류도 발생하지 않으며,
- 수신자의 버퍼도 절대 넘치지 않는
이상적인 환경을 가정한 프로토콜이다.

동작 과정은 매우 단순하다.
송신자는 네트워크 계층으로부터 데이터를 받으면 프레임으로 만들어 바로 전송하고,
수신자는 이를 받아 다시 네트워크 계층으로 전달한다.
따라서 실제 환경에서 사용하기보다는 흐름 제어의 기본 개념을 설명하기 위한 프로토콜이라고 이해하면 된다.

위 그림은 Simple Protocol을 사용한 의사소통 예시이다.
네트워크 계층에서 패킷이 생성되어 데이터링크에서 프레임 단위로 송신한 후,
수신하여 다시 패킷으로 네트워크 계층에 전달하는 과정이다.
2. Stop-and-Wait Protocol
Stop-and-Wait Protocol은 Flow Control과 Error Control을 모두 지원하는 가장 기본적인 프로토콜이다.


송신자는 한 번에 하나의 프레임만 전송한다.
그리고 다음 프레임을 보내기 전에 반드시 ACK를 받을 때까지 기다린다.
만약 일정 시간이 지나도 ACK가 도착하지 않으면 해당 프레임을 다시 전송한다.
손상된 프레임을 감지하기 위해 각 데이터 프레임에 CRC라는 것을 더해주는데,
0과 1이 변조된 경우 에러로 판단하고, 손상된 프레임은 버려버린다.

하지만 이 방식의 문제가 있는데,
예를 들어 ACK가 전송 중 손실되면 송신자는 프레임이 도착하지 않은 것으로 판단하여 같은 프레임을 다시 전송한다.
그러면 수신자는 이미 받은 프레임을 또 받게 되고, 같은 데이터가 두 번 전달되는 문제가 발생한다.
이와 같은 문제를 해결하기 위해 프레임에 번호를 붙이게 되는데 !!!!

프레임마다 순서 번호(Sequence Number)를 붙인다.
Stop-and-Wait에서는 프레임 번호를 0과 1만 반복해서 사용하며,
ACK 역시 1과 0을 번갈아 사용하여 어떤 프레임에 대한 응답인지 구분한다.
4.2 Error Control
데이터를 전송하는 과정에서는 다양한 원인으로 인해 오류가 발생할 수 있다.
Error Control(오류 제어)은 이러한 오류를 검출하고, 필요한 경우 재전송을 요청하여 데이터를 정확하게 전달하는 기능이다.
데이터링크 계층에서 Error Control은 오류를 검출하고 손상된 프레임을 다시 전송받는 방식으로 신뢰성을 보장한다.
즉, 오류를 직접 수정하는 것보다 오류를 발견하고 재전송을 요청하는 것이 핵심이다.
🔎Types of Error
데이터는 전송 중 잡음(Noise)이나 간섭(Interference)의 영향을 받을 수 있다.
이로 인해 원래의 비트가 다른 값으로 바뀌면서 오류가 발생한다.
오류는 크게 두 가지로 구분한다.
1. Single-Bit Error
Single-Bit Error는 하나의 비트만 변경되는 오류이다.
예를 들어,
10110101 가
10111101 로
단 하나의 비트만 바뀌는 경우를 말한다. 이러한 오류는 비교적 드물게 발생한다.

2. Burst Error
Burst Error는 여러 개의 비트가 연속해서 변경되는 오류이다.
예를 들어,
101101001011 가
100010111011 로,
여러 비트가 동시에 손상되는 경우이다.
실제 네트워크에서는 대부분 Burst Error가 발생한다.
이는 잡음이 일정 시간 동안 지속되면서 여러 비트에 동시에 영향을 주기 때문이다.
따라서 실제 오류 검출 기법들은 Burst Error를 검출하는 것을 목표로 설계된다.
🔎Error Detection과 Error Correction
오류를 처리하는 방법은 크게 두 가지이다.
1. Error Detection
오류가 발생했는지만 확인하는 방법이다.
즉, "오류가 있다." 또는 "오류가 없다."만 판단한다.
단일 비트 오류나 버스트 오류인지 모르고, 오류가 몇 개 발생했는지 모른다.
어느 위치에서 발생했는지는 알지 못한다.
하지만 오류 수정은 손상된 비트 수, 메시지 내 위치 정확히 알아야 한다.
2. Error Correction
오류를 검출하는 것뿐만 아니라,
손상된 비트의 위치를 찾아 원래 값으로 복구하는 방법이다.
따라서 Error Detection보다 훨씬 복잡하며,
더 많은 계산과 추가 비트가 필요하다.
즉, Error Correction은 어디가 잘못되었는지까지 찾아 수정해야 하기 때문에
Error Detection보다 훨씬 어려운 기술이다.
🔎Redundancy
오류 감지, 수정의 핵심 개념은 redundancy(중복성)이다
- 오류를 검출하거나 수정하기 위해 데이터에 추가적인 비트를 보낸다. 이를 중복비트라 하고.
- 이러한 중복 비트는 송신자에 의해 추가되고 수신자에 의해 제거된다
- 수신기가 손상된 비트를 감지하거나 수정할 수 있다

🔎Coding
오류 검출을 위해서는 데이터와 중복 비트 사이의 일정한 규칙이 필요하다.
이러한 규칙에 따라 데이터를 변환하는 과정을 Coding이라고 한다.
데이터 비트에 대한 중복 비트 비율과 프로세스의 견고성은 모든 코딩방식에서 중요하다!
이러한 코딩은 1)블록코딩, 2) 컨볼루션 으로 나뉜다
이 중 데이터링크 계층에서는 Block Coding을 가장 많이 사용한다.
Block Coding
메시지를 데이터워드라는 k비트 단위 블록으로 쪼갠 뒤,
각 블록마다 중복 비트를 추가하여 길이를 n = k + r로 만든다.
예를 들어,
k비트의 데이터를 입력받아
r개의 중복 비트를 추가하면
최종적으로 n = k + r 비트의 새로운 데이터가 만들어진다.
이때 원래의 k비트를 Dataword,
중복비트가 추가된 길이 n의 비트 블록을 코드워드(Codeword)라 한다.

'컴퓨터 네트워크' 카테고리의 다른 글
| [network] Date-Link Layer 오류 검출 (Error Detection) (0) | 2026.07.01 |
|---|---|
| [network] Data-Link Layer (0) | 2026.06.29 |
| [network] 아날로그 신호로 변환하기 Analog Transmission와 Multiplexing (0) | 2026.06.28 |
| [network] 아날로그 신호를 디지털 데이터로 바꾸는 방법 (0) | 2026.06.27 |
| [network] 디지털 데이터를 디지털 신호로 변환하는 방법 Line coding, Block coding, Scrambling (8) | 2025.01.06 |