링크 계층에서 오류를 탐지하고 정정하는 방법을 배웠다. 이번에는 링크 계층에서 여러 기기가 한 번에 데이터를 전송할 때 서로 충돌이 발생하지 않도록 방지하는 방법을 배울 것이다.
MAC(Media Access Protocol)
링크에는 2가지 타입이 있다. point-to-point는 1대1 연결로 한 기기가 보내면 한 기기는 받는 역할이기에 충돌이 발생하지 않는다. 그러나 Broadcast는 여러 기기가 하나의 링크를 공유하기 때문에 충돌이 발생할 수 있다. 때문에 데이터 링크 계층에는 다중 접속 문제를 해결하기 위한 방법이 필요하다. 그래서 나온 것이 Media Access Protocol(MAC)이다. 이는 broadcast 채널에서 여러 기기가 하나의 버스를 공유할 때 충돌이 발생하는 것을 관리하는 프로토콜이다.
Collision 관리
MAC에서 충돌을 관리하는 세 가지 방법이 있다.
Channel Partitioning
Channel Partitioning은 주파수나 시간을 나눠서 공유 채널을 나누어 사용할 수 있게 하는 방법이다. 시간을 나누어 사용하는 것을 TDMA, 주파수를 나누어 사용하는 방식을 FDMA라고 한다.
Random Access
채널이 분리되어 있지 않고 하나의 채널을 공유하기 때문에 충돌이 발생하기 쉽다. 그래서 Random Access은 충돌을 감지하고 이를 대처하는 방법을 제공한다. pure ALOHA, slotted ALOHA, CSMA, CSMA/CD, CSMA/CA가 대표적이다.
- pure ALOHA : 보낼 패킷이 있는 경우에 바로 전송하고 ACK을 기다리는데, 일정 시간동안 ACK이 오지 않으면 대기 시간 이후에 다시 데이터를 전송한다. 이때 대기 시간은 응답받지 못한 횟수 k에 따라서 0~2^k-1의 값을 갖는다.
- slotted ALOHA : pure ALOHA의 높은 충돌 가능성을 개선하기 위해서 만들어진 것이다. 프레임을 slot 단위로 나누고 slot 시간 단위로 보내기 때문에 충돌 확률이 낮아진다. 즉, 보내야 할 프레임이 있으면 바로 보내는게 아니라 slot의 시작 시간에 맞춰서 보낸다. 2개 이상의 프레임이 동시에 같은 slot에 있는 경우에 충돌이 발생하게 된다. 이때 충돌이 발생한 패킷들은 랜덤한 시간만큼 대기했다가 다시 전송한다.
- CSMA(Carrier Sense Multiple Access) : 채널의 주파수를 계속해서 확인(carrier sensing)하는 일이다. 만약 채널이 idle하다고 느껴지면 프레임을 전송하고, busy라고 판단되면 전송하지 않는다. 채널 전파 지연 때문에 채널이 idle하다고 판단하고 프레임을 전송하여 충돌이 발생하지만 충돌이 발생한 이후에 대처가 없다. 회의실에서 누가 말하든 간에 서로가 자기 할 말만 계속해서 하는 것과 같다고 생각하면 된다.
- CSMA/CD : 채널을 탐지했을 때 해당 채널을 사용하는 기기가 없다고 판단하고 프레임을 전송해도 충돌은 발생할 수 있다. 그 이유는 아래 그림과 같이 각각의 기기가 전송을 시작해서 다른 기기에 갈 때까지 지연 시간(채널 전파 지연)이 존재하기 때문이다. CSMA/CD는 전송 도중에 다른 기기의 주파수를 감지하면 프레임 전송을 취소한다. 이후 랜덤 시간만큼 대기한 후에 패킷을 다시 전송하는 방법이다. 랜덤 시간만큼 기다리는 이유는 충돌이 발생했던 다른 기기도 고정 시간만큼 대기하기 때문에 다시 전송해도 또 충돌이 나기 때문이다.
이더넷에서는 CSMA/CD 방법을 사용하고 있다. 먼저, 네트워크 계층에서 온 패킷을 NIC에서 수신하고 프레임을 만든다. NIC는 채널 상태를 보고 idle이면 프레임을 전송하고, busy이면 채널이 idle일 때까지 기다렸다가 재전송한다. NIC가 충돌없이 프레임을 잘 보냈다는 것을 인지하면 성공적으로 전송을 완료한 것이다. 그러나 보내는 도중에 전송중인 프레임을 인지하면 프레임 전송을 중단하고, backoff time 이후에 전송하도록 jam signal을 발생시킨다. 프레임 전송을 중단하고 나면 NIC가 BEB(Binary Exponential Backoff) 알고리즘을 통해서 랜덤 값인 k * 512bits 시간만큼 backoff time을 갖는다. 이때, K 값은 {0, 1, 2, 4, ..., 2^m-1}이다. exponential 하게 증가하기 때문에 그만큼 충돌 확률이 빠르게 줄어든다.
그렇다면, 이 과정에서 NIC는 충돌이 발생했는지 여부를 어떻게 알 수 있는 것일까? 그것은 보낸 신호와 받은 신호가 다르거나, jam signal이 발생하면 충돌이 발생했다고 판단한다.
Taking Turns
세 번째 방법은 Taking Turns이다. 말 그대로 순서를 가진 기기만이 전송할 수 있는 방법이다. master 기기에서 polling 메세지를 보내고 전송할 메세지가 있는지 확인한다. 모든 기기를 방문하다보니 오버헤드와 지연이 발생할 수 있고 single point of failure로 한 기기가 고장나면 다른 기기도 영향을 받아 고장이 날 수 있다.
혹은 token을 돌려서 token을 가지는 기기만 데이터를 전송할 수 있도록 한다.
따라서 MAC 프로토콜을 정리하면, channel partitioning, random access, taking turns 방법이 있다. channel partitioning 은 시간 혹은 주파수로 나누는 방법이고, random access는 carrier sensing 방법을 통해 채널을 검사하고 idle인 상태에 패킷을 전송하는 것이다. 그 중에서도 CSMA/CD와 CSMA/CA는 약간의 차이가 있다. CSMA/CD는 주로 이더넷과 같은 유선에서 사용하고 CSMA/CA는 주로 무선랜에서 사용한다. 그 이유는 유선은 송신 측에서 보낸 패킷이 충돌이 있는지 여부를 확인할 수 있는 반면에 무선은 송신 측에서 보낸 패킷의 충돌 여부를 확인할 수 없다. 그래서 CSMA/CA를 사용해서 충돌을 회피하는 방법을 사용하는 것이다. Taking Turns는 polling, token passing 등의 방법으로 주로 블루투스에서 사용한다. 예를 들어 비행기가 동작 중에 OS에 오류가 발생하면 큰 사고로 이어질 수 있다. 따라서 오류가 발생하면 토큰을 돌려서 다른 OS로 대체할 수 있도록 한다.
'CS > 네트워크' 카테고리의 다른 글
[컴퓨터망] 6. Link Layer(LANs:Ethernet) (0) | 2024.06.13 |
---|---|
[컴퓨터망] 6. Link Layer(LANs:ARP) (1) | 2024.06.13 |
[컴퓨터망] 6. Link Layer(링크 레이어 서비스, 에러 탐지와 정정) (0) | 2024.06.11 |
[컴퓨터망] 5. Network Layer(ICMP, Network Management) (0) | 2024.06.08 |
[컴퓨터망] 5. Network Layer(OSFP, BGP, SDN) (0) | 2024.06.08 |