쉽게말해 노드와 노드를 연결한다.
링크계층의 커뮤니케이션 링크는 1. 유선 2. 무선 3. LANs 와 같은 종류가 있다.
링크 계층에서는 패킷을 frame(프레임)이라고 한다.
데이터그램은 서로 종류가 다른 링크로 전송될 수 있다.
(예를 들어 와이파이로 전송이 되다가 이더넷으로 전송될 수 있다.)
이떄 각 링크는 자체적으로 프로토콜을 제공한다.
<예시>
서울에서 부산으로 가는 여정을 예를 들어보자.
가는 교통수단에는 버스, 비행기, 기차가 있다.
- 이때 여행자는 데이터그램이 되고
- 가는 방법은(버스를 타고 비행기타고 간다..) 커뮤니케이션 링크가 된다.
- 버스 비행기 기차 같은 것이 링크레이어 프로토콜이 된다.
- 여행 계획을 짜는 사람은 라우팅 알고리즘이라고 할 수 있다.
링크 계층이 제공하는 서비스는 여러가지가 존재한다.
링크 레이어 패킷(프레임)을 만드는
프레이밍과,
한 채널에 동시에 전송요청이 있을 때 순서를 정해주는 등의 작업을 하는링크 접속두가지 서비스를 지원한다.
신뢰성 있는 전달을 서비스 하여 loss의 발생을 막는다.
유선연결에서는 loss의 발생확률이 적으므로 reliable delivery 서비스를 제공하지 않지만, 무선연결에서는 충돌 및 loss가 많이 발생하므로 위 서비스가 중요하다.전송 중 프레임의 에러를 감지하고 drop 및 재전송을 요청한다.
에러의 발생을 알아내면 에러를 고치는 서비스를 제공한다.
half-duplex: 한번에 하나씩 전송하는 서비스
full-duplex: 한 링크에서 동시에 전송가능한 서비스
인접 노드 사이의 플로우 컨트롤도 제공한다.
호스트에서 대부분의 경우 링크 계층은
네트워크 인터페이스 컨트롤러(NIC)로 알려진 네트워크 어댑터에 구현된다.
이더넷은 칩의 형태로 구현되어 있지만,
와이파이같은 다른 대부분의 링크 레이어는 NIC로 구현된다.
또한, 호스트의 시스템 버스에 붙어 있으며
하드웨어와 소프트웨어, firm웨어 모두의 조합으로 구현된다.

컨트롤러는 하드웨어 칩으로 구성된다.
송신 측 컨트롤러
호스트 메모리에 저장된 데이터그램을 링크 계층 프레임으로 캡슐화한 후 링크 접속 프로토콜에 따라 이 프레임을 통신 링크상으로 전송한다.
수신 측 컨트롤러
프레임을 수신한 후 네트워크 계층 데이터그램을 추출한다.

프레임을 보내고 받고 할때 추가적으로 error checking bits, reliable data transfer, flow control, 관련된 설정을 할 수 있다.
링크 레어어 프로토콜은 각 노드에서 패킷 송수신 시 에러를 검출하고, 문제의 비트를 특정하여 정정할 수 있다.
여러 다양한 방법들을 살펴보자.
에러의 detection은
EDC라는 오류 검출 및 정정 비트들을 사용하여 찾아낸다.
EDC : 오류 검출 및 정정을 위한 비트
D : 데이터를 뜻한다.(헤더 포함)

데이터를 보낼 때 원래 데이터 D에서 EDC를 계산하여 같이 보낸 다음.
비트 에러가 발생 가능한 링크를 지나 다음 노드에 도착하면,
받은 데이터 D'과 받은 EDC'를 비교하여 오류를 detection 한다.
이러한 에러 검출은 100% 정확한 것은 아니다. 하지만 높은 정확률을 보이고,
EDC의 길이가 길수록 에러를 정확히 검출할 수 있다.
패리티 비트를 이용하여, 오류를 감지한다.
1의 개수가 짝수가 되도록 패리티 비트를 EDC에 설정한다.
패리티 비트를 단 한개만 사용하여 오류를 검출한다.

위와 같이 데이터의 1의 개수가 짝수가 되도록 하는 패리티 비트를 설정한다.
이 방법은 정확도가 높지 않다.
왜냐하면, 홀수개의 비트 오류는 검출할 수 있지만, 짝수개의 비트 오류는 검출할 수 없다.
또한 에러가 발생한 위치를 정확히 집어낼 수 없다.
➡️ 에러 정정 불가
데이터 D에 있는 비트들을 i개의 행과 j개의 열로 나누어,
나뉜 각각의 행과 열에 대해 하나의 패리티 값이 계산한다.

한 비트에 오류가 발생하면,
패리티가 오류인 두 부분의 교차점이 에러부분임을 알수 있다.
➡️ 에러 정정 가능!!
또한, 단일 패리티와는 달리 임의의 2개의 오류도 검출할 수 있지만,
2개 발생 시에는 정정할 수 없다.
데이터의 체크섬계산하여
EDC에 설정한다.
TCP/UDP에서 사용한 방법과 동일하다.
가장 강력한 에러 detection 방식이다.
1. 비트 패턴 G : 송수신자가 모두 사전에 합의한(알고있는) r+1 비트 패턴을 설정한다.
(최상위 비트는 1이어야 함)
2. 송신자는 D에 r개의 추가 비트 R을 선택해 데이터 D 뒤에 덧붙인다.
<D,R> = D*2^r XOR R 3. 수신자는 <D,R> 수신 비트를 G로 나눈다.
모든 CRC 검사는 덧셈의 올림이나 뺄셈의 빌림이 없는 모듈로 2 연산을 사용한다.
즉, 이는 피연산자를 비트별로 XOR한 것과 같다.

위와 같은 방식으로 R을 구해 같이 보내주게 되면, 수신자는 패턴 G로 나누어 오류를 감지할 수 있다.
또한, 각각의 CRC 표준은 r개 이하의 연속적인 비트 오류를 모두 검출할 수 있다.
그리고 이더넷 wifi에서 널리 사용된다.
링크의 접속은 다음의 두가지 방법이 있다.
point-to-point link
브로드캐스트 링크(broadcast link)

브로드캐스트방식은 동시에 신호가 들어올 때 충돌을 피하도록 설계되어야 한다.
즉, 이러한 충돌을 피하기 위한 프로토콜이 바로 Multiple access 프로토콜이다.
R bps의 다중접속이 가능한 MAC 채널이 있다면...?
한명만 링크를 사용하면 R bps로 전송이 가능하다.
M개의 노드가 사용할 때는 각 노드가 공평히 R/M bps의 처리율을 갖는다.
fully decentralized
중앙 컨트롤러가 순서를 정해주는 것이 아니라 각 노드(디바이스)가 순서를 정한다.
비동기적으로 수행이 가능하다.
➡️ 분산되어 있어 하나의 고장으로 전체 시스템이 다운되지 않음.
간단해야 한다.
모두가 이상적이진 않지만 Multiple access 프로토콜을 위한 다음의 세가지의 방식이 있다.
채널 파티셔닝랜덤 억세스순서대로 전송Time Division Multiple Access로, 1장에서 배웠던 시분할 방식이다.
(타임 slot으로 나누어 각 슬롯마다 디바이스가 채널에 순차적으로 접속한다.)
각 채널을 고정된 크기의 슬롯으로 나누어(일정한 패킷 전송시간을 기준) 번갈아 가며 전송한다.

6개의 스테이션으로 나뉜 LAN이 있을 때 1,3,4슬롯만 보낼 패킷이 있다면,
2,5,6은 보내지 않아도 항상 낭비가 된다.
Frequency Division Multiple Access로, 1장에서 배웠던 주파수분할 방식이다.
(채널의 주파수 대역을 나누어 각 대역마다 패킷을 보낼수 있다.)

이렇게 한번에 여러 패킷을 전송할 수 있지만, 안 쓰는 주파수 대역은 낭비된다.
채널을 나누어 접속을 하게 되면 사용자가 1명일때 많은 낭비가 발생한다.
➡️ 채널을 나누지 않고 전송하며, 충돌을 빨리 감지하고, 회복하는 방법을 사용한다.
Random access MAC protocols은 충돌이 발생가능하기 때문에
충돌을 감지하고 회복하며 충돌에 대한 피해를 최소화 하는 것이 목표이다.
타임슬롯을 나눈 다음 해당 타임 슬롯 전체를 사용해서 패킷을 보낸다.
충돌이 발생하면, 충돌이 발생한 프레임을 p의 확률로 다시 보낸다

충돌발생 x
➡️ 해당 노드는 성공적으로 해당 프레임을 보냈기 때문에, 다음 프레임을 보낼 수 있다.
충돌발생
➡️ p의 확률로 보낼 수 있을 때 까지 재전송을 한다.
full 채널을 사용할 수 있다.highly decentralized : 자체적으로 확률을 계산하여 보낸다.Efficiency : 여러개의 슬롯 중 슬롯이 패킷을 성공적으로 보내는 확률
(노드가 N개가 있을 때 하나의 슬롯이 성공적인 슬롯일 확률)
즉, 노드들 중 한 노드만 전송하고 나머지 N-1 개의 노드는 전송하지 않는 확률이다.
1. 노드가 전송할 확률이 p라하면
해당 노드가 성공할 확률 = p x (1-p)^(N-1)
2. 노드가 N개 있으므로
임의의 한 노드가 성공할 확률 = N x p x (1-p)^(N-1)
3. 최대의 효율을 구하기 위해서는 이 식을 최대화 하는 p를 구해야 한다.
4. 활성 노드가 많은 경우의 최대 효율을 구하기 위해 N이 무한대가 될 때의 극한값을 취한다.
5. 이렇게 계산하면 최대 효율은 p = 1/e = 0.37 임을 알 수있다.
즉, 많은 노드가 전송할 프레임이 많을 때 기껏해야 37%의 슬롯만 낭비되지 않는다.
노드는 프레임을 브로드캐스트 채널로 전송하고,
만약 충돌하면, 노드는 확률 p로 즉시 재전송 한다.
슬롯 알로하의 슬롯의 개념을 뺀 것이라고 보면 된다.
➡️ 시간에 따른 동기화가 필요 없다

➡️ 시간에 따른 동기화가 없기 떄문에 충돌확률이 2배 증가한다.
슬롯 알로하에 비해 충돌확률이 2배 증가한다 18%

즉, 충돌이 생기고 결과적으로 효율이 떨어지게 되는데,
CSMA방식에서는 말할 사람이 손을 들고 말을 하는 것 처럼
누가 프레임을 보내고 있으면 프래임을 전송하지 않는다.
채널을 listen하고 어떤 노드가 프레임을 보내고 있으면, 패킷을 보내지 않는다.
앞의 Carrier Sense라는 것은 채널을 Sensing하여(채널 상태를 보며)
idle 한 상태면 프레임을 보내고 busy 한 상태면 프레임을 보내지 않는다.➡️ 이러한 방식으로 충돌발생을 막는다.
위의 CSMA방식에 충돌을 감지하는 기능을 추가한다.
또한, 충돌을 감지했으면, 프레임의 전송을 취소한다.
(이더넷에서 사용하는 방식)
➡️ 프로파게이션 타임 때문에 충돌이 발생하기 때문이다.
예를 들어 노드 1이 시간 t0에 패킷이 전송되면,
또한 t1쯤에 다른 인접 노드들이 보냈다는 사실을 알게될때,
인접노드가 아닌 다른 노드들은 1번 노드가 아직 전송했다는 신호를 못받은 상태일수 있다.
떄문에 t1시간에 패킷을 전송하게 되어 1번 노드가 보낸 패킷과 충돌이 발생 할 수 있다.

위의 상황은 충돌이 발생했음에도, 자신의 패킷을 꿋꿋히 다 보낸 상황이다.
겹치는 격자무늬의 시간 동안 충돌이 발생하고 낭비가 발생한다.
충돌을 감지 할 경우 패킷의 전송을 멈춘다.

이 NIC가 네트워크 레이어로부터 패킷을 받으면 프레임으로 캡슐화 한다.
NIC가 채널을 센싱하여
프레임이 충돌없이 성공적으로 보내지면 다음 프레임을 보낼수 있다.
충돌이 발생하면, 패킷을 취소하고,
조금 기다렸다가 다시 채널을 센싱하여 패킷을 재전송한다. (= Backoff 방식)
cf>
`NIC(네트워크 인터페이스 카드)` : 이더넷 프로토콜이 구현되어있는 인터페이스 카드
충돌 발생시 잠깐 기다리는 시간을 정한다.
충돌을 n번 경험한 프레임을 전송할 때 노드는
{0,1,2,…,2^n - 1} 중에서 랜덤하게 K 값을 선택한 후 K x 비트 시간 만큼 기다린다.
이더넷의 경우 K x 512 비트 시간(이더넷으로 512 비트를 전송하는데 걸리는 시간 x K)가 되며 n의 최댓값을 10으로 제한한다.
만약 충돌한 두 패킷이 같은 시간을 뽑아 전송하게 되면 다시 충돌이 일어날 테지만,
충돌을 많이 경험할 수록 n값이 늘어나 랜덤한 숫자를 뽑는 범위가 늘어나게 되어
충돌발생 확률이 낮아진다.
이렇게 랜덤하게 기다리는 시간을 측정하는 이유는 충돌한 두 패킷이 다시 충돌하는 것을 막기 위함이다.

만약 Tprop가 0이 되면, 효율성이 1이 된다
➡️ 전파지연이 없어지면 충돌이 일어나지 않기 때문
만약 Ttrans가 무한대가 되면, 효율성이 1이 된다
➡️ 하나의 디바이스만 채널을 사용하는 상태이므로, 충돌 발생이 없다.
알로하 방식보다 CSMA는 간단하고 싸고 decentralized된 방식이다.
하지만
1. 채널 파티셔닝 프로토콜의 경우
채널의 낭비가 주 문제이다.
2. 랜덤 억세스 프로토콜의 경우
채널의 충돌이 주 문제이다.
채널 낭비와 충돌문제를 보안을 하여 taking turns 라는 프로토콜이 개발되었다.
채널의 낭비와 충돌의 문제를 해결하기 위해 순서대로 패킷을 전달할 수 있도록 하는 방법이다
블루투스, FDDI 에 사용되며
총 Polling 프로토콜 토큰 전달 프로토콜 두 가지 가 있다.
하나의 마스터 디바이스가 슬레이브 디바이스에 polling을 통해 전송 의사를 묻고, 순서대로 전송할 수 있도록 한다.
때문에 idle 한 채널이 발생하지 않고 충돌이 발생하지 않는다.

따로 마스터 디바이스를 두지 않고 토큰을 서로 전달하며, 토큰이 있는 디바이스만 패킷을 전송할 수 있다.

덕분에 polling 에서 있던 마스터 디바이스문제를 해결할 수 있다.
다운스트림과 업스트림데이터는 FDM방식으로 구분하고,
업스트림 시는 TDM 방식으로 구분하여 충돌을 막는다.

케이블 헤드엔드의 CMTS는
업스트림 다운스트림 데이터를FDM 주파수 분할로 나누어 처리를 한다.
다운 스트림은 CMTS 하나가 각 가정에 데이터를 전송하기 때문에 충돌이 발생하지 않는다.
업스트림은 각 가정이 CMTS에 데이터를 전송하기에 충돌이 발생한다.
➡️ TDM 시분할로 타임 슬롯을 나누어 각 가정에 슬롯을 할당해 데이터를 받는다.
CMTS가 다운스트림 시
맵 프레임을 보내 각 가정의 타임 슬롯을 알려준다.
맵 프레임을 보내려면 각 가정이 보낼 패킷이 있는지 부터 알아야 한다.
랜덤 억세스 프로토콜을 통해,
각 가정은 보낼 패킷이 있으면 CMTS에 알려주게 된다.

이렇게 하여 CTMS는 보낼 패킷이 있는 가정들의 정보를 알게 되고,
각 가정에 타임슬롯을 할당하여 맵 프레임을 다운스트림시 보내준다.
➡️ 즉, 케이블 억세스 네트워크는 채널 파티셔닝, 랜덤 억세스 프로토콜을 종합적으로 사용하여 서비스를 한다.