가장 먼저 공부해 볼 계층은 바로 데이터 링크 계층으로, 줄여서 Link 계층이라고도 부릅니다.
데이터 링크 계층은 포인트 투 포인트(Point to Point) 간의 신뢰성 있는 전송을 보장하기 위한 계층입니다. 즉, 서울에 있는 A라는 사람이 대구에 있는 B라는 사람과 통신을 할 때, 서울에서 대구까지 한 번에 데이터를 보내는 것은 아닙니다. 그 사이에 있는 수많은 노드들을 거쳐 결과적으로 목적지에 도착하게 되는데, 데이터 링크 계층은 현재 노드에서 바로 다음 노드로의 전달에 관한 부분을 책임집니다.
데이터 링크 계층은 크게 프레이밍(Framing), 오류 제어(Error Control), 그리고 흐름 제어(Flow Control)라는 기능을 담당합니다. 프레이밍은 상위 계층인 네트워크 계층으로부터 패킷(Packet)을 전달받아 데이터 링크 계층의 정보를 붙여 프레임(Frame)으로 만드는 작업입니다. 그리고 흐름 제어는 수신 측과 송신 측의 기기 성능 등의 차이로 데이터 전송의 속도 차이가 발생할 때 이를 제어하는 작업입니다. 오류 제어는 당연히 전달하는 데이터에 오류가 존재하는 지를 판별하는 작업입니다. 이번 글에서는 이 중 오류 제어에 대해서 자세하게 알아볼려고 합니다.
우선 오류를 제어하기 위해서는 오류를 검출하는 작업이 필요합니다. 아무리 좋은 프로토콜을 사용하더라도 언제든 오류는 발생할 수 있습니다. 그래서 상위 계층인 네트워크 계층으로부터 받아오는 패킷의 뒷부분에 추가적인 비트를 추가하여 오류를 검출할 수 있도록 하는 방식을 사용합니다. 이 추가적인 비트가 바로 패킷의 뒷 부분에 추가되는 프레임의 Trailer 부분이 되겠습니다.
오류를 검출하기 위한 방식에는 여러 가지가 있으나 그 중 대표적인 두 가지를 살펴보도록 하겠습니다.
1. Parity Check (패리티 검사)
패리티 검사는 데이터 뒤에 하나의 비트를 추가하여 오류가 있는지 찾아내는 방법입니다. 데이터는 0과 1로만 이루어져 있기 때문에, 마지막에 비트 하나를 추가해서 데이터의 1의 총개수를 짝수 또는 홀수로 맞추는 형태입니다. 짝수로 맞추는지 홀수로 맞추는지는 정해놓기 나름이기 때문에 여기서는 짝수로 맞추는 것으로 가정하도록 하겠습니다. 참고로 짝수로 맞추는 경우를 Even Parity, 홀수로 맞추는 경우를 Odd Parity라고 합니다.
예를 들자면, 데이터가 0010110 이라고 하면, 1이 총 9개가 존재하는 것을 확인할 수 있습니다. 이러한 경우, 마지막에 1을 붙여서 00101101로 만들어 1의 개수를 짝수로 만들어주는 것입니다. 송수신 과정에서 중간에 하나의 비트가 잘못되어 0 대신 1이 보내진다해도 1의 수가 홀수가 되므로 오류가 있다는 것을 탐지하고 재전송을 요청할 수 있습니다.
하지만 이 방법은 말로만 들어도 허술한 부분들이 많습니다. 2개, 또는 4개 등 짝수 개의 비트가 잘못 보내져서 우연히 1의 개수가 짝수가 되면 오류가 있다는 것을 검출할 수 없을 것입니다. 그리고 오류가 발생한 정확한 지점을 알아내기도 어렵습니다. 대신 추가로 붙여줘야하는 비트의 수가 적다는 장점이 있기 때문에 오류 발생이 거의 없거나 비동기 전송을 할 때는 적합할 수 있습니다.
그래서 이 방법을 조금 발전시켜 2차원의 패리티(two-dimension bit parity)를 이용하는 방법이 등장합니다. (앞에서 사용한 방법은 single bit parity라고 합니다.) 말 그대로 데이터를 가로로만 1의 수를 세지 말고 세로로도 세자는 아이디어입니다. 이 방법을 블록 합 검사 (Block Sum Check)라고도 부릅니다. 아래의 그림을 보시면 이해가 되실 것 같습니다.
당연하게도 2차원 패리티 검사가 단일 패리티 검사에 비해 훨씬 높은 오류 검출률을 보여줍니다. 하지만 추가적인 비트가 많이 필요하고, 단일 패리티 검사와 유사하게 가로, 세로 방향으로 몇 개의 비트가 동시에 오류가 나면 오류를 찾아내지 못하는 경우가 발생할 수도 있습니다.
2. CRC (순환 중복 검사, Cycle Redundancy Check)
CRC는 위의 두 방법에 비해 굉장히 강력한 오류 검출 방법입니다. 데이터를 전송할 때 데이터의 값에 따른 CRC값을 계산하여 데이터에 붙여주고, 받는 쪽에서는 받은 데이터의 값으로 CRC를 계산하여 받은 CRC 값과 같은지 대조하는 방법입니다. 이 두 값이 다르면 데이터 전송 과정에서 오류가 추가되었다는 사실을 알 수 있습니다.
CRC 연산은 원래 존재하는 데이터를 제수(divider)로 나눗셈 또는 exclusive 연산을 하는 것으로 볼 수 있습니다. 제수는 CRC의 비트 개수보다 하나가 더 많아야 합니다. 예시를 보면서 이해를 하는 것이 수월할 것 같습니다.
CRC의 크기는 정하기 나름이고, 여기서는 3자리로 가정하고 진행하겠습니다. CRC가 3자리이면 Divider는 그 보다 1 큰 4자리 수로 정해줍니다. 그리고 위와 같은 exclusive연산을 하여 CRC 값을 구해줍니다. 그리고 구한 CRC 값을 원래의 데이터에 붙여, 위의 예시를 따르면 101110011과 같은 꼴로 송신을 해줍니다.
이미 Divider의 값을 알고있는 수신 측은 해당 코드를 받으면 Divider를 가지고 연산을 해줍니다. 나머지 값을 원래의 값 제일 뒤에 붙여두었기 때문에 Divider를 가지고 연산을 하면 최종 나머지 값이 0이 되어야 합니다. 만약 0이 되지 않는다면, 오류가 있는 것으로 판단하면 됩니다.
'전공공부 > 컴퓨터망 (Computer Network)' 카테고리의 다른 글
[컴퓨터망] Link Layer (5) - Ethernet Switch (0) | 2021.01.25 |
---|---|
[컴퓨터망] Link Layer (4) - Ethernet (0) | 2021.01.24 |
[컴퓨터망] Link Layer (3) - MAC Address and ARP (0) | 2021.01.23 |
[컴퓨터망] Link Layer (2) - Multiple Access (2) | 2021.01.14 |
[컴퓨터망] Introduction (0) | 2021.01.10 |