실질적인 정보전송은 물리계층이 한다.
그럼 데이터 링크계층(2계층)은 어떤 일을 할까?
데이터 단위 ( 프레임 )
물리계층에서 데이터가 전달될 때 비트단위로 전송되지만 프레임 단위로 구분되어 전송된다. 프레임은 캡슐화(Encapsulation)된 비트열이다.
캡슐화를 이해하려면 우주선을 이해하면 된다. 프레임은 OSI 1계층에서 7계층까지 가는 하나의 우주선이다. 화성으로 가는 우주선은 1단 추진로켓으로 추진력을 얻다가 적정궤도에 오르면 1단 추진로켓을 분리시킨다. 그리고 2단 추진로켓을 작동시켜 다시 추진력을 얻다가 2단 추진로켓도 분리시킨다.
이처럼 각 계층에 헤더는 본인 계층에 도달하기 위한 중요한 추진력을 갖고 있다. 그리고 해당 계층에 도달하면 헤더를 분리시키고 다음 계층으로 이동한다.
그럼 2계층의 헤더와 꼬리에는 어떤 정보가 들어 있을까?
경로 설정
2계층의 헤더에는 주소정보가 들어있다. 2계층 주소는 물리적 장비 주소를 가리킨다. 이를 MAC 주소 (Media Access Control Address)라고 한다. MAC 주소는 물리적 장비(PC, 브릿지, 스위치, 라우터....) 마다 부여된 주소이다. 2계층 헤더에 물리적 장비의 주소가 있는 이유는 전송매체(유선, 무선)의 끝부분은 장비이기 때문이다. 한마디로 프레임의 목적지는 물리적인 장비이다.
예를 들어, 내가 네이버에 접속하는 상황을 가정해보자. 네이버 서버의 IP 주소를 안다고 해서 네이버 서버에 접근할 수 없다. 그 이유는 프레임이 가장 먼저 들려야 할 곳은 내 방의 무선공유기이기 때문이다. 무선공유기의 주소를 모르면 첫 관문도 통과를 못한다. 그래서 2계층 헤더에는 다음 행선지가 될 장비의 MAC 주소를 담고 있다.
무선 공유기에 도착하면 프레임은 다음 행선지가 적힌 헤더로 바꿔 끼운다. 이제 MAC 주소는 가장 가까운 라우터를 가리킨다. 라우터에 도착하면 라우터는 2계층 헤더를 분리시키고 3계층 헤더에 적힌 네이버 서버의 IP주소를 읽고 네이버 서버로 갈 수 있는 라우터들과 소통한다. 그리고 그 중 바쁘지 않은 라우터 장비의 MAC주소로 프레임의 2계층 헤더를 끼운 후 출발 시킨다. 이런 과정을 반복하다보면 어느 새, 네이버 서버에 도착하게 된다. 이런 방식으로 2계층 헤더는 프레임의 이동경로를 설정하는데 사용된다.
스위칭(Swithcing)
Switch는 바꾸다, 전환하다라는 의미이다. 그래서 2계층 장비에서 수신받은 프레임의 헤더를 바꾸어 다른 장비로 이동시키는 것을 스위칭이라고 하는 것 같다. (뇌피셜) 2계층에서 이루어지는 스위칭은 MAC주소를 이용한다. 라우터처럼 라우터끼리 정보를 주고 받으며 상황에 따라 최적의 경로를 정하는 연산을 하지 못한다. 그러므로 스위칭의 경로는 정해져 있다.
스위칭 방법에는 3가지가 있다.
1. 회선교환방식( Circuit Switching )
회선교환방식은 통신을 할 때, 선로를 먼저 구성한 이후, 통신을 시작하는 방법이다. 대표적으로 PSTN 전화망이 있다. 물리적으로는 기지국과 안테나가 설치되어 있지만 A라는 사람과 B라는 사람의 논리적인 통신선로는 구성되어 있지 않다. 그래서 통신이 이루어지기전 통신선로를 먼저 구성한 후, 통신이 이루어지는 방식을 회선교환방식이라 한다.
교환원이 있던 시절 전화를 할 때는 교환원이 상대방과 통신을 연결해줄 때까지 기다려야했다. 그리고 교환원이 통신이 완료되었다고 통보해주면 그때부터 상대방과 전화가 가능했다. 지금은 그 과정이 자동화되어 통화신호음이 들리는 과정으로 대체되었을 뿐 원리는 같다. 회선을 유지해야하는 것이기 때문에 동시에 통화가능한 사람의 수가 한정되어 있다.
2. 메세지교환방식 (Message Switching)
메세지교환방식은 2계층에서 이루어지는 스위칭 방식이 아니다. Store and Forward 방식을 사용하는데 이는 버퍼메모리에 잠시 데이터를 저장했다가 오류 체크를 한 후, 오류가 없으면 전송시키는 방식이다. 2계층은 정확성 보다는 신속하게 데이터를 보내는 것이 목적이기에 Store and Forward 방식을 쓰는 메세지 교환방식은 적합하지 않다.
3. 패킷스위칭 (Packet Swithching)
패킷스위칭은 Virtual Citcuit 방식과 데이터그램방식으로 나뉜다. 패킷 스위칭은 중요한 개념이기 때문에 다음 포스팅에서 자세히 다루도록 하겠다.
경쟁(CSMA/CD)
장비 여러 대가 한 가지 전송매체를 공유한다면 전송매체를 차지하기 위한 경쟁은 불가피하다. 그래서 전송매체를 차지하는 여러가지 방법이 있다.
1. 장비들끼리 서로 시간을 정해서 사용하기
2. 서버에 허락을 받은 장비만 사용하기
3. 전송매체를 먼저 차지한 장비가 사용하기 (CSMA/CD, 경쟁)
3번이 LAN에서 보편적으로 사용되고 있는 방식이다.(이더넷) A 노드가 전송매체에 신호를 보내려는데 B 노드도 신호를 보낸다면 신호는 충돌이 일어나 깨진다. 충돌이 일어났음을 A노드와 B노드가 감지하고 다시 데이터를 보낼 준비를 하는데 잠시 랜덤하게 쉰 다음에 데이터를 보낸다. 그래야 충돌이 재차 발생하지 않기 때문이다. 만약 전송매체가 사용 중이라면 잠시 대기한다. STAR 토폴로지나 BUS 토폴로지에 잘 사용된다.
4. 토큰(Token) 이용하여 사용하기
제어 토큰이 망을 한방향으로 돌아다닌다. 전송할 데이터가 있는 노드는 제어 토큰이 자신에게 올 때까지 기다리다가 획득한다. 그리고 전송매체에 프레임을 전송한다. 제어 토크을 획득하지 못한 노드는 데이터를 전송할 수 없다. 전송을 완료한 노드는 제어토큰을 다음 노드로 넘긴다. 주로 Ring 토폴로지에 자주사용된다. 예전에는 각광받는 Access 방식이었지만 현재는 이더넷에 밀려 거의 사용되지 않는다.
흐름제어(Flow Control)
출처 입력
장비와 장비 사이에는 데이터를 담은 프레임만 오고 가는 것이 아니다. 프레임에는 장비끼리 '데이터를 담은 프레임'을 잘 받았는지 여부를 응답하는 프레임도 존재한다. 이때, 데이터를 담은 프레임을 정보 프레임, 잘 받았음을 알리는 프레임을 긍정 응답 프레임, 프레임에 오류가 발생했음을 알리는 프레임을 부정 응답 프레임이라고 한다.
여기서 응답 프레임을 통해서 흐름 제어를 할 수 있다. 장비들은 버퍼메모리를 갖는다. 버퍼메모리가 가득 차있는데 데이터가 계속 들어오면 데이터는 유실된다. 그래서 장비가 버퍼메모리를 처리하는 속도를 버퍼메모리로 데이터가 들어오는 속도가 넘지 못하도록 흐름을 제어할 필요가 있다. 그래서 데이터를 수신하는 장비가 송신하는 장비에게 데이터 송신 타이밍을 응답함으로써 흐름을 제어할 수 있다.
오류 제어 (Error Control)
2계층 헤더에는 MAC 주소와 더불어, 프레임 순서 번호도 저장되어 있다. 프레임의 순서번호를 통해 프레임의 중복여부와 분실여부를 판단한다. 그리고 송신 측에게 재전송을 요청하는 방식으로 오류를 제어한다.
프레임이 모두 잘 도착했어도 오류가 발생할 수 있다. 프레임이 변형된 경우다. 변형오류의 원인은 다양하낟. 전송중 외부 충격(impulse noise)이 발생할 수도 있고, 다른 시그널과 간섭(Cross Talk)이 일어날 수도 있다. 멀리 보내다 보면 감쇠(Attenuation)가 일어나고 백색잡음은 자연적으로 발생한다.
이처럼 프레임이 전송매체를 타고 이동하는 과정에서 잡음과 간섭에 의해 변형될 수 있다. 그러나 수신하는 측은 본래 데이터가 무엇인지 모른다. 그러므로 오류를 체크할 수 있는 비트를 프레임에 추가해야한다. 그것이 '2계층 꼬리'이다.
2계층 꼬리는 오류를 체크하기 위해 달려있다. 그럼 오류를 체크하는 방법에는 어떤 것들이 있는지 알아보자
Error Detection
1) Parity Check
패러티 체크는 1bit를 이용한다. 1bit를 패러티 비트라고 한다. 데이터가 아스키 코드 데이터라면 패러티비트까지 합쳐서 1byte가 된다. 패러티 체크는 8bit 안에서 이루어진다. 8bit의 1의 개수를 세는 것이다.
만약 송신 측이 짝수 패러티 방식으로 데이터를 전송했다면 8bit의 1의 개수는 짝수여야한다. 7bit가 홀수이면 패러티 비트는 1이된다. 7bit가 짝수이면 패러티 비트는 0이 된다. 수신 측은 패러티 검사를 실시한다. 8bit의 1의 개수를 체크하는 것이다. 짝수이면 오류가 없는 것이지만 만약 홀수라면 오류로 판정하고 프레임을 폐기하고 송신측에 재전송을 요청한다.
하지만 이 방식에는 문제가 있다. 1001110 + 0 데이터가 0101110 + 0 으로 변형되었다고 가정해보자. 분명 변형이 되었지만 1의 개수는 짝수이므로 정상 프레임으로 인식된다.
2) Block Check Character (BCC)
패러티 체크는 1byte의 데이터(아스키코드 데이터인 경우)에서 검사가 이루어졌다. BCC는 1byte 데이터를 여러 개를 블럭(block)단위로 받은 후, 다같이 패러티 체크를 하는 것이다. 송신 측은 가로 방향 뿐만 아니라, 세로 방향으로도 패러티 비트를 넣어준다.
가로 방향 홀수방식 패러티 비트
1000110 + 0
1110110 + 0
0011011 + 1
1111000 + 1
세로방향 짝수방식 패러티 비트
1000110 + 0
1110110 + 0
0011011 + 1
1111000 + 1
1010011 + 0
수신 측에서 패러티 검사를 할 때, 가로방향에서 모두 홀수가 나와도 세로방향에서 모두 짝수가 안 나오면 해당 블럭은 오류가 있는 블럭으로 판단되어 폐기처분된다.
3) CRC(Cyclic Redundancy Check)
CRC는 통신 프로토콜에서 가장 많이 사용되는 오류체크방식이다. 한 비트가 아닌 여러 비트의 오류를 찾을 수 있는 방식이다. 오류 수정은 불가능하고 검출만 가능하다.
CRC 방법은 송신측과 수신측이 서로 제수를 약속한 상태에서 시작된다. 제수란 나눗셈에서 어떤 수를 나누는 수를 의미한다. 111010 데이터를 전송하려고 한다면 이를 서로 약속한 제수로 나누어준다.
데이터 : 111010
제수 : 1101
이진수 나눗셈을 하면 나머지로 제수보다 1bit 낮은 3bit 나머지가 나온다. 여기서는 010이 나온다. 010이 FCS가 된다.
데이터 + FCS = 111010010
송신측은 이렇게 프레임을 구성하고 수신측에 보낸다. 수신측은 서로 약속한 제수로 나누기를 진행한다. 111010010을 1101로 나누었을 때 나머지가 0이 나오면 오류가 없는 것이고 0이 아니라면 오류가 발생했다고 판단하여 프레임을 폐기한다.
이는 다항식(Polynominal)으로 표기 가능하다.
111010 = X5+X4+X3+X2
1101 = X4+X3+1
010 = X2
CRC는 보편적으로 사용하기 때문에 어떤 제수를 쓸지 표준으로 정해 놓았다. CRC-12는 FCS 12bit, 제수 13bit이다.
CRC-12 제수 : X12 + X11 + X3 + X + 1
이외에도 One's complement of Sum(1의 보수의 합) 방식과 해밍코드가 있다. 해밍코드는 자기정정부호로 2bit 오류를 검출해서 1bit의 오류를 수정할 수 있다.
'CS > NETWORK' 카테고리의 다른 글
다중화기(Multiplexer) (0) | 2021.06.21 |
---|---|
시그널 기본 용어 (0) | 2021.06.21 |
시그널 변환 (0) | 2021.06.21 |
시그널 (Signal) (0) | 2021.06.21 |
전송 매체(Media) (0) | 2021.06.21 |