패킷은 시그널(파장)로 매체(broadcast medium
)를 통해 게이트웨이 전달됨.
근데 시그널이라는 건 다 퍼지기 때문에 게이트웨이 라우터에 전하고자 하는 얘기가 다른 링크에 붙은 라우터들에도 퍼짐 -> collision -> 게이트웨이 라우터가 해독할수 없게 됨
링크 레이어의 주관점: 한 홉(라우터~라우터)을 어떻게 충돌나지 않고 잘 갈 것인가
사용자(엔드유저)
cf)
전송 계층, 네트워크 계층은 운영체제 내에 코드로 구현되어있음.
링크 계층은 카드로 구워져있음.
어떻게하면 medium에서의 충돌에 대한 해결을 잘 해줄 수 있을까.
같은 와이파이를 사용했을 때, 동시에 두 명 이상 사용하면 AP에서 읽을 수 없고, 이런 걸 해결해주는게 MAC Protocol.
유선(케이블)이든 무선이든 원리는 같지만 일단 이 포스팅에서는 유선을 전제로 이야기.
TDMA(Time Division Multiple Access)
공유 자원을 시간을 기준으로 나눠서 엔드유저(사용자)에게 할당해줌
FDMA(Frequency Division Multiple Access)
각자 자기가 보낼 수 있는 주파수가 정해져있음
=> 둘 다 사용자가 보낼 데이터가 있을 때에 채널에 바로 접근할 수 없다는 문제점이 있음
=> 사람이 많을수록 유리, 사람이 적을수록 비효율적.
ex) ALOHA, CSMA, CSMA/CD, CSMA/CA..
=> 사람이 적을수록 유리, 사람이 많을수록 충돌이 많이 생김.
listen before tranmit
: 말하기 전에 듣는다
broadcast medium(실제 대화에서는 공기)을 이용해 대화할 때는 한 번에 한 명씩만 이야기를 해야함. 실제로 대화에서도 내가 하고 싶은 얘기가 있어도 다른 사람이 이야기할 때는 생각하고 듣고 있는 것이 CSMA에서도 사용하는 핵심
아무리 Listen Before Transmit해도 동시에 말을 해서 문제가 생기는 상황이 발생함.
서로 다른 엔드유저가 전달하고자 하는 Frame이 있어서 Listen을 해봤더니 조용해서 보냈는데, Propagation Delay가 있어서 충돌이 발생함(완전히 동시에 보낸건 아닌데도, Propagation Delay 때문에 충돌 발생)
-> 근데 이 Propagation Delay를 없앨 수는 없음.
CSMA 방식을 사용하되, 충돌이 발생할 경우 이를 감지하고 바로 전송을 멈춤.
근데 멈춘 후 어떻게 행동해야할까?
Binary Backoff(=delay, 뒤로 물러서는 시간)
: 연속적으로 m번의 충돌이 있었다면, {0, 1, 2,... 2^m-1} 중 하나의 숫자를 골라서 그만큼 기다린 후 다시 전송한다.
충돌 횟수가 늘어나면 랜덤 숫자의 범위가 증가함. 즉 충돌이 많이 날수록 오래 기다릴 가능성이 많아짐.
이야기하고 싶은 사람이 적다면 적은 숫자 범위에서 골라도 되는데, 사람이 많다면 다시 충돌이 날 가능성이 높아짐. 즉, 충돌이 났을 때 서로 다른 wait time을 골라야지 다시 충돌이 나지 않기 때문에, 충돌이 연속해서 많이 발생하면 이야기할 사람이 많다고 유추해서 랜덤 숫자의 범위를 늘려줌.
Link Layer에서의 재전송
한 홉 사이의 재전송
Collision이 있을 때만 재전송(그 외의 경우에는 유선 네트워크일 경우 99.99% 도착함->그래서 Link Layer에서는 굳이 ACK를 주고받는 과정이 없음.)
Transport Layer(TCP)에서의 재전송
Source와 Destination 서버 사이의 재전송
=> 재전송하는 비용은 Link Layer에서 재전송이 훨씬 적음.
중간 중재자(master controller)가 제어해주는 방식.
=> 문제점: Single point of Failure. 하나가 고장나면 전체를 망침. 이 단점이 치명적이라 잘 사용하지 않음
토큰을 가진 호스트만이 데이터를 전송할 수 있음. 없으면 넘겨줌.
=> 문제점: Single point of Failure. 중간에 토큰이 없어지면 전체를 망침. 이처럼 하나에 의존해서 문제를 해결하는 방식은 좋지 않음.