본문 바로가기

개발👩‍💻/네트워크

14-1:Network Layer:Link Layer

728x90

Link layer, LAN

링크계층에서 동작하는서비스들에 대해 알아본다.

여기서 제공해주는 서비스들에는 에러를 검출하고 정정해주는 것이 있다.

링크계층에는 2가지 종류가 있다.

Point to Point- 포인트 채널, 브로드 캐스트 체널이 있다. 브로드캐스트채널을 하나의 채널을 공유를하는데 이때 어떻게 동시접속을 관리할 것인지 이런 것도 링크계층에서 제공하는서비스이고,

링크 계층에서는 주소를 어떻게 찾아가는지

이더넷과 몇가지 관련된 프로토콜에 대해서도 알아본다.

 

Introduction

링크 계층이 하는 역할은 하나의 노드에서 바로 인접해 있는 다른 노드로 데이터그램을 전송하는 역할을 한다.

 

 

빨간색 선들이 다 링크를 나타내고, 링크는 결국에 이렇게 인접해 있는 것들 사이에 데이터그램전송을 책임지는 역할을 한다.

링크계층에서 사용할 용어

- host(end-point) and router

둘은 모두 노드이다.

- link

각각이 인접해 있을 때 어떻게 연결을 하는지 보면 링크로 연결을 한다. 

사이에 있는 빨간색으로 표시되어 있는 것들이 링크이다

종류에는 무선과 유선이있다.

- frame

layer-2 인 링크계층에서는 여기서 사용하는 패킷은 프레임이라고 부른다. 

위층에서 내려온 데이터그램을 캡슐화해서 프레임을 만든다.

그렇게 해서 데이터그램이 있으면 데이터그램과 헤더를 캡슐화한 것을 프래임이라고 한다.

 

그래서 링크계층에서는 데이터그램을 전달을 하는  인접한 노드에 전달을 하는데, 이렇게 전송을 할 때 여러가지 링크가 있을 것이다. 이더넷, 와이파이..등등

이런 경우에 각각이 전부 다른 프로토콜을 사용할 것이다. 와이파이와 이더넷이 프로토콜이 다르다

이렇게 어떤 것을 사용하느냐에 따라서 프로토콜이 달라지고, 어떤 프로토콜을 사용하느냐에따라서 제공하는 서비스도 달라진다.

링크프로토콜은 신뢰할수있는 데이터 전송을 제공할 수도 있고 제공을 안할 수도 있다.

어처피 오류가 많이 발생하지 않는 유선인 상황 같을 때에는 굳이 reliable data transfer을 하지 않아도 딱히 문제가 없을 것이다. 그에 반에 무선인 상황에서는 이 reliable data transfer 관련 프로토콜이 존재하지 않는다면 굉장히 패킷이 공중에서 사라질 위험이 있을 것이다. 

링크 프로토콜의 특성에 따라 제공하는 서비스도 달라진다.

 

소스에서 목적지 까지 위 계층에서는 라우팅을 했다 위계층에서 경로를 정해놨다.

이동하는 것은 똑같은데 어떻게 이동하는지는 다 다르다.

 

링크계층에서 제공하는 서비스들을 살펴보자

링크계층에서 일단 제공하는 가장중요한 서비스는

프레이밍-프레임을 만드는 것

프레임으로 만드는 작업을해서 데이터그램이 위쪽에서 내려와 캡슐화를 해서 프레임으로 만들게된다.

링크계층에서 사용하는 헤더와 트레일러,

트레일러는 앞뒤로 붙이는 메터데이터라고 생각해면 된다.

또한가지 중요한것이 링크에대한 접근을 제공을 해준다. 실제로 링크에는 와이어리스, 와이파이, 이더넷 같은 것이 있다. 지금 사용하는 링크에 대해 어떻게 접근을 할것인지 제공을 해주어야 한다.

링크가 공유하고 있는 것이라면 어떻게든 나누어서 접근을할 수 있게 컨트롤을 해주어야하고,

링크게층에 프레임 헤더에 있는 MAC 주소를 가지고 ip 주소처럼 링크 계층에서 이 주소를 출발지와 목적지를 찾아서 프레임을 전달하는 역할을 링크 계층에서 해준다고 생각하면된다.

인접한 노드 사이에서 신뢰성있는전송을 제공할 수도 있고 안할 수도 있다.

이같은 경우 기본적으로 다시 리트랜스미션을 하는 방법이 있고, 오류가 발생을 했을 때 비트의 오류 발생했을 시 오류 검출할 수있는 테크닉들이 있었다. 이런 신회성있는 전송을 구현을 한다.

 

기본적으로 와이어리스 링크는 무선이다 보니 에러 비율이 높을 것이고, 이러한 신뢰성 있는 전송을 지원을 한다.

 

그리고 또한가지 나올 수있는 질문이, TCP, UDP 같은트랜스포트 계층에서도 리트랜스미션 같은 것을 해서 신뢰성있는 전송을하고 있었는데 링크계층에 이것이 또 있는 이유를 물을 수 있다.

생각을 해보면 트랜스포트 계층에서 사용하고 있는 세그먼트가 있었는데, 여기에 IP 해더를 붙이고, 위에다가 링크계층을 하나 더 붙이는 구조인데, 결국에 트랜트 포트 계층에서 보호하고 있는 것은 세그먼트에 대한 내용이다.

IP나 링크계층 헤더에 대한 것을 보호하지 못한다.

그렇기때문에 중복적으로 신뢰성을 위해서 에러 디텍션과 리트랜스미션을 한다고 생각하면된다.

 

링크계층에서 제공하는 서비스들이 몇가지 더있는데,

- 에러 검출

- 에러 정정

- 플로우 컨트롤

tcp에서 제공했던것과 비슷했던 것을 제공하는데

얼마나 빠르게 인접해 있는 애한테 패킷, 프레임을 전달을 할 것인지 판단하는 것.

- half-duplex and full-duplex

양방향으로 데이터를 동시에 전달을 할 수 있는지. 한번에 한 방향밖에 보낼 수있는지

동시에 일어날 수 있다면 FULL, 둘중에 하나만 한방향으로 보낼 수 있다면 half이다.

 

하드웨어와 소프트웨어와 펌웨어의 조합으로 링크계층은 이루어졌다. 

링크계층같은 경우 모든 장비모든 호스트에 존재한다.

기본적으로 네트워크 인터페이스 카드 NIC은 PC에 다 있다.

스마트폰 같은 경우 칩으로 박혀있다.

 

대부분 링크 계층은 NIC이나 칩으로 구현되어 있다.

 

PCI 슬롯에 얘를 꽂는데 PCI 버스를 공유하게 되고 결국에 이런 닉 카트를 꽂으면 해당 피시에서 무선 랜이나 유선랜에 접근을 할 수 있게 된다.

닉 카드에 모든 것이 구현되어 있는 것이 아니라, HW, SW 펌웨어 내에 모든 계층에 링크 계층이 구현되어 있다. 

컨트롤러 피지컬 부분이 NIC에 해당하는 부분이고, 

CPU에서 수행되는 소프트웨어 부분도 있다.

이것은 보통 펌웨어나 운영체제 계층에 일부 구현이 되어 있다.

 

여러개의 노드가 있을 때 어떻게 두개의 노드가 통신을하는지 보자

네트워크 계층에서는 데이터 그램으로 출발해서 링크계층으로 내려오는데, 이때 데이터그램을 프레임으로 캡슐화하는 작업이 필요하다. 링크계층의 헤더가 붙게된다.

에러 체킹, 신뢰성있는 데이터 전송, 플로우 컨트롤 등은 하드웨어 nic 카드 안에서 일어나느 부분이다.

 

반대쪽에서도 받으면 에러가 있는지 확인을 하고, 흐름제어 이런것들을 처리해주고, 데이터그램을 상위 레이어인 네트워크 계층으로 전달을 할 것이다.

전달을 하는 작업은 cpu에서 이뤄진다.

 

Error detection, correction

Error detection

EDC: Error detection and correction bits 

에러 검출과 정정을 위한 추가적인 비트를 의미한다.

여기서 말하는 D는 중요하게 생각하는 데이터이며, 깨지지않게 보장하고 싶은 원본을 의미한다.

보내려는 데이터가 datagram 으로 존재하고,

D만큼의 비트를 사용한다하면 추가적으로 EDC에 해당하는 비트들을 추가해서 보낸다.

 

그래서 밑에 존재하는 링크가 에러가 발생할 수있는 링크에서 사용한다해도 받는쪽에서는 받으면 모든 비트가 정상적인지를 판단할 수 있게된다. 같이 보내온 EDC를 가지고 검증 과정을 거친다.

모든 비트가 정상인지 확인하고 아니라면 오류가 검출이 된것이고,

정상이라면 데이터 그램을 위 계층으로 전달할 것이다.

 

에러검출은 udp, tcp에서와 마찬가지로에러가 실제로 발생했지만 검출하지 못했을 수도 있다.

프로토콜에 따라서 오류 검출 방법들에 따라 다를 수 있다.

추가적으로 사용하는 EDC 비트가 커질 수록 오류 검출을 더 잘할 수있고 정정도 더 잘할 수 있다.

 

몇가지 오류검출 방법에 대해 알아보자

페리티 체그 같은 경우 가장 단순한 형태의 오류 검출 방법이다.

싱글 비트 페리티를 사용한다면, 비트 하나만 사용하게 되고 데이터 비트가 D만큼 있다고 가정해보자.

그래서 이상황에서 1개의 비트를 더해 준다.

어떤 패리티 방법을 사용할것인지에 따라 EDC를 1으로 할지 0으로 할지 달라진다.

EVEN 패리티라면 짝수를 만드는 패리티이고, 이를 사용한다면 

위에서 보면 지금 1이 D에 9개가 있다.

그러면 이것을 짝수개로 만드려면 패리티 비트를 1로 만들면 1의 개수가 9개가 아니라 10개가 될 것이다. 

이런 식으로 이븐 패리티를 만들 수있고 이중에서 어떤 비트하나가 바뀌었다고 가정하면, 이 0이 1로 바뀌었다고 하면 모든 패리티 개수를 더하면 더이상 짝수가 아니라 홀수가 될 것이다. 이를 통해 오류가 발생했음을 알 수있다.

좀더 복잡한 이차원 패리티 방법이 있다.

예시를 보면 데이터가 있을때 5비트 단위로 3줄로 나눴고, 가로세로로 패리티 비트를 각각 구한다.

첫 줄에서는 1를 더해야 짝수가 되니, EDC가 1이 되고, 두번째 줄은 이미 짝수이니 0이고, 세번째 줄에 EDC는 1이 된다.

세로줄도 마찬가지이다.

 

모든 가로 세로줄에 대해 계산했을 때 값이 전부다 짝수가 나온다고 하면 에러가 없는 것이고,

만약에 어떤 지점을 계산했는데 홀수가 나온다면 패리티 에러를 검출 할 수 있게된다.

 

오류가 발생한 행과 열의 인덱스 넘버를 가지고 어떤 비트에서 오류가 발생했는지 알 수 있다.

 

정확이 어떤 비트에서 오류가 났는지 알 수있으면 그 비트를 0->1 혹은 1->0으로 뒤집어서 정정까지 할 수 있다.

 

패리티에서 좀 더 나아간것이 인터넷 체크섬이다.

앞쪽에서 다뤘듯이 UDP 세그먼트에서 16비트 단위로 쪼개서 더한다. 

1의 보수 형태로 더해서 이것을 가지고 더해서 체크섬 필드에 넣어서 전송을 한다.

나중에 리시버 쪽에서는 받은 세그먼트에 대해서 내용만 보고 체크섬을 계산하고

체크섬과 값을 체크를 해서 실제로 같지 않으면 에러가 발생한 것이고 같으면 정상인 것이라고 판단했다.

 

그렇긴 한데 인터넷 체크섬 방법을 사용하더라도 완벽하게 체크를 할 순 없었다.\

여러개의 비트 오류가 발생하게 되면 이 인터넷 체크섬도 오류를 검출하지 못했었다.

그래서 그런 문제를 해결하기 위해

 

Cyclic Redundancy Check(CRC) 를 사용하는데 좀 더 강력한 오류 검출을 제공한다.

여기서 나오는 개념을 보면

 D는 데이터 비트이고, G는 비트 패턴을 의미한다. 송신자와 수신자가 있으면 인접해있는 노드사이 정해진 비트의 어떤 패턴을 의미한다. 의미의 패턴의 조합이다. 대신의 비트수가 중요하다. 비트수는 r+1 이다. r은 데이터부분이 있고 EDC부분이 있던 것처럼, r은 EDC 부분과 같다.

r만큼의 비트가 있다고 했을 때 r+1만큼의 비트에 해당하는 비트 패턴을 양쪽노드가 합의를 해서 정한다.

그러면 결국에 CRC비트에 들어갈 비트를 정하게 된다.

비트를 정해서 포함한 비트를 반대쪽 리시버한테 보내게 되면 걔는 합친것을 비트 패턴으로 나눴을 때나머지 값이 0이 나왔다라고 하면 정상적으로 도착한 것이고, 나머지가 있다면 에러가 검출되는 방식이다.

CRC가 좋은 것은 앞에서 봤던 패리티, 체크섬방식에서는 에러가 연속해서 발생했을때 찾을 수 없었는데, CRC는 버스트에러, 에러가 연속적으로 발생하는 상황에서도 검출이 가능하다. 그래서 실제로 많이 사용되는 방법이다.

 

 

D*2^r이 의미하는 것은 r비트만큼 left shift를 한것이다.

그래서 아래 에시와 함께 보면 101110의 데이터가 있고, 제너레이터를 1001로 정했다고 하자.

그리고 제너레이터보다 비트수 1만큼 작은 것이 crc 비트의 수였다. 이것이 r비트였다. 그러므로 r비트는 3이다.

그러면 2^3만틈을 뒤에다 곱하게되면

왼쪽으로 세칸 밀어낸 것이다. 그러므로 101110000 이된다.

그리고 이를 G로 xor해주면 계산을 했더니 나머지가 011이 나왔다 

완전히 나눠떨러지지 않았으니, CRC 비트로 사용하게 된다.

세개의 비트 000을 임시로 추가를 했었는데 

그부분에 000이 아닌 011을 넣게된다.

그러면 101110011 이된다.

이것을 상대편에서 받아서 똑같이 나눠주면 g로, g는 센더 리시버 둘다 가지고 있다.

그래서 둘을 xor로 나누면 나머지가 0이 나올 것이다. 

그때 받는 쪽에서보면 나머지가 0이나오면 정상을 받은것이고

아니라면 어딘가에서 에러가 발생했다는 것을 알 수 있다.

그래서 crc같은 경우 상해적으로 에러가 연속적으로 발생하더라도 에러가 발생했다는 사실을 검출할수있다.

 

반응형

'개발👩‍💻 > 네트워크' 카테고리의 다른 글

14-3:Network Layer:Link Layer  (0) 2021.06.04
14-2:Network Layer:Link Layer  (0) 2021.06.04
13-2:Network Layer: control plane  (1) 2021.06.03
13-1:Network Layer: control plane  (0) 2021.06.03
12-2:Network Layer: control plane  (0) 2021.06.03