신호의 전송과 충돌(2계층 - 데이터링크계층)

2계층 - 데이터링크계층

1계층은 케이블이 연결되어 있는 기기에 대한 신호 전달을 수행하는 계층이라고 공부했다.

비트 <-> 신호

1계층을 통해 신호가 수신처로 도착한 이후를 다루는 계층이 2계층 - 데이터링크계층이다. 1계층의 허브를 이용하여 신호를 송신하면 플러딩으로 인해서 허브에 연결된(동일 세그먼트 내) 모든 기기들이 해당 신호를 수신하게 되는 문제점이 발생한다고 했었다. 그렇기 때문에 동시에 송신하게되면 충돌이 발생하기도 하는데 이러한 문제를 해결하기 위해서 2계층에서 수행해야하는 것들이있다.

충돌을 막기 위해서는 송신하는 타이밍을 엇갈리게 해야 한다.

송신하는 타이밍을 엇갈리게 하는 방법은 신호를 보내기 전에 해당하는 것이며, 마찬가지로 신호가 도착한 뒤에도 생각해야할 것이 있다. 즉, 신호의 송신 전후로 바르게 데이터를 송수신하는 순서가 필요한 것이다. 2계층부터는 데이터를 보내기 전과 후에 어떤 일들을 할지 규정하는 계층인데, 위에서 잠깐 나왔듯이 신호가 닿는 범위(세그먼트)에서의 데이터 전송에 관한 규정이라고 생각하면 된다.

세그먼트 범위: 신호가 닿는 범위

즉, 멀티엑세스 네트워크라면 허브로 연결되어 있는 모든 기기 / 포인트 투 포인트 네트워크에서는 서로 연결되어 있는 두 기기를 말한다.

프레이밍

1계층에서는 신호를 전달하는 것을 생각 / 2계층에서는 세그먼트 범위에서 데이터를 어떻게 송수신할지 생각

1계층에서 다루는 신호와 케이블에 따라서 2계층의 규격이 달라진다. 그러니까 1계층의 조건에 따라서 2계층도 달라지게 된다는 것이다. 간단히 LAN용과 WAN용이 있을 수 있는데, LAN에서의 사실표준인 이더넷(Ethernet)에 대해서 살펴보자.(3계층 이상에서는 LAN / WAN 구별할 것 없이 동일한 규칙을 사용한다)

프레이밍이란 1계층에서 주고받은 신호를 비트화해 의미를 갖게 만드는 것이다. 프레이밍(framing)은 프레임(frame)에서 따온 말인데 2계층의 PDU가 바로 프레임이다. 프레이밍을 통해서 비로소 신호가 데이터로 바뀌는 것이다. 제일 먼저 프리엠블(preamble)을 송신한다. 프리엠블은 지금부터 프레임이 시작된다는 신호를 주는 것이고 수신측에서 이 프리엠블을 받으면 “이제부터 프레임 신호가 오겠군”이라고 판단할 수 있는 것이다.

프레이밍(framing): 송수신되는 비트열에 프레임 포멧을 적용시켜서 데이터로 취급할 수 있게 해준다. = 프레임화

항상 동기적으로 신호를 기다릴수는 없기때문에 프리엠블을 사용한다고 보면된다. 클럭(clock)을 통해 프리엠블을 사용하기 않고 동기적으로 통신할 수 있지만 항상 신호를 보내는 수고스러움이 있기때문에 별로 사용하지는 않는다고 한다.

패킷 교환 방식에서는 데이터 통신 직전에 프리엠블을 보내 통신 타이밍을 비동기적으로 맞춘다고 생각하면 될 것 같다!

2계층 주소와 이더넷

2계층은 세그먼트라는 범위에서 어떻게 데이터를 송수신할지 판단하는 계층이다.

데이터를 주고 받으려면 송신자와 수신자가 필요한데 이때 목적지를 구분해주기 위해서 주소(address)라는 걸 사용한다. 현실세계에서 우리가 택배를 보내기위해 보내는 사람과 받는 사람을 명시해주는 것과 똑같은 것이다. 하지만 이러한 주소는 데이터 전송 방법에 따라 세 가지로 나뉘는데 1. 유니캐스트 2. 브로드캐스트 3. 멀티캐스트가 있다.

  • 유니캐스트(Unicast) : 보편적인 일대일 통신이다.
  • 브로드캐스트(Broadcast) : 1대 전체 통신이며, 연결되어있는 모든 기기들에게 송신하는 방법이다.
  • 멀티캐스트(Multicast) : 1대 다수 통신이며, 지정된 복수의 기기로 메세지를 보내는 데이터 통신 방법이다.

모든 기기는 유니캐스트 주소를 적어도 한 개를 갖고 있어야한다. 적어도 1개이기 때문에 2개 이상을 가진 기기도 있을 수 있으며, 라우터와 같이 복수의 인터페이스를 가진 기기가 해당된다. 그리고 유니캐스트 주소는 유일해야 한다(unique). 유니캐스트 주소가 중복되면 수신처를 분별할 수 없기 때문이다.

반면에 멀티캐스트 주소는 중복을 허용한다. 같은 멀티캐스트 주소를 가지고 있는 기기는 동일한 그룹 번호를 같는 것과 마찬가지이며 멀티캐스트에 보내고 싶은 경우에는 수신처를 그룹으로 하면 되기때문에 중복되어도 된다. 만약에 멀티캐스트 그룹에 속한 기기가 있다면 그 기기는 멀티캐스트 주소와 유니캐스트 주소 두 가지를 갖고 있는 것이다.

이더넷에서 사용하는 주소는 MAC 주소(Media Access Control Address)라고 부르며, 이 주소는 인터페이스에 지정된 고정 주소이다. 컴퓨터 자체가 아닌 인터페이스에 고정된 주소이기 때문에 인터페이스가 변하면 주소도 변한다. MAC 주소는 48비트 값으로 4비트마다 16진수로 표현한다. 앞의 24비트는 벤더코드로서 인터페이스의 제조사의 번호이고, 뒤의 24비트는 제조사가 붙인 번호(벤더 할당 코드)이다. 이렇게 표현하는 이유는 MAC 주소의 유일성 때문이다.

이더넷(Ethernet)

LAN의 2계층에서는 이더넷 규칙을 사용한다고 했다. 또한 이 규칙에서 사용하는 주소는 MAC 주소이고 고유해야 한다는 것도 알고있다.

2계층의 PDU, 즉 프레임을 생각해보자. 이더넷에서는 이더넷 헤더(ethernet header)이더넷 트레일러(ethernet trailer)를 붙여서 이더넷 프레임(ethernet frame)으로 캡슐화한다. 그리고 이더넷 프레임은 1계층에서 신호가되어 케이블을 통해 움직인다. 표를 통해 간략하게 그려보자.

  • 이더넷 프레임
수신처 MAC 주소 송신처 MAC 주소 타입 페이로드 FCS
48비트 48비트 16비트 368 ~ 12000비트 32비트

타입은 페이로드의 내용을 식별할때 사용한다. FCS는 Frame Check Sequence의 약자로서 에러를 체크하는 데에 사용된다(순회부호방식이라고 불리는 에러 체크 데이터이다). 하지만 FCS가 있다고 한들 통신 도중에는 에러를 고칠 수 없다. 그래서 에러가 있었던 프레임은 파기를 해야하고 파기했다는 사실은 송신측에 알리지 않는다.

이제 이더넷이 어떻게 데이터를 송수신하는지 보자. 허브에 연결된 기기들은 모두 다음과 같은 특징을 가질 수 밖에 없다.

  1. 플러딩(수신 포트를 포함 모든 포트에 신호를 송신)
  2. 충돌 : 플러딩으로 인해 충돌이 발생

이더넷에서는 수신처 MAC 주소를 보고 자기에게 온 것만 받고 다른 프레임은 파기한다. 중요하니까 다시 한번.

이더넷에서는 수신처 MAC 주소를 보고 자기에게 온 것만 받고 다른 프레임은 파기한다.

(멀티캐스트의 경우 그룹 번호가 들어가있기 때문에 자신이 속한 그룹 번호로 수신처가 적혀있다면 수신하게 된다.)

위의 내용은 플러딩과 관련된 이더넷의 동작이고, 다음으로는 충돌에 관한 것이다. 멀티엑세스 네트워크의 경우 동시에 송신을 하게 되면 충돌이 발생하는데, 이더넷에서는 신호를 보내는 타이밍을 겹치지 않게하기 위해 CSMA/CD(Carrier Sense Multi Access/Collision Detection)이라는 엑세스 제어를 시행한다. 더 정확히 얘기하면 되도록 충돌이 발생하지 않도록 노력하는 것이다.(CSMA/CD를 통해 충돌을 100% 방지할 수는 없다.)

인터페이스에 연결되어 있는 케이블에 신호를 보내는 엑세스 활동을 제어하는 것을 의미한다.

  • CS : 신호 감지
  • MA : 멀티 엑세스
  • CD : 충돌 검사

신호를 감지하여(CS) 누군가 송신 중이라면 송신하지 않고, 아무도 송신하고 있지 않다면 송신할 수 있다(MA). 만약 송신 후 충돌이 일어나면 다시 재수행한다(CD). 언뜻 보면, 신호를 감지하고 송신하기 때문에 충돌을 피해갈 수 있을것이라고 생각할 수 있다. 하지만 두 대 이상의 기기가 동시에 신호를 감지한다면 어떻게 될까? 두 대 모두 동시에 아무도 송신을 하고있지 않다고 판단하여 동시에 송신을 하게 될 것이고 충돌이 발생할 것이다. 그래서 위에서 정리한 것처럼 CSMA/CD라고 해도 100% 충돌을 피할 수는 없으며, 단지 충돌을 방지하기 위해 노력하는 것일 뿐이다.

스위치

  • 짚고 넘어가기

충돌 도메인 내의 기기 수가 많으면 CSMA/CD로 제어한들 충돌이 발생할 확률은 높아지게 된다.

CSMA/CD를 통해 제어를 하다보면 송신 -> 충돌 -> 재송신 -> 충돌 -> 재송신 …과 같은 비효율적인 일이 발생할 수 있다. 이러한 방법은 충돌을 피하기 위한 신호를 보내는 타이밍을 겹치지 않게 하는 방법이며 또 다른 방안으로는 신호가 지나는 길을 나누는 방법이 있다. 스위치라는 기기를 사용하며 허브 대용으로 많이 이용한다.

  • 충돌 방지
  1. 신호를 보내는 타이밍을 나눔 - CSMA/CD
  2. 신호가 지나는 길을 나눔 - 스위치

허브가 여러 대의 기기를 연결하여 하나의 세그먼트 범위를 만드는 것 처럼 스위치도 동일한 역할을 한다. 그렇다면 허브와 스위치의 차이는 어디에서 오는 것일까? 그 포인트는 케이블을 살펴보면 나온다.

요즘 LAN에서 사용하고 있는 광 섬유나 UTP 케이블은 송신 신호와 수신 신호가 따로 있다. 즉, 케이블 상에서는 내가 송신한 신호와 받는 수신한 신호가 동시에 들어가도 충돌은 발생하지 않는다는 것이다. 충돌은 케이블이 아닌 허브에서 발생하고 두 개 이상의 신호를 수신하면 나누어서 보낼 수 없기때문에 그런것이다.

그래서 *수신한 프레임을 따로따로 보낼 수 있도록 해서 충돌을 막는 방법이 스위치를 사용하는 것이다. * 스위치를 이용하여 충돌을 방지하는 방법은 아래의 두 가지를 모두 수행하는 것이다.

  1. MAC 주소 필터링 : 학습 + 스위칭
  2. 버퍼링

먼저 MAC 주소 필터링은 학습과 스위칭으로 나뉜다. 학습은 송신처 MAC 주소를 기록하는 동작이다. 이를 통해 수신한 스위치의 포트와 발신처 MAC 주소의 테이블을 만든다. 다음 동작은 스위칭으로서 말 그대로 스위칭을 한다. 아무튼 학습 과정을 통해서 스위치는 각 포트에 연결되어 있는 컴퓨터의 MAC 주소를 기억(Address table)하게 되며 다음 스위칭 동작때 사용하게 된다.

학습으로 매핑된 어드레스 테이블을 이용해서 프레임의 수신처 MAC 주소를 보고, 그 MAC 주소가 있는 포트로만 프레임을 송신하는 방법으로 충돌을 방지한다!!

(만약 허브였다면 두 신호가 모든 포트로 송신하려는 플러딩 동작때문에 충돌이 났을것이다!!)

스위치의 충돌 방지 두 번째 동작은 버퍼링수신처가 같은 프레임이 동시에 도착한 경우 때문에 필요로 한다. 버퍼링은 버퍼(buffer)라는 말에서 나온 것인데 버퍼란 일시적으로 데이터를 저장할 수 있는 메모리를 말한다. 수신처가 같은 두 개의 프레임이 스위치에 도착했을때 다시 충돌이 발생할 수 있는데 이때는 버퍼를 사용하여 방지하면 된다. 하지만 여기에도 문제점이 있는데, 바로 버퍼의 용량이다. 버퍼의 용량은 유한하며 버퍼가 가득 찰 경우에는 백 프레셔(Back Pressure) 또는 IEEE802.3x 라는 규격을 사용해서 송신을 조정한다.

버퍼가 차면 송신을 중지시킨다!

백 프레셔와 IEEE는 스위치가 대응하는 이더넷 종류에 따라 갈라진다. 전이중 이더넷에 대응하면 IEEE를 사용하고 그렇지 않으면 백 프레셔 방식을 사용하게 된다.

전이중 통신(Full-Duplex)은 스위치를 사용하는 경우로써 충돌을 고려할 필요가 없는 통신 방식이다. 하지만 반이중 통신(Half-Duplex)은 CSMA/CD가 동작하는 방식이며 이는 동시에 송신과 수신을 할 수 없는 구조로서 효율적이지 못한 통신을 제공해준다.

Share