minzzl
11강. [CH-03 Data Link layer] 본문
우선 OSI 7 layer에 대한 개념을 한번 더 짚고 넘어갑시다.
통신이 이뤄지기 위해 필요한 작업이 여러가지 있다고 했습니다. 이런 작업들을 7개의 계층으로 구분한 것이 OSI 7 layer이며 우리는 지금까지 물리계층이 하는일이라고 분류된 것들을 알아보았습니다. 데이터와 시그널의 상호변환, 시그널의 전송에 대해서 말입니다.
우리는 이제 데이터 링크 계층에 대해 알아볼 예정입니다.
약간의 스포를 하자면, 데이터 링크계층은 프레임이 원하는 곳으로만 정확하게 가도록해주는 역할과, 프레임이 도중에 손상되지 않도록, 혹 손상이 된다면 복구하도록하는 역할을 수행합니다.
우선 우리는 프레임에 대해 다시 짚어 볼 필요가 있습니다.
각 데이터가 전송을 위해 각 계층을 거치면 그 계층에 필요한 정보들이 담긴 헤더가 데이터에 붙게되고, 해당 자료구조를 나타내는 이름이 계층마다 달랐습니다.
여러 계층을 거쳐 데이터 링크 계층까지 오게되고, 데이터 링크 계층에서는 그를 프레임이라고 지칭한다고 언급한 적이 있습니다.
여러분의 컴퓨터안에서 프레임이 만들어지면, 이 프레임을 시그널로 바꾸고 전송하는 것은 물리계층의 역할입니다. 컴퓨터 내에있는 모뎀이 이러한 일을 담당합니다.
오늘 할 이야기는 프레임을 만드는 방법입니다.
문자열이 어플리케이션 계층을 거쳐, 전송 계층, 네트워크 계층까지 내려와 헤더가 붙여지면 이를 패킷이라고 합니다. 여기에 데이터 링크 계층의 헤더가 붙여지면 프레임이되는 것이고요. 여기서 집중할 것은 이 헤더가 담고 있는 정보입니다.
데이터 링크 계층의 역할
1. 프레임을 원하는 곳으로 전송하기
당연히 원하는 곳으로 전송하기 위해서는 주소 개념이 필요합니다.
현재 가장 많이 사용되는 데이터링크층의 프로토콜을 하나 소개하겠습니다. 바로 이더넷입니다.
우리가 자주 들어왔던 이더넷은 사실 데이터링크층의 프로토콜 이름이었습니다..!
아마도 MAC 주소(물리적 주고 혹은 이더넷 주소)라는 말을 들어본 적이 있을텐데요, 이 MAC 주소는 말그대로 이더넷주소입니다.
즉 이더넷이라는 프로토콜에서 사용하는 주소체계라는 뜻입니다.
이더넷에서는 각 컴퓨터의 고유 하드웨어 넘버로 구분합니다. 즉 오늘날 대부분의 네트워크에서 데이터 링크층의 프로토콜로 이더넷을 사용하기 때문에 대부분의 랜카드는 이더넷프로토콜을 따르며 만들어집니다. 따라서 어떤 랜 카드가 만들어질 때, 그 랜카드는 반드시 고유의 어떤 MAC 주소를 가지게 되는데, 이것을 가지고 있는 랜카드는 이더넷 프로토콜을 따르는 랜 카드입니다. 이것은 물리적으로 각인된 것이기 때문에 바꿀 수 없으며 물리적 주소라고도 불립니다.
주소 개념 도입의 필요성
우리는 물리계층에 대해 배웠기 때문에 송신이라는 것이 결국 시그널을 발생시키는 행위일 뿐이라는 것을 압니다. 따라서 송신을 한다는 것이 결국 전깃줄에 전압을 걸어주는 것일 뿐이라는 거죠.
만약 다음과 같이 연결이 되어있다면 호스트 1번이 전압을 걸어준다면, 2 3 4 5 모두에게 시그널이 전송되는 것입니다.
그래서 우리는 명확한 목적지를 나타내기위한 주소개념이 필요합니다.
실제로는 랜카드에서 주소를 검사하고 목적지가 아닌 경우 차단합니다. 즉 호스트 1이 2에게 프레임을 보냈지만 3 4 5가 어쩔 수 없이 연결되어 있어 프레임을 받게 되더라도, 이 프레임을 커널로 무작정 옮기는 것이 아니라 랜카드라는 장비에의해 프레임이 어느 주소를 향해 온건지 검사하고 자신이 아니면 무시합니다.
즉 원하는 곳으로 보내는 것은 시그널을 정말로 원하는 곳으로 보내는 것을 의미하지 않습니다. 같은 전깃줄에 연결되어 있는 한 시그널은 연결되어 있는 모든 호스트들에게 어쩔 수 없이 전송됩니다.
우리는 명확한 주소를 필요로 한다고 했습니다. 이를 위해 랜 카드마다 자신의 고유한 주소가 필요로 합니다. 오늘날 사용되는 데이터 링크층의 프로토콜인 이더넷에서 이더넷 주소라는 것을 사용합니다. 흔히들 알고 있는 MAC주소가 이와 같습니다. 모든 랜카드는 생산되는 순간 자신의 고유한 주소를 가지며, 이를 랜카드라고 하고 바뀌지 않습니다.
이더넷 프레임은 다음과 같은 구조로 되어 있습니다.
가장 앞의 start delimiter은 프레임의 맨 앞을 표시하며, 수신자가 지금부터가 하나의 프레임이라는 것을 인지할 수 있도록 합니다.
중요한 것은 그 뒤에엤는 목적지 MAC과 출발지 MAC입니다. 목적지 MAC은 당연히 수신자 입장에서 이 프레임을 받으면 목적지가 자신이 맞는지 확인해야하므로 필요하며 출발지 목적지는 어떤 컴퓨터가 자신에게 보낸것인지 알아야하므로 필요합니다.
2. 프레임의 손실을 방지하기
데이터 링크계층은 원하는 곳으로 보내기 기능 외에도 프레임이 손실되지 않도록 하는 기능을 포함해야합니다.
그런데 우리는 물리계층에서 각 비트를 잘보내는 방법에 대해 이미 배웠습니다. 사실 A가 B에게 송신한 프레임을 B가 받았다고 했을 때 이 프레임은 랜카드로 우선 들어가고, 랜카드에서 운영체제의 커널의 버퍼로 들어갑니다. 그리고 CPU는 이 버퍼에 있는 프레임을 1 클럭당 32 Bit 혹은 64bit의 속도로 퍼날라서, 이 프레임을 메모리의 원하는 곳으로 옮깁니다. 가령 채팅 프로그램 사용중이었다면, 채팅 프로그램이 사용할 수 있는 메모리 위치로 옮겨야합니다.
문제는, 프레임이 상당히 크고, 전송 속도 또한 대단히 빠른데 CPU 클럭이 모자란 경우에 생깁니다. 프레임이 예를 들어서 4KB라고 가정을 해봅시다. 이 프레임이 1초에 하나씩 들어온다고 가정하면 CPU는 1초내에 이 버퍼내에 있는 프레임을 다 퍼 날라야하는 것입니다.
32bit의 CPU라고 할 때, 한번의 클럭당 32bit, 즉 4 byte를 옮기므노 4KB를 옮기기 위해서는 1000번의 클럭이 필요합니다..
만약 CPU가 1초에 1000 클럭 미만으로 작동을 한다면 전에 전송한 것을 다 옮기기도 전에 다음 프레임이 들어와 덮어씌워지게됩니다. 그러면 비트들은 분명히 오류가 없이 전달이되었더라도 프레임으로 볼 때는 잘못 전송되는 현상이 생기는 것입니다.
그렇다면, 수신자가 버퍼에서 이번에 받은 프레임을 다 퍼 나르기 전에, 송신자가 새로운 프레임을 보내지 않으면 이와 같은 문제를 해결할 수 있을 것입니다.
이와 같은 데이터링크 층의 프로토콜을 STOP & WAIT 라고 하며 이는 프레임의 손실 방지를 위한 프로토콜입니다.
STOP & WAIT 프로토콜
해당 프로토콜의 기존적인 아이디어는 A가 B에게 프레임을 하나 보내고, A는 B에서 다음 걸 보내라는 연락이 올 때까지 기다립니다. B는 프레임을 받고 나면, 버퍼에서 전부 메모리의 원하는 위치로 퍼 나른 뒤 Ack, 즉 다음 것을 보내라는 프레임을 전송합니다. A가 이 프레임을 받으면 다음 프레임을 B에게 다음 프레임을 전송합니다.
또한 각각의 응답에 대한 타이머도 당연히 존재합니다. 타이머가 없다면 어떻게 될까요?
A가 보낸 프레임이 도중이 손실이 되어 B는 아무것도 받지 못해 계속 A의 응답을 기다리고, A 또한 B가 잘 받았다는 응답을 받을 때까지 기다리는 상황이 일어날지도 모릅니다. 이를 위해 타이머가 존재하고 타이머 내에 응답이 없다면 재전송을 해줍니다.
사실 A가 B에게 무언가를 보냈는데, 오래 기다려도 Ack가 오지 않는 이유는 둘 중 하나 입니다. A가 보낸 프레임이 가는 도중 손상되었거나, 아니면 B가 이걸 받기는 했는데 보낸 Ack가 가는 길에 손상되었거나.
전자의 경우에는 그냥 타이머에 의해 시간이 오버되었을 때 재 전송해주면됩니다. 그런데 후자도 이와 같을까요? 아닙니다.
B의 Ack가 실종되었을 경우 전자와 같이 타이머에 의해 오버가 되면, A는 자신이 보낸 프레임이 제대로 전송이 안 되었다고 생각하고 아까 보냈던 것을 다시 보냅니다. 그러면 B입장에서는 중복된 데이터를 받게되는 것입니다.
이런 문제를 해결하기 위해 타이머 외에도 시쿼스 넘버가 필요합니다. 프레임에도 순서를 붙이는 것이죠.
전체적인 전달과정은 다음과 같습니다.
Go Back N 프로토콜
Stop & Wait가 매우 안정적인 프로토콜이기는 하나, 속도가 매우느립니다.
프레임을 한번에 하나만 보내며, 송신자가 보낸 프레임을 수신자가 잘 처리한 뒤 Ack를 보내기 전까지 회선이 놀고 있기 때문입니다.
즉 회선을 효율적으로 사용하지 못하는 것입니다.
그래서 다음과 같은 아이디어가 등장합니다.
일단 여러개를 마구 보내고, 운좋게도 수신자가 다 받으면 그 다음 프레임들을 보내면 되고,
만약에 놓치는게 있다면 놓친 부분부터 다시 보내주면 된다!
사실 이렇게 뭉탱이로 보내더라도 프레임이 실종되는 일이 그리 흔한일이 아니기 때문에 결국 수신자는 잘 받게됩니다. 만약 한개의 프레임이 실종되었다면 이 3개의 프레임을 몽땅 다시 보내면 됩니다.
Selective Repeat ARQ 프로토콜
그런데 Go Back N도 문제가 있습니다. 프레임 하나만 잘못되어도 이미 연달아 보낸, 전송에 성공한 나머지 프레임들까지 모두 재전송해야한다는 것입니다. 이러한 문제를 해결하기위해 Selective Repeat ARQ 프로토콜에서는 수신자측에도 버퍼를 두게됩니다.
위의 Go Back N과의 예시와 동일한 상황입니다. Selective Repeat ARQ에서는 수신측의 버퍼에 1이 없는 것을 확인하고(2는 왔으니) 1번 프레임을 못받았으니 보내라라는 NAK1을 A에게 보냅니다.
그러면 지금까지 송신자와 수신자가 구분한 후, 데이터 송/수신 상황에서 어떻게 에러를 컨트롤 할 수 있을지 알아봤습니다. 그런데 사실, 대부분의 통신에서 송신자와 수신자가 정해진 경우는 거의 없습니다. 대부분 서로 다 송/수신이 가능해야하는 것이죠.
그러면 두 쪽 모두 Ack(프레임을 잘 받았다), Nak(못받았으니 보내줘) 를 보낼 때 자신이 보내고자 하는 프레임의 내용도 함꼐 보낼 수 있으면 좋을 것 같습니다. 쉽게 다시 한 번 말해보자면, A가 B로 프레임을 보내면, B는 A에게 ACK, NAK만 보내는 것이 아니라, B가 A에게 보내고자 하는 프레임을 보내면서 거기에 ACK, NAK를 끼워보내면 좋을 것 같습니다.
이를 위해 다음과 같은 구조를 가지는 프레임이 개발되었습니다. 그리고 이 프레임을 사용하는 프로토콜을 HDLC(High-level Data Link Control) 프로토콜이라고 합니다. 사실 이는 오늘날 데이터 링크층의 프로토콜로 사용되는 이더넷의 조상격입니다. 이더넷도 이와 같은 유사한 구조를 가지고 있습니다.
3가지 다른 형태를 가지고 있는데요,
I-frame은 데이터와 ACK/NAK를 같이 보낼 때,
S-frame은 ACK/NAK 만 보낼 때,
U-frame은 연결 관리 요청과 ACK/NAK를 보낼 때
사용됩니다.
예를 들어봅시다.
A가 B에게 무언가를 보냈는데, B도 A에게 무언가를 보낼게 있는 상황이라고 가정합시다.
그러면 B는 Ack와 B가 보내고자 하는 데이터를 함께 보내야합니다.
이때 Ack는 Control이라고 쓰여있는 위치에, 데이터는 User information이라는 위치에 넣어보냅니다.
그 다음으로 A가 B에게 무언가를 보냈는데, B는 A에게 보낼 것은 없고 Ack만 보내면 되는 상황을 가정해봅시다.
User imformation 칸이 없는 S-frame이 적절할 것입니다.
이와 같이 상황에 따라 사용되는 frame이 달라진다면 어떤 frame인지 구분할 칸도 필요할 것입니다. 이는 Control에 기록이 됩니다.
Piggy backing
이렇게 Ack와 Nak도 같이 끼워보내는 것을 피기백킹이라고 합니다. 즉 HDLC 프레임 혹은 그에서 파생된 유사한 프레임 구조를 사용하는 프로토콜을 피기패킹을 지원한다고도 말 할 수 있습니다.
'전공공부 > 데이터통신' 카테고리의 다른 글
번외. Evolution from 1G to 4G (0) | 2022.12.13 |
---|---|
12강. [CH-02 Physical layer] Switching(스위칭) (2) | 2022.12.12 |
10강. [CH-02 Physical layer] Multiflexing(다중화) (1) | 2022.12.11 |
9강. [CH-02 Physical layer] Analog(data) to Analog(signal) (0) | 2022.12.11 |