[데이터 통신] Data Link Control (DLC) (2)
Piggybacking ( 편승하다, 올라타다)
지금까지의 예시를 보면 sender는 보내기만 하고 receiver는 받기만 했다. 그러나 현실은 두 곳에서 서로에게 데이터를 전송한다. (양방향 통신)
양쪽에서 데이터를 전송하기 때문에 데이터를 한 번 보낼 때 seqNo와 ACK를 붙여(piggybacking 하여) 전송해야 한다.
(seqNo - 내가 보내는 데이터의 번호 , ack - 내가 받고 싶은 데이터의 번호)
이제부터 배울 HDLC 프로토콜은 훗날 배울 이더넷의 기초이기 때문에 잘 알아두어야 한다.
HDLC ( High level Data Link Control )
HDLC는 point to point, multipoint 링크의 통신을 위한 프로토콜이다. 실제로 쓰인다기보단 이론적인 성향이 강한 프로토콜이지만 이 프로토콜에 정의된 개념은 이더넷과 무선랜의 기초방법으로 사용되니 잘 알아두어야 한다.
HDLC가 제공하는 두 가지 전송모드에 대해 알아보자.
Normal Response Modes : NRM( 일반 응답 모드 )
이미 정해진 역할만 수행하는 방식으로 하나는 명령을 내리는 primary 역할을, 나머지는 응답만 하는 reponse 역할을 갖고 있다.
Asychronous Balanced Mode : ABM ( 비동기 균형 모드 )
우리가 현실에서 자주 접하는 통신모델의 방법으로 primary, response 역할을 둘 다 할 수 있는 형태이다. 때문에 데이터는 한쪽으로만 흐르지 않고, 양쪽 방향으로 흘러간다. ( 이를 위해 piggybackging 사용)
이상 HDLC에서 사용하는 전송모드였다.
누가 primary가 될지 정하는 것부터, 데이터를 받을 수 없는 상태임을 알려줘야 할 때 등을 위해 HDLC에선 데이터를 전송할 때 여러 개의 프레임을 사용된다. 종류는 I-frame, S-frame, U-frame으로 구성되어 있다. (편지 봉투가 3개 있는 거임 상황에 따라 선택.)
HDLC Frame
Flag : 프레임의 시작과 끝을 알려줌 ( 상위에서 온 데이터(information)에 Flag가 있을 시, ESC를 앞에 붙여 오해하지 않도록 함.)
Address : Source나 Destination의 주소가 들어감.
Control : 지금 전달된 프레임의 어떤 종류인지 알려줌. 종류가 3개이니 2bit로 표현. ( 앞의 2bit가 종류를 알려줌.)
User information : 상위에서 온 데이터. 전하고자 하는 메시지.
FCS : 에러검출용
주목해야 할 부분은 control이다. 세 프레임 모두 control 앞까진 똑같은 구조를 갖고 있다. control안에 들어간 값에 따라 뒤에 FCS가 올지 데이터가 올지 알 수 있다. 때문에 이 세 프레임은 자료구조가 다르다.
control 안에 들어가 있는 값이 0이면 I-frame, 10이면 s-frame, 11이면 u-frame이다.
일단 첫 bit만 읽어서 0인지 1인지를 구별하면 i frame 여부를 알 수 있다.
i frame (데이터)
i frame은 data를 싣고 가는 frame이다. 때문에 이와 관련된 정보가 header에 들어간다. N(S) 자리에는 내가 보내는 데이터의 시퀀스 넘버 (seqNo)가 들어가고 N(R) 자리에는 상대에게 받아야 할 데이터의 ACK 넘버가 들어간다. N(R) 뒤에는 데이터가 들어간다.
u frame (네트워크 설정)
u frame은 맨 앞에 11이 들어간다. 수신자는 앞의 두 비트 11을 읽어 U frame인지 판단한다. u frame은 연결설정에 사용되는 프레임으로 연결을 하거나 끊는 역할을 수행한다.(메시지 같은 데이터를 전송하진 않는다. 때문에 seqNo나 ack가 필요하지 않음)
Code 자리에는 미리 정해놓은 메세지 코드를 담아 전송한다. receiver 측이 U frame을 받을 경우, code 부분을 읽은 후 미리 정의되어 있는 테이블에서 찾아 의미를 해석한다. 또한 code의 내용에 따라 응답이 달라지는데, 이 응답 또한 어떻게 반응해야 할지 테이블이 정의되어 있다.( 약속 - ㅇㅇ가 들어오면 ㅁㅁ 이렇게 응답해!)
s frame (error and flow control)
s frame은 i frame과 u frame을 섞어놓은 frame으로 code와 ack 넘버를 전송한다.
맨 앞엔 10이 들어가며 code 자리엔 u frame과 마찬가지로 미리 의미가 정해져 있는 비트가 들어가서 어떤 메시지를 전달한다. ack 자리에는 내가 받지 못한 데이터의 ack 넘버가 들어간다.
확인응답 및 흐름제어와 오류제어에 사용된다.
프레임의 종류는 알았다. 이제 이 프레임들이 실제로 어떻게 동작하는지 그림을 통해 알아보자.
연결 / 연결 해제 요청
먼저 Node A 가 s frame을 보내서 연결을 요청한다.
Node B는 address를 통해 본인에게 온 프레임인지 확인한 후 앞 2개의 비트를 읽어 u frame인 것을 확인한다 그리고 뒤 5비트를 읽어 어떤 코드번호로 응답을 해야 하는지 알아낸다.( 00110으로 응답하라고? 오키오키)
이후 receiver 측에서도 u frame을 만들어 정해진 비트가 담긴 프레임을 전송한다. (연결 잘 받았고 우리 통신할 수 있어!)
이러면 둘은 이제 통신할 수 있다. 통신이 완료됐으니 메시지 데이터를 보낼 수 있다.
통신을 끊으려면 어떻게 해야 할까?
마찬가지로 u frame을 통해 disconnect 요청을 수행하면 된다. (00010 - 연결 끊어줘 )
그럼 응답을 잘 받았다는 의미로 u frame을 보내준다 ( 00110 - 어어 잘 받았고 알겠따 )
연결 후 데이터 전송 / 응답 과정
위 과정은 piggybacking을 사용하여 데이터를 전송 / 응답하는 과정이다. 왼쪽은 오류가 발생하지 않은 경우이며 오른쪽은 오류가 발생한 경우이다.
왼쪽
A_i : seqNo : 0 ACK : 0 (받은 게 없으니 0번 내놔)
A_i : seqNo : 1 ACK : 0 (받은 게 없으니)
B_i : seqNo : 0 ACK : 2 (A에게 두 개 받았으니, 2번 내놔!)
B_I : seqNo : 1 ACK : 2
B_i : seqNo : 2 ACK : 2
(더 이상 보낼 게 없으면 s_frame 사용. i_frame은 보낼 데이터가 있을 경우에만 사용 )
s_frame이 ack를 갖지 않으면 timer가 계속 돌기 때문에 ack를 보내줘야 함.
A_s :RR, ACK : 3 (B에게 받았으니, 3 내놔!)
오른쪽
B_I : seqNo : 0 ACK : 0
B_I : seqNo : 1 ACK : 0 ( error 발생 -> lost )
B_I : seqNo : 2 ACK : 0 ( 그림상 ack가 잘못되어 있음)
(b가 보낸 seqNo 1번이 오지 않았으니 다시 보내라는 의미)
A_s : REJ ACK : 1
B_I : seqNo : 1 ACK : 0 (쏴리 다시 보냄)
B_I : seqNo : 2 ACK : 0