Link Layer
2계층은 인접한 스테이션간의 신뢰성 있는 통신을 보장한다. 여기서 인접한 스테이션이란 직접 연결되어 있는 다른 네트워크 장비라고 생각할 수 있다. 데이터를 전송하면 여러 네트워크 장비를 거치며 최종 목적지까지 도달하게 될텐데, 매 과정마다 자신과 가장 인접한 네트워크 장비에 데이터를 보내는 과정이 포함될 것이다.
2계층은 그러한 인접 스테이션간의 데이터 전송 신뢰성을 보장하는 계층이다. 어떻게 보장한다는 걸까? 먼저 신뢰성을 보장한다는 것을 크게 2가지로 분류하면 다음과 같다.
- 데이터가 깨지거나 누락되지 않아야 한다.
- 여러 인접 스테이션이 한 인접 스테이션으로 데이터를 전송할 때 데이터가 겹치지 않고 문제없이 전송되어야 한다.
이 두가지를 보장해주는 것이 사실상 2계층에서 제공하는 핵심 기능이며 이를 sublayer 로 분류한다. 먼저 첫번째는 error detection & error correction 기능을 통해 보장되며, 두번째는 MAC(Media Access Control) 이라는 프로토콜을 통해 보장된다.
2계층에서 보장하는 두가지 기능은 1계층에 따라 다양하게 구현된다. 예를들어 CRC (Cyclic Redundancy Check) 라는 error-detection 기능은 Ethernet (유선 LAN), 802.11 WiFi 등에 적용되며, MAC 프로토콜 관련하여 Ethernet 에는 CSMA/CD 방식이, WiFi 에는 CSMA/CA 방식이 사용된다.
구현의 차이가 발생하는 이유는 매체의 특성에 기인한다. 유선에 Ethernet 에 비하여 WiFi 의 경우에는 데이터 전달이 실패할 확률이 더 높기 때문에 다른 방식의 MAC 프로토콜이 사용될 것이다.
위 두가지 sublayer 를 살펴보기에 앞서, 2계층이 어떤식으로 구성되어있는지 확인하기 위해 자주 활용되는 네트워크 장치인 허브와 스위치와 Link Layer 의 관계에 대하여 알아보자.
두가지 유사한 방식으로 스테이션 끼리 연결되고, 패킷을 모아 한 곳으로 내보내는 기능을 수행한다. 그렇다면, 이 두가지의 차이는 무엇일까? 가장 중요한 차이는 스위치는 2계층의 기능 error-detection 과 MAC 프로토콜을 구현하는 반면 허브는 그저 전달의 역할만 수행한다는 것이다. (이에 따라 스위치가 더 비싸다)
여기서 MAC 프로토콜을 구현하지 않는다는 것은 그저 broad casting 의 용도로 쓰인다는 것을 의미한다. 이는 한때 여러 장치를 연결하기 위해 LAN(로컬 영역 네트워크) 에서 주로 사용되었다. 하지만 지금은 대부분 더 나은 성능과 2계층 기능을 제공하는 스위치로 대체되었다.
여기서, 한번 더 생각해 볼만한게 있다. PC와 스위치의 관계가 인접 스테이션의 관계는 맞지만, peer-to-peer 관계가 아니라는 점이다. 처음에는 인접 스테이션과 peer-to-peer 가 같은 의미라고 생각해서 이 부분이 헷갈렸는데 두가지는 다른 의미로 사용되는 용어이다. 이를 확실히 정리하고 넘어가자.
먼저, 인접 스테이션이라는 용어는 위에서 설명했듯이 인접해 있는 서로 직접 연결된 장치를 의미한다. 이웃 장치에는 호스트, 스위치, 게이트웨이 등이 포함될 수 있다.
그에 비하여 peer-to-peer 관계는 각 노드가 동등한 권한을 가지며 중앙 서버나 중개 장치 없이도 네트워크의 다른 피어와 직접 통신할 수 있다는 특징을 가지고 있다. 즉, P2P 의 모든 피어는 서로에게 클라이언트 서버 역할을 동시에 수행할 수 있으므로 다른 피어에게 리소스를 요청할 수 있다. 위 이미지에선 스위치 이후에 게이트웨어와 PC 의 관계가 P2P 라고 볼 수 있는 것이다.
다음으로 error correction 과 error detecion 에 대하여 보다 자세히 알아보자
error detection & error correction
2계층에선 RDT(Reliable Data Transfer, 신뢰성 있는 데이터 전송)를 위해 error detection 과 error correction 기능을 제공한다.
error detection 은 말그대로 에러가 있는지 검출하는 역할을 하며, error correction 의 경우는 더 나아가 이를 원래 상태로 복원하는 기능까지 수행한다.
error correction 이 보다 발전된 기능을 제공하지만, 그 만큼 오버헤드가 발생하기 때문에 오히려 비효율적일 수 있음을 유의해야 한다. 오히려 detection 만 진행하고, 실패한 경우에 다시 보내도록 하는 것이 효율적일 수 있다. (에러가 자주 발생하지 않을 수록 correction 기능을 구현할 필요성이 없어진다)
해당 기능의 실제 구현을 살펴보자
single bit parity & 2D bit parity
먼저, 패러티 방식이 존재한다. 간단하게 알아보면, 데이터 끝에 추가적인 비트를 추가하여 전체 1의 개수가 짝수인지 홀수인지 구분하며 에러를 검출하는 방법이다.
single bit parity 에선 사실상 1개의 비트 에러만 검출 가능하며, 만약 2개의 비트가 에러가 난다면 에러가 나지 않은 것으로 파악되는 단점이 존재한다.
2D 는 이보다는 개선된 방식이다. 1 비트 에러의 경우 detection 후 correction 까지 가능하다. 다만 2개의 에러가 난다면 correction 이 불가능하다ㄷ누.
사실 이 패러티 방식은 위와 같은 단점 때문에 실제로는 잘 사용되지 않는다고 한다. 주로 에러 검출을 위해선 Internet checksum 이나, cyclic redundancy check 이 사용된다. (다만 internet checksum 은 4계층에 속하며, 비교적 간단하게 구현되어 처리되는 반면, CRC 의 경우 2계층에서 보다 하드웨어를 통해 구현되어 보다 복잡하지만 빠르다)
2계층에 속하는 CRC 에 대해서 알아보도록 하자
CRC (cyclic redundancy check)
앞서 한번씩 언급되었듯이, CRC는 error-detection 기능을 제공하며 Ethernet, 802.11 WiFi 등에 사용된다. 하드웨어로 구현되어 매우 효율적이며 연속적인 에러를 모두 검출할 수 있다. 에러역시 네트워크 트래픽과 유사하게 burst 하게 발생하기 때문에 연속적인 에러를 검출할 수 있다는 건 큰 장점이다.
R, G 비트와 총 검출 가능한 연속된 비트의 수에 관계에 대하여 간략하게 설명해 보자면, 64bit CRC 비트를 사용한다는 뜻은 G가 65bits(r+1 bits)이고 R이 64bits (r bits) 라는 의미이고, 이 경우 r+1 보다 작은(이 경우엔 65비트 미만) burst error는 모두 잡아낼 수 있다. 즉, 64비트까지의 에러를 잡아낼 수 있다.
이 때 G값은 수학자들에 의하여 효율성에 따라 결정된 고정적인 값이다.
위 예시에선 G값을 4비트짜리를 선택했으며, 이에 따라 데이터 비트 뒤에 G의 비트 수보다 하나 적은 만큼의 길이로 0비트를 추가하였다. 이후 G값으로 XOR 연산을 반복하며 최종 R bits를 구해내는데, 이 때 이 값이 CRC 비트라고 할 수 있다. 송신측은 기존에 추가했던 0비트들 대신 이 CRC 비트 값을 넣어 (아마도 OR 연산) 데이터를 송신한다. 수신측에선 받은 데이터와 CRC 비트값을 같은 G값으로 나누며 최종적으로 R비트를 확인하여 all-zero 비트가 아니라면 에러가 발생했다고 판단한다. 이 경우, 최대 3비트 까지의 연속적인 에러를 잡아낸 것이라고 볼 수 있다.
CRC 의 보다 자세한 동작은 https://youtu.be/A9g6rTMblz4 이 유튜브 영상을 참고해도 좋을 것 같다.
다음으론 MAC 프로토콜에 대하여 알아보자
MAC
MAC 프로토콜은 앞서 언급하였듯이 여러 장치에서 통신 매체를 공유할 때 발생하는 충돌을 방지하기 위한 프로토콜이다.
2계층에 가장 많이 사용되는 이더넷이나, 우리가 주로 사용하는 WiFi 와 같은 경우 모두 여러 노드가 공유 매체를 사용하여 데이터를 전송하기 때문에 각각의 특성에 맞는 방식으로 MAC 프로토콜을 구현하였다.
MAC 프로토콜에 대하여 자세히 알기 위해선 MAC 주소에 대하여 알아야 한다. MAC 주소란 2계층을 구현한 모든 장비에 포함되는 고유한 식별자로, 이는 NIC에 할당된다. 여러 2계층 장비들은 이 MAC 주소를 통해 서로를 식별하고, 원하는 대상에게 데이터를 보낼 수 있는 것이다.
2계층의 대표적 장비인 스위치는 MAC 주소를 통해 여러 노드들을 연결해 주기 때문에 독립적으로 2개의 노드를 연결할 수 있다. 이를 unicast, traffic isolation 이라고도 부른다. 그 외에도 인접한 모든 노드들에게 broadcast 또한 가능하다. 이를 위해서 인접한 노드들의 모든 MAC 주소가 테이블 형태로 저장되어있다.
어떤 방식으로 MAC 프로토콜을 구현해 왔는지, 어떻게 발전해 왔는지를 살펴보자
먼저 channel partitioning 방식은 말 그대로 채널을 미리 여러 조각으로 분리해 두는 것이다. 공산주의 같은 개념으로 공평하게 채널을 나눠주는 것인데, 네트워크 트래픽은 burst 하게 일어나기 때문에 매우 비효율적이라고 볼 수 있다.
taking turn 방식은 키를 넘겨가며 사용하는 방식으로 해당 key 는 번갈아가면서 서로에게 전달된다. 하지만, 문제는 한 노드가 키를 잡았을 때 많은 데이터를 전송해야 하는 경우 다른 노드들은 무한 대기상태에 빠지게 된다.
마지막으로 random access 방식이 있다. 각 노드는 자신이 데이터를 전송해야 한다면 바로 이를 보내는 방식이다. 그렇기 때문에 충돌을 방지하고 해결하는 기술이 필요하다. 현재 주로 사용되는 CSMA/CD, CSMA/CA 가 여기에 속한다.
처음부터 CSMA 방식이 사용된 것은 아니었다. random acess 방식의 발전은 ALOHA -> Slotted ALOHA -> CSMA 순으로 발전되어 왔다.
Pure (unslotted) ALOHA
가장 단순한 방식의 random access 기법이다. 각 스테이션 데이터가 준비되면 이를 바로 보내며, 수신지에선 충돌이 발생하였다면 해당 프레임을 버리게 된다. 각 스테이션은 ACK 신호를 받지 못하였다면 데이터를 다시 전송하는데, 모두 똑같이 동시에 데이터를 보낸다면 같은 충돌이 계속 반복되기 때문에 random backoff 방식으로 약간의 랜덤시간 지연 후 재전송한다.
Slotted ALOHA
ALOHA의 개선된 버젼이다. 데이터 패킷 전송에 필요한 시간에 따라 슬롯을 구분하며, 각 스테이션은 슬롯이 시작될 때만 데이터를 전송할 수 있다. 이는 완전히 임의의 시간에 전송하는 방식보다 충돌을 줄여주게 된다. 그러나 여러 장치가 동일한 시간 슬롯에 전송을 시도하는 경우 여전히 충돌이 발생할 수 있다. Slotted ALOHA는 충돌 확률을 줄여주기 때문에 ALOHA 에 비해 더 나은 성능을 제공하지만, 여전히 효율성 및 확장성 측면에서 한계가 존재한다.
CSMA
CSMA의 중요한 특징은 데이터를 전송하기 전 먼저 채널의 상태를 감지한다는 것이다. 즉, 이미 채널이 다른 스테이션에 의하여 사용되고 있다면 데이터를 전송하지 않는 방식으로 충돌의 가능성을 매우 낮춘다. (여기서도 ALOHA 와 마찬가지로 random backoff 이후에 다시 데이터를 전송한다) 이 방식이 가능한 이유는 2계층 채널의 특성에 기인하는데, 다른 스테이션이 데이터를 스위치에 전송할 때 실제 물리적으로는 이 데이터가 다른 모든 스테이션에게도 전달 된다. 여러 수신측에선 이를 자신에게 온 데이터인지 확인하고 아니라면 이를 처리하지않는다.
하지만, 이 방식에도 여전히 충돌 가능성은 존재한다. CSMA/CD 의 예시와 함께 살펴보자
t0의 시점에 왼쪽에서 두번째 노드가 채널을 감지한 후 빈 것을 확인 후 데이터 전송을 시작한다. 이 때 t1 시점에 가장 오른쪽 노드가 데이터 전송을 시작하려 한다. 이를 위해 네번째 노드는 위해 채널의 상태를 확인하는데, 이미 두번째 노드에서 데이터 전송은 시작되었지 네번째 노드에게 도달되지 않은 상태로, 네번째 노드는 채널이 비었다고 판단하고 데이터를 보내게 된다. 그렇게 되면 잠시 후 충돌이 발생하게 되는 것이다.
CSMA/CD 에서는 처음 데이터 전송시 뿐만 아니라, 데이터를 전송 하는중에도 지속적으로 채널을 모니터링 하기 때문에 충돌이 감지되면 이를 바로 알아채고 즉시 전송을 중단한다. 위 이미지에 collision detec/abort time 이 이를 나타낸다. 앞서 말했듯이 CSMA/CD 는 이더넷에 사용되는 기법이며, 유선환경이기 때문에 지속적인 채널 모니터링이 수월하게 가능하다.
그에 비해 CSMA/CA 는 무선으로 데이터를 전송하기 때문에 충돌 감지가 매우 까다롭다. 따라서, CSMA/CA 는 충돌을 감지하는 것보다 충돌을 피하는데 중점을 둔다. DIFS(분산 프레임 간 공간) 대기 기간이라는 개념을 도입하여 채널이 비어 있음을 감지해도 고정된 기간동안 대기한다. 이 대기 시간을 통해 채널이 사용 가능 상태가 되기를 기다리던 다른 장치의 전송과의 충돌을 줄일 수 있다.
CSMA/CD 와 CSMA/CA 는 승인 메커니즘에서도 차이를 보인다. CSMA/CA 에서는 명시적 승인(ACK)을 사용하여 성공적으로 데이터가 전송되었는지 판단한다. 그에비해 CSMA/CD 에서는 명시적 승인이 사용되지 않으며 충돌이 감지되지 않았다면 전송이 성공한 것으로 간주한다.
LAN
2계층은 네트워크의 특성에 따라 범위에 LAN (Local Area Network), WAN (Wide Area Network) 으로 구분된다 (각각은 다시 유선, 무선으로 구분된다). 여기선 LAN과 WAN의 차이를 간단하게 범위가 좁으면 LAN, 범위가 넓으면 WAN 정도로 파악하고 넘어가자.
LAN 에는 앞서 여러번 언급되었던 Ethernet, 802.11 Wi-Fi 등이 포함되며 그에비해 WAN 에는 광섬유 등이 물리 매체로 사용되며, Fremae Relay 프로토콜을 사용한다고 한다. Frame Relay 는 이더넷과 같은 레벨의 프로토콜이다.
이 포스팅에선 LAN 과 관련한 동작을 중점적으로 살펴보려고 한다.
adressing, ARP
ARP (address resolution protocol) 은 IP주소를 LAN내의 일치하는 MAC주소에 매핑하는 데 사용되는 링크계층 프로토콜이다.
LAN 에서 각 노드는 통신을 위해서 다른 노드들의 MAC 주소를 알아야 한다. 아직 3계층에 대하여 살펴보진 않았지만, IP주소를 통해 다른 노드를 식별할 수 있지 않은가? 하는 의문을 충분히 가질 수 있다. 논리적으로는 맞는 말인 것 같다. 결국 2계층 ARP 또한 3계층 IP주소를 사용하며 상대방의 MAC 주소를 알아내는 것이며, 해당 과정이 사실상 3계층을 통해 서로를 식별하는 과정이라고 볼 수 있다.
다만, 사실상 3계층의 주요 기능인 라우팅 기능이 필요없는, 같은 LAN의 속한 장치들끼리 데이터 전송을 하는데 매번 3계층까지 올라간다는 것은 오버헤드이며 비효율적이다. ARP를 사용하면 처음 MAC주소를 알아낼 때만 3계층 까지 올라가고, 이후에는 캐쉬된 테이블을 통해 통신할 수 있기 때문에 보다 더 효율적이다. 이러한 관점에서 ARP는 3계층 주소를 2계층 MAC주소에 매핑하여 LAN 내에서 보다 효율적인 통신을 가능하게 하는 메커니즘으로 생각할 수 있다.
ARP의 동작 방식은 다음과 같다.
시작 노드가 처음 데이터를 전송하려고 하는 상황에 자신이 가지고 있는 정보는 자신의 IP주소, 목적지의 IP주소, 자신의 MAC주소가 있을 것이다. 최종 목적지인 IP주소는 당장 다음에 어떤 노드로 데이터를 전송해야하는지를 나타내진 않는다. 그렇기 때문에 시작노드는 인접한 모든 노드에게 필요한 정보를 요청하며, 이를 브로드캐스팅이라고 한다.
잠깐 2계층의 브로드캐스팅 방법에 대하여 살펴보면 좋을 것 같다. 2계층에서 인접한 모든 노드에게 요청을 보내고 싶다면, 도착지 MAC 주소에 FF-FF-FF-FF-FF-FF 라는 값을 설정한다. 이렇게 되면 수신자인 모든 다른 노드들은 프레임 헤더에서 이를 확인후, 정해진 약속에 따라 이는 자신에게 전달된 것이라고 판단하여 해당 요청을 처리할 것이다. (물론 물리적으로는 모든 인접노드가 데이터를 전달 받겠지만, 논리적으로 이를 받아 처리하느냐에 관점으로 생각하면 된다)
다시 ARP 동작 과정으로 돌아와서, 시작 노드는 MAC dest에 FF-FF-FF-FF-FF-FF 값과 함께 MAC src, IP src, IP dest 정보를 모든 인접 노드에게 전송한다. 이를 전송받은 노드들은 IP dest 를 확인하여 자신에 IP주소에 해당한다면 MAC dest 에 자신의 MAC 주소를 적어, 이를 다시 A에게 돌려보낸다.
이를 돌려받은 A는 이제 인접한 도착지 노드의 MAC주소를 ARP table 에 저장하고, 해당 MAC주소를 활용하여 실제 데이터를 전송한다. 이후 요청에서는 저장된 ARP table 정보를 통해 브로드캐스팅 과정없이 바로 다음 노드에게 데이터를 전송한다 .
다만, 다른 네트워크(자신이 속한 LAN의 주소가 아닌 외부 네트워크 주로)로 데이터를 전송해야 하는 경우에는 조금 더 고려할 것이 있다.
IP dest 에 적힌 주소는 A가 속한 LAN에 존재하지 않기 때문에 위의 방식으로 ARP query 를 보내도 응답이 오지 않을 것이다. 그렇기 때문에 A는 게이트웨이 R의 IP주소를 미리 갖고 있어야한다. 즉, 해당 LAN 에 등록되는 host 들은 모두 게이트웨이 R의 주소를 직접 가지고 있다고 볼 수 있다. (DHCP에서 게이트웨이의 주소를 제공해줄 수도 있고, 사용자가 직접 설정할 수도 있다)
A는 ARP query 에 앞서 dest IP 가 동일 LAN에 속하는지 먼저 판단하며, LAN에 속할 경우 위에 먼저 설명한 방식대로 ARP query 를 보내며, 아닐 경우에는 자신의 LAN을 대상 LAN에 연결하는 게이트웨이를 식별하여 이에 ARP 요청을 보내 게이트웨이 R의 MAC주소를 알아낼 것이다.
기존에 ARP table 은 간단하게 한번 IP를 저장하고 이를 계속 활용하는 방식이었지만, 현재는 디바이스가 늘어나며 많은 장치가 유동 IP를 사용하기 때문에 TTL이라는 개념을 도입하며 일정한 주기로 ARP table 을 업데이트 하는 방식으로 동작한다.
Ethernet
2계층의 프로토콜중 하나인 이더넷 프로토콜이 LAN의 대부분을 차지한다.
앞서 2계층의 핵심은 RDT와 MAC이라고 설명하였는데, 이더넷은 각각 CRC와 CSMA/CD 기법을 활용한다. 이더넷의 프레임 구조는 다음과 같다.
이더넷에선 CRC를 통해 에러를 체크를 한 후 에러가 있다면 드랍한다. 이더넷 프로토콜의 물리적인 매체는 유선 케이블로 사실상 에러가 거의 존재하지 않기 때문이다. 에러 발생확률이 0%는 아니기 때문에 에러가 발생할 수 있으며, 그에 따라 4계층에서 다시한번 데이터 전송의 신뢰성을 보장해 주어야 한다.
이더넷에 따로 handshaking 동작은 없으며, ACK, NACK 과 같은 플래그를 주고받지 않는다. 이더넷의 맥 프로토콜을 CSMA/CD with binary backoff 라고 표현한다.
'네트워크' 카테고리의 다른 글
[OSI 7 Layer] Application Layer (1) | 2023.06.02 |
---|---|
[OSI 7 Layer] Transport Layer (1) | 2023.05.08 |
HTTP/1, HTTP/2 & HTTP/3 (0) | 2023.04.20 |
[OSI 7 Layer] Network Layer (0) | 2023.04.19 |
[OSI 7 Layer] Overview & Physical Layer (0) | 2023.04.17 |