2.2데이터 링크 계층
MAC 주소로 통신하는 단계
TL;DR
추억의 쪽지 시험
13. 데이터 링크 계층의 역할
OSI 7 계층 중 2 계층인 데이터 링크 계층은 같은 네트워크(같은 LAN) 안에서 프레임 단위로 데이터를 안전하게 전달하는 계층이다. 데이터 링크 계층은 상위 계층에서 내려온 데이터를 작은 프레임(Frame) 단위로 나누고, MAC 주소를 활용해 같은 네트워크 안의 장비들을 식별한다.
여러 기기가 동시에 데이터를 전송하려고 하면 신호 충돌이 발생하거나, 전송 도중 잡음 또는 지연 등으로 인해 데이터가 손상될 수 있다. 데이터 링크 계층은 이런 문제를 줄이기 위해 프레임 단위의 오류 검출/정정, 링크(매체) 사용 조율, 송‧수신 속도 차이 조절 등을 담당한다.
이를 위해 데이터 링크 계층에서는 보통 다음 세 가지 관점을 사용해 기능을 나눈다.
- 회선 제어(Line Control): 누가 언제 링크(매체)를 사용할지 정해 충돌을 회피
- 오류 제어(Error Control): 전송 중 생긴 비트 오류를 검출하고, 필요하면 재전송이나 정정으로 신뢰성을 높임
- 흐름 제어(Flow Control): 송신자와 수신자의 처리 속도 차이로 인해 버퍼 오버플로가 나지 않도록 전송량을 조절
13-1. 회선 제어
회선 제어는 "이 통신 회선을 지금 누가 쓰고 있는지"를 조율해, 신호 간 충돌이 나지 않도록 하는 기능이다. 즉, 오류를 감지하기보단 회피하는 방법으로 신호 간 충돌 현상이 발생하지 않도록 제어하는 방법이다.
고전적인 방식에서는 송신자 쪽에서 신호의 시작을 의미하는 ENQ(Enquiry)와 끝을 의미하는 EOT(End of Transmission)를 명시적으로 보내고, 수신자는 잘 받았다는 의미의 ACK(Acknowledgement)를 돌려보내 통신 구간을 명확히 구분한다. 이렇게 하면 "누가 언제 말하는지"를 약속해 두기 때문에, 중간에 다른 장치가 끼어들어 신호를 섞어 버리는 상황을 줄일 수 있다.
13-2. 오류 제어
오류 제어는 송수신 데이터가 외부 간섭, 시간 지연 등에 의해 데이터가 변형(ex. 비트가 뒤집힘)되거나 순서가 어긋나는 등의 통신 장애가 발생하지 않도록 오류를 검출하고 필요하면 정정하거나 재전송을 요청하여 통신에 대한 신뢰성을 확보하는 방법이다.
오류를 검출하는 대표적인 방법들은 다음과 같다:
- 패리티 검사(parity check): 데이터를 전송할 때 각 데이터 블록(바이트)에 패리티 비트라고 불리는 1비트를 붙여, 바이트 내 1의 개수를 기준으로 짝수나 홀수가 되도록 설정한다. 1의 개수를 짝수 개수로 보낼지, 홀수 개수로 보낼지 송/수신자가 미리 약속하고, 짝수 패리티의 경우 1의 개수가 홀수였다면 1을 추가, 짝수라면 0을 추가하는 식으로 설정한다. 수신자는 받은 데이터의 1의 개수를 다시 세어 맞는지 확인한다.

- CRC(Cyclic Redundancy Check): 송신자가 데이터에 대해 CRC 코드를 계산해 함께 보내고, 수신자도 동일한 계산을 수행해 일치 여부를 확인한다. 이후 살펴볼 이더넷 프레임 끝에 붙는 FCS(Frame Check Sequence)가 CRC의 한 예다.
- 검사합(Checksum): 데이터의 각 바이트 값을 더하거나 연산하여 생성하는 값으로, 송신자와 수신자가 동일한 계산을 수행해 일치 여부를 확인한다. 이후 살펴볼 IP, TCP/UDP 헤더의 체크섬이 여기에 해당한다.
오류를 정정하는 방법으론 대표적으로 해밍 코드(Hamming Code)가 있다. 해밍 코드는 데이터 비트 사이에 여러 개의 패리티 비트를 추가해, 수신자가 각 패리티 비트의 이상 여부를 보고 어느 비트에서 오류가 났는지 위치를 추적한 뒤 해당 비트 값을 뒤집어 단일 비트 오류를 직접 정정할 수 있게 해준다.
13-3. 흐름 제어
흐름 제어는 송신자와 수신자의 데이터 처리 속도 차이로 인해 수신 측 버퍼가 넘쳐버리는 상황을 막기 위해, 수신자의 상황에 따라 송신자의 데이터 전송량을 조절하는 기능이다.
예를 들어, 정지-대기(Stop & Wait) 방식에서는 송신자가 하나의 프레임을 전송한 후, 수신자로부터 해당 프레임에 대한 ACK(확인 응답)를 받기 전까지는 다음 프레임을 보내지 않는다. 수신자가 ACK를 늦게 보내면 그만큼 전송도 자연스럽게 느려지므로, 수신자의 처리 속도에 맞춰 흐름을 조절할 수 있다. 보다 효율적인 방식으로는 여러 개의 프레임을 한 번에 보내고, 윈도우 단위로 ACK를 주고받는 슬라이딩 윈도우(sliding window) 방식도 있다.
흐름 제어는 데이터 링크 계층에서 인접한 두 장비 사이의 전송량을 조절할 수도 있고, 전송 계층(TCP)에서 통신 끝단(예: 클라이언트 ↔ 서버) 간의 전체 전송 속도를 제어하는 데도 사용되는 개념이다.
14. 이더넷
이더넷(Ethernet)이란 다수의 컴퓨터, 허브, 스위치 등을 하나의 유선 LAN 케이블을 공유하는 네트워크 구조다. 이는 일반적인 인터넷 환경에서 사용하는 기술로, 대부분의 유선 LAN에선 표준처럼 사용되고, 통신사 망에서는 이더넷 기반의 WAN 서비스도 제공한다.
이더넷은 CSMA/CD(Carrier Sense Multiple Access/Collision Detection)라고 하는 프로토콜을 사용한다.
이 프로토콜은 두 대 이상의 컴퓨터가 동시에 다른 컴퓨터에 데이터를 보낼때 일어나는 충돌을 방지하기 위해, 전류의 강도를 확인해 케이블이 사용중인지 확인한다. 책에서는 컴퓨터끼리 데이터를 보내기 위한 눈치 게임을 하고 있다고 비유한다.
- CS(Carrier Sense): 송신 전, 케이블이 사용 가능한지 확인
- MA(Multiple Access): 케이블이 사용 가능하면(= 전류의 강도 세기가 낮아지면) 데이터를 전송
- CD(Collision Detection): 전송 후에도 충돌이 발생할 수 있는지 확인
다만, 오늘날 CSMA/CD는 잘 사용되지 않는다. OSI 7 계층 중 제 2 계층의 스위치가 그 역할을 대신하고 있기 때문이다.
15. MAC 주소
OSI 7 계층의 2 계층에서 사용되는 이더넷은 MAC 주소를 이용해 컴퓨터 간 통신을 한다.
MAC(Media Access Control) 주소는 랜 카드에 할당된 값이며, 전 세계에 하나밖에 존재하지 않는 고유한 값이다. MAC 주소는 책에 나온 예시를 들면 F1:A3:00:2F:3B:21과 같은 형태로 16진수(2개 글자, 8 비트) 6개를 콜론(:)이나 하이픈(-) 단위로 묶어 표기하는데, 이 중 첫 24비트는 OUI(Organizational Unique Identifier)라고 부르는 랜 카드 제조사 코드이며, 다음 24비트는 UAA(Universally Administered Address)라고 하는 제조사가 랜 카드에 부여한 고유 번호이다.
컴퓨터가 데이터를 보낼 때, 2 계층에선 MAC 주소를 헤더에 넣어 프레임을 생성한다. 이 때 헤더에 추가되는 MAC 주소는 송신자의 MAC 주소 뿐 아니라 수신자의 MAC 주소도 함께 포함된다.
송신자 입장에서, MAC 주소는 알고 있는 정보라고 해도, 수신자의 MAC 주소는 어떻게 알 수 있을까? 이 역시 프로토콜을 통해 알아낼 수 있는데, 여기에 쓰이는 프로토콜은 ARP(Address Resolution Protocol)로, IP 주소와 MAC 주소를 매핑하기 위한 프로토콜이다.
ARP는 아래와 같은 방식으로 MAC 주소를 알아낸다.
- 컴퓨터 A는 같은 허브(스위치)에 묶여 있는 모든 컴퓨터에게(브로드캐스트) 보내려고 하는 데이터를 받을 IP 주소의 MAC 주소를 묻는다. 이 과정을 ARP 요청(ARP Request)이라고 한다.
- 모든 컴퓨터는 자신이 해당 IP인지 확인한다. 해당하는 컴퓨터 B가 있다면 응답하며 자신의 MAC 주소를 전달하는데, 이를 ARP 응답(ARP Reply)이라고 한다.
- 컴퓨터 A는 컴퓨터 B의 IP와 MAC 주소를 메모리에 저장하는데, 이것을 ARP Table이라고 한다. 이후에 A가 B와 통신할때는 일일이 요청을 보내지 않고 자신의 ARP 테이블을 참조한다.
- 컴퓨터 A는 B의 MAC 주소를 알게 되었으므로 통신이 가능해졌다.
위와 같은 ARP 방식의 MAC 주소 확인은 같은 LAN 안에서만 동작하는 프로토콜이다. 다른 네트워크(다른 LAN, WAN)에 있는 컴퓨터와 통신할 때는, 우선 내 PC가 기본 게이트웨이(라우터)의 IP에 대해 ARP로 MAC 주소를 알아낸 뒤, 그 MAC 주소를 향해 프레임을 보낸다. 그 다음부터는 각 라우터가 자기와 직접 연결된 네트워크에서 다시 ARP를 사용해 다음 홉의 MAC 주소를 찾는다.
16. 스위치의 구조
데이터 링크 계층의 장비는 스위치다.
16-1. 스위치 구조
앞서 물리 계층에서 살펴본 장비인 허브의 경우 연결된 컴퓨터에서 데이터를 보내면 허브에 물려있는 모든 컴퓨터에 데이터가 전송된다. 하지만, 이 방식은 비효율적이고 보안에도 문제가 생긴다. 데이터를 받아야 하는 컴퓨터에만 전달해도 충분한데, 이것을 가능하게 해주는 것이 스위치다.
스위치는 소규모 네트워크 안에서 컴퓨터, 프린터 등 모든 장치를 서로 연결해서 데이터를 쉽게 공유할 수 있도록 하는 장비다.
16-2. 스위치에서 MAC 테이블 관리하기
스위치는 컴퓨터와 프린터 등을 연결해 데이터를 공유하는 것 외에도, 스위치 포트에 연결된 컴퓨터의 MAC 주소를 관리한다. 스위치는 MAC 테이블이라고 불리는 표에 특정 포트에 어떤 MAC 주소가 있는지를 저장하는데, 과정은 다음과 같다.
- 컴퓨터 A는 다른 컴퓨터와 통신을 하려고 한다. 우선 자신의 ARP 테이블에 해당 컴퓨터의 MAC 주소가 있는지 확인하고, 없으면 ARP 요청을 브로드캐스트한다.
- 스위치는 이 ARP 요청 프레임의 출발지(컴퓨터 A)의 MAC 주소와 포트 정보를 MAC 테이블에 저장한다. 스위치는 목적지의 MAC 주소를 아직 모르기에 모든 컴퓨터에 데이터를 보내는데, 이처럼 스위치에 물려 있는 모든 컴퓨터에 데이터를 보내는 것을 플러딩(Flooding)이라고 한다.
- 연결된 컴퓨터들 중 해당 컴퓨터는 스위치에 응답하며 자신의 MAC 주소를 알려주고(ARP Reply), 스위치는 이렇게 받은 MAC 주소를 MAC 테이블에 저장한다.
- 이제 스위치는 컴퓨터 A가 1에서 통신을 시도했던 컴퓨터의 MAC 주소를 알게되었으니 해당 주소를 A에게 알려준다. A와 해당 컴퓨터는 이제 유니캐스트로 통신을 한다.
- 더 이상 다른 컴퓨터들은 A의 데이터를 받지 않는다. 이를 MAC 주소 필터링이라고 한다.
17. 전송 방향에 따른 통신 방식
2대의 컴퓨터가 동시에 데이터를 보낼 때 충돌이 발생하는 이유는, 여러 컴퓨터가 하나의 공유 선로(허브 등)를 써서 전송을 시도했기 때문이다. 예를 들어, 하나의 선로(네트워크에선 이 선로를 Channel이라고 한다)에 서로 다른 두 정보가 동시에 전송되면 데이터가 섞일 수 있다.
단방향 통신(Simplex Transmission)은 채널이 하나만 있어 일방 통행만 가능하다. 이는 TV, 라디오 등 일방적으로 데이터를 전송하는 매체에서 쓰이는 방식이다.
좀 더 효율적으로 한번에 여러 개 데이터를 주고 받기 위해 등장한 것이 양방향 통신(Duplex Transmission)으로, 하나의 통신 채널에서 송수신이 모두 가능한 방식이다. 양방향 통신은 아래와 같이 2가지 종류가 있다.
- 반이중(Half Duplex) 방식: 양쪽 방향에서 통신이 가능하지만, 동시에는 통신할 수 없다. 즉, 한쪽에서 데이터를 보내면 다른 쪽에서는 수신만 가능하다. 주로 허브에서 사용하는 방식인데, 채널을 하나만 사용하기 때문에 속도는 빨라졌어도(송/수신을 번갈아가며 하기에) 충돌 문제는 여전히 남아 있다.
- 전이중(Full Duplex) 방식: 채널을 2개 두어서 양쪽 방향에서 동시에 데이터를 주고 받을 수 있는 방식으로, 스위치에서 사용된다. 채널을 2개 사용하기에 충돌 문제를 해결할 수 있다.
참고로, 충돌이 발생할 때 그 영향이 미치는 범위를 충돌 도메인(Collision Domain)이라고 한다. 예를 들어, 하나의 허브에 컴퓨터들이 연결되어 있다면 연결된 모든 컴퓨터가 충돌 도메인이 된다.