Link Layer

뚝딱이·2024년 1월 11일
0

네트워크

목록 보기
5/8
post-thumbnail

데이터를 전달할 때 공유하는 매체를 통해 전달하므로 충돌이 발생하지 않도록 하는 것이 중요하다. 따라서 Link layer에서는 충돌이 일어나지 않게 하거나, 일어난 충돌을 해결하는 방안에 대해 알아본다. 한 hop에 대해서 다룬다는 것을 기억하자.

Application layer, Transport Layer등은 전부 OS에 있다. 즉, 코드로 구현이 되어있다. 그에 반해 Link layer는 네트워크 인터페이스 카드내에 구워져 있다.


Network layer에서 내려온 패킷이 네트워크 인터페이스 카드에 전달되어 외부로 나갈 때 Link layer의 전송 단위인 Frame에 들어가 전송된다.

링크가 만약 전용선이라면, 그냥 데이터를 실어 보내면 충돌없이 보낼 수 있으므로 상관없다. 하지만 실제로는 많은 사람이 공유하는 채널을 가진 링크를 사용한다. 따라서 전송하면 이 signal이 연결되어있는 곳으로 모두 퍼지게 되어 문제가 되는 것이다. 그래서 이 매체를 broadcast medium이라고 표현을 한다. 목소리를 전달하는 매체는 공기인데 이것 또한 broadcast medium이다. 모든 가능한 경로로 다 퍼져나가는 것이다.

MAC Protocol

둘 이상이 전송하면 문제가 생기므로 매체에 접근할 때 조절해서 충돌을 해결하고자 하는 것이 Medium Access Control로 MAC protocol이다.

우리가 사용하는 와이파이 등이 모두 MAC protocol이다.

Ideal

이상적인 MAC protocol을 살펴본다. 링크 채널의 bandwidth가 Rbps라고 가정했을 때 우리가 원하는 조건을 아래와 같다.

  1. 딱 한 노드가 데이터를 전송하고 싶을 땐 전체 bandwidth인 Rbps를 사용할 수 있다.
  2. N개의 노드가 데이터를 전송하고 싶다면, 장기간으로 보았을 때 각각 R/N씩 bandwidth를 사용할 수 있어야 한다.
  3. 이러한 것이 가능하되, 중앙 컨트롤 서버가 있는 것이 아니라, 분산 처리 되어야한다.
  4. 단순해야한다.

channel partitioning

TDMA

가장 대표적인 예시가 TDMA: time division multiple access이다. time division, 즉 시간을 나눠 사람들이 같이 사용할 수 있도록 하는 것이다.
자신의 차례가 왔을 때만 전송할 수 있다. 이는 문제점이 있는데, 많은 사람들이 사용한다면 촘촘히 사용할 수 있는데 예를 들어 사용자가 한명이라고 한다면, 텅텅 비어버려 나머지 자원이 낭비되는 것이다.

FDMA

그리고 FDMA: frequency division multiple access가 있는데, 각자 자기자신이 데이터를 보낼 수 있는 주파수가 있는 것이다. 문제점은 위의 TDMA와 같을 것이다.

Random Access

위에서는 아무때나 Access하는 것이 아니라 비효율적이어서 내가 보내고 싶을 때 보낼 수 있는 Random access가 나온것이다. 그런데 내가 보내고 싶을 때 보내면 충돌이 나기 마련이다. 그래서 충돌을 어떻게 방지하고 해결하는지 알아본다.

대표적인 예시들을 알아보자.

CSMA

carrier sense multiple access의 줄임말이다. carrier는 우리가 들고 다니는 캐리어를 생각하면 된다. 즉, 짐을 싣고 다니는 매체를 sense해본다는 것이다. listen before transmit으로 말하기 전에 듣는다는 것이다. LAN 케이블 상황에서 생각하고 있지만 상관없다. broadcast medium이니까 ~

5명이 대화를 하려면 한번에 한사람씩 얘기해야한다. 우리도 알게 모르게 네트워크 프로토콜이 있는 것이다. 그렇다면, 내가 하고 싶은 재밌는 이야기가 있어도 바로 하지 말고 누군가 이야기 하고 있으면 끝날 때 까지 listen하고 조용해지면 얘기한다. 이게 바로 CSMA의 핵심이다. 그런데 우리도 일상생활에서 충돌이 난다. 조용해졌을 때 2명 이상의 사람이 같이 말을 꺼낸다면, 겹친다. 이게 바로 CSMA의 충돌상황인 것이다.

노드 네개가 같은 채널에 있다. 2번째 노드가 이야기를 시작해 signal이 퍼지기 시작한다. 이때 4번째 노드는 sense를 해보지만, 아직 signal이 도착하지 않아 조용한 것으로 인지해 이야기를 시작한다. 따라서 오디오가 겹쳐 충돌이 나는 것이다. frame은 온전해야 버려지지 않고 쓸모를 다하는데 충돌이 나게 되면 버려진다. 따라서 충돌 나는 동안 낭비되는 것이다.

충돌이 난 이유는, 두번째 노드가 전송을 시작했을 때 도달하는데 시간이 걸렸기 때문이다. 즉 propagation delay때문이다. 이를 0으로 만들면 충돌이 나지 않는데, 이는 빛의 속도이기 때문에 0으로 만들수 없어 충돌은 나기 마련이다. 지금은 충돌이 나도 frame을 전부 전송한 상황이다. 두명이서 얘기를 동시에 시작해서 충돌이 났음에도 그냥 끝까지 멈추지 않고 얘기하는 것이다. 하지만 현실에선 동시에 얘기했을 떄 충돌을 감지하고 둘 다 멈춘다. 왜 바로 멈출까? 어차피 얘기해봤자 낭비가 되는 것이기 때문이다.

CSMA/CD

따라서 이것을 개선해 충돌이 나면 멈추도록 한것이 CSMA/CD이다. 내가 얘기할 때 다른 사람이 얘기하면 signal이 와 충돌을 감지할 수 있다. 그래서 감지한 순간 멈추는 것이다.

위 그림에서도 충돌이 나고 두 노드 모두 전송을 멈춘 것을 볼 수 있다. 그렇다면, 충돌을 멈춘 후에는 어떻게 해야할까? 시작해야하는데, 누가 먼저 시작해야할까? 이것은 중재자가 있지 않고는 어렵다. 즉, 토크쇼의 MC 역할이 필요하다. 하지만, 이는 분산처리되어야 하므로 애매하다.

그래서 CSMA/CD는 binary (exponential) backoff하라고 한다. 둘이 동시에 얘기하다 충돌을 감지해 물러선다면, 얼마나 물러설지를 정해야할 것이다. 많이 물러선다면, 다시 돌아오기까지 오래걸릴 것이고, 조금만 물러선다면 다시 돌아오기까지 얼마 걸리지 않기 때문이다. 그래서 개념적으로 얘기하면 연속적으로 N번의 충돌이 있었다면 {0,1,2,...,2^m-1} 중에서 랜덤하게 선택해 그 시간만큼 기다리다가 오는 것으로 정한 것이다. 따라서 2번의 충돌이 있었다면 {0,1,2,3} 중에 거르는 것이다. 충돌이 많을 수록 더 큰 수를 고를 확률이 높아지는 것이다. 충돌이 많이 나면 오래 기다릴 확률이 많은 것이다.

왜 Random하게 선택하는 것일까? 그냥 시간을 배정해주면 안되는 것일까? 만약 시간을 배정해준다고 가정해보자. 그렇다면 A와 b
왜 충돌이 많을 수록 오래 기다려야할까? A가 충돌을 겪었다면 A는 자신 외에도 frame을 전송한 것을 알 수 있고, 자신 외에 몇명이 있는지는 모른다. 사람이 적을수록 빨리 돌아오는 것이 낭비를 줄이는 것이므로, 처음에는 자신 외에 사람이 적을 것이라 가정하고 적은 수중에 random하게 고른다. 이 random하게 고르는 것도 충돌을 피하기 위해 각자 다른 시간을 고르게 하기 위함이다. 적은 수를 골랐음에도 또 충돌이 났다면 자신 외에 사람이 많은 것이므로 점점 더 범위를 넓혀야하는 것이다.

결국 backoff는 delay이다. 따라서 고르는 시간이 길수록 delay가 커지는 것이다. 이 backoff는 충돌이 많을 때, 사람이 많을 때 커지는 것이다.

Taking turns

polling

channel partitioning은 사람이 많으면 많을수록 유리하다. 촘촘히 채울 수 있어 낭비가 없기 떄문이다. 하지만 random access는 사람이 많을수록 delay가 커져 불리하다. 따라서 이 둘의 장단점을 잘 섞어 만든게 Taking turns이다.

이는 master가 slave에게 전송할 것이 있는지 확인해 전송해주는 것인데, 이는 master가 죽으면 아무것도 동작하지 못한다는 치명적인 단점이 있어 많이 사용되지 않는다.

token passing

token을 가지고 있는 host만이 데이터를 전송할 수 있는 것이다. 따라서 내가 전송할 데이터가 없으면 다름 host로 넘겨주는 것이다. 이 방식의 문제점은 token을 잃어버릴 경우 동작하지 못함에 있다.

서브넷은 라우터를 거치지 않아도 서로 접근이 가능한 host들의 집합이라고 했었다. 이 host들의 집합이 LAN으로 연결되어있다.

Ethernet

Link layer에서 말하는 것은 모두 MAC protocol이다. MAC protocol은 충돌을 어떻게 효과적으로 해결할 것인지에 대한 것이다.


요즘의 LAN 구성은 위와 같다. 중간의 네모난 것은 switch이다.

frame의 구조는 위와 같다. header가 단순히 4개의 필드를 가져 굉장히 단순함을 볼 수 있다. CRC는 에러를 체킹하기 위한 부가적인 정보이다. 실제적으로 중요한 정보는 type, dest address, source address이다.

  • type : 어떤 상위 Layer의 프로토콜인지
    • 보통 IP 프로토콜이라고 명시되어있다.

가장 중요한 것은 충돌을 어떻게 해결할 것인가이다. Ethernet을 사용하면 MAC 프로토콜은 CSMA/CD이다. frame을 보내기전에 조용하다고 인지하면 전송한다. 이때 충돌이 나면 멈추고 delay 후 link layer에서 재전송하는데, 결국 충돌이 났다면 Gateway 라우터로 도달하지 못한 것이다. 따라서 확신이 없으면 재전송하는 것이다. TCP는 server와의 관계에 의해 재전송하는 것이다. 하지만 이것은 한 홉사이에 frame이 도달했다는 확신이 없다면 재전송하는 것이다. 이는 한 hop 사이에 재전송하는 것이므로 TCP에서 재전송하는 것보다 낫다.

하지만 충돌을 감지 하지않으면 재전송하지 않는다. 즉, 혹시라도 충돌이 발생했는데 충돌을 감지하지 못하면 큰 문제가 된다. 유선 케이블 상황에서 충돌이 발생했다면 GWR에 도달하지 못하는데, 충돌이 없다면 외부 노이즈로 부터 보호(케이블에 의해 signal 보호) 받고 있으므로 99.99999999... % GWR에 도달한다. 따라서 충돌 감지가 굉장히 중요하다.

결론적으로 ethernet에서 GWR가 link layer에서 feedback을 보내주지 않아도 되는 것이다. 만약에 충돌이 발생했는데, 충돌을 감지하지 못한다면? CSMA/CD는 충돌이 나지 않으면 무조건 전송됨을 가정하므로 큰일날 것이다. 그렇다면 이러한 경우가 있을까? 최악의 경우를 생각해보자.

A----------B----------C----------D----------E
위와 같이 있다고 할 때, A가 E에게 보내고자 하는 frame이 있어 frame을 보낸다고 하자.

A==========B==========C==========D=========-E
이때 =는 frame이 이동한 경로이다. 즉, E의 바로 앞까지 왔지만, 도달하지는 않았으므로 E가 frame을 전송하려고 sense를 했을 땐 조용할 것이다. 따라서 E를 보내는 순간 E는 충돌을 감지 할 것이다. E는 충돌을 감지 했으므로 중단한다. 이때 A의 signal은 이미 충돌이 났으므로 사용하지 못한다. E는 전송을 중단했지만, 이미 보내놓은 것은 계속 전송되고 있을 것이다. 그렇다면 A에서 전송을 마치자마자 A에 E의 frame이 도달했다면 어떻게 될까? A는 자신이 전송을 모두 마칠때까지는 충돌이 없었으므로 문제가 없다고 생각하는 것이다.

따라서 실제 충돌이 났는데 감지가 되지 않은 것이다. 이 문제는 왜 생긴것일까? A가 어떻게 했으면 감지할 수 있었을까? A가 조금 더 길게 보냈다면, 마지막에 충돌을 판단할 수 있었을 것이다. 그래서 Ethernet에서 최소한으로 말해야하는 길이를 정해놓고 있다. 이 minimum frame size는 64byte이며, 보낼 frame이 작다면 padding해서 보내야 하는 것이다.

MAC address

link layer에서 사용하는 주소이며 48bit로 이루어져있다. 따라서 24비트씩 끊어서 사용하는데, 앞의 24비트는 제조사, 뒤의 24비트는 제조사내에서 사용하는 일련번호이다.

사람를 indexing 할 수 있는 방법은 이름, 주소, 주민번호 등 여러가지가 있다. 우리에게 가장 친숙한것은 이름일 것이다. network도 똑같다. 그렇다면, 이름은 hostname, 주소는 IP address, 주민번호는 MAC address에 대응할 것이다. 만약 마음에 들지 않는다면, 이름과 주소를 바꿀 수 있을 것이다. 하지만 주민번호는 바꿀 수 없다. 이는 변하지 않는 것이다. 따라서 hostname, IP address는 바꿀 수 있다. 하지만 MAC address는 바꿀 수 없다. 공장에서 나올 때 찍어나온 것이기 때문이다.

따라서 노트북을 가지고 강의실에서 카페로 옮긴다면 IP 주소는 바뀌지만 MAC address는 고정이다. 결국에는 자신의 MAC address를 변경한다는 것은 진짜 자신의 노트북에 찍힌 일련번호를 바꾸는게 아닌 전송하는 frame의 src address를 바꾸는 것이다. 이를 통해 해킹등의 기능들이 가능해진다.

컴퓨터에서 제일 첫번째로 보내는 것이 GWR인데, IP Packet이 아닌 패킷을 감싼 frame이 나가는 것이다. 그렇다면 dest address, 즉 GWR의 주소를 어떻게 알고 보낼까? 목적지는 google이더라도 GWR로 보내야한다. 우리는 DHCP를 통해 GWR의 IP 주소를 알고 있다. 따라서 구글을 향하는 패킷(src-나의 IP, dest-google의 IP)을 만들어 MAC frame의 data로 들어온다. 따라서 이게 GWR를 가기 위해선 src엔 나의 MAC address, dest엔 GWR의 MAC address가 들어가 있어야한다. 하지만 우리가 가지고 있는 것은 GWR의 IP address이므로 이걸 통해 MAC address를 찾아야한다.

이는 각각 host 내부에 있는 ARP table을 통해 알 수 있다. ARP table엔 IP address들과 그에 대응하는 MAC address가 매핑되어있다. 그렇다면 처음부터 이 table이 채워져 있었을까? 아니다. 따라서 이를 채우기 위한 것이 ARP protocol이다.

내가 원하는 IP가 table에 없다면 IP를 담은 ARP request frame을 보낸다. 이때 src는 나이고, dest는 모두 1로 모든 사람에게 보내 받은 사람이 적힌 IP를 보고 자신의 IP라면 MAC address를 적어 응답한다. 채운 table에는 cache가 달려있어 일정시간이 지나면 없어진다.

충돌이 나지 않아 GWR에 도달했다면 GWR은 IP 패킷을 꺼낸다. 패킷의 dest address를 보고 forwarding table에서 entry를 찾아 forwarding한다. 다음 hop으로 보내기 위해서는 다시 또 frame을 만들어야 한다. 이때 만들어지는 frame의 src address는 GWR에서 나가는 네트워크 인터페이스의 MAC address이다. 즉, 라우터는 여러 네트워크 인터페이스를 가지고 있어 여러 IP 주소를 갖고 있음을 배웠었다. 이처럼 MAC address도 네트워크 인터페이스당 하나씩 별개의 주소를 가진다. 따라서 라우터가 3개의 IP 주소를 가진다면 3개의 MAC 주소를 가진다.

따라서 GWR에서 다음 라우터인 R1으로 갈때 src는 GWR에서 나가는 인터페이스의 MAC address이다. 그렇다면 dest는 어떻게 찾을까? GWR 내에도 ARP table이 있는 것이다. 따라서 여기서 찾아서 전송하는 것이다. 조용한지 sense하고 조용하다면 보내고, 충돌이 나면 재전송하는 것이다.

결국 처음 출발점인 A부터 Google까지 IP 패킷의 src, dest는 바뀌지 않고 frame의 MAC 주소만 계속 바뀌는 것이다. 따라서 전송을 위해선 두개의 table을 참조하는데, forwarding table을 통해 IP를 찾고 ARP table을 통해 MAC address를 찾는다.

forwarding table은 routing을 통해 만드는데 이를 통해 자연스럽게 ARP table를 알게 된다. 하지만 ARP table엔 TTL 컬럼이 하나 더 있어서 오랫동안 갱신되지 않는 데이터는 지워진다.

A에서 B까지 전송하는 과정을 살펴보자.

그렇다면 A에서 B까지 전송하는 패킷이 있어야 하므로 IP 패킷의 src는 A의 Ip 주소인 111.111.111.111 이고, dest는 B의 IP주소인 222.222.222.222이다. 링크에서 전송되기 위해 link layer의 전송 format인 frame의 data 부분에 패킷이 넣어진다. 이 frame은 한 hop간의 통신이므로 src는 A의 MAC 주소인 74-29-9C-E8-FF-55이고 dest는 R이므로 R의 MAC 주소인 E6-E9-00-17-BB-4B이다.

frame이 R에 도착하면 라우터는 frame안에 있는 패킷을 확인한다. forwarding table을 통해 패킷의 IP dest address와 매칭되는 라우터의 IP address를 확인한다. 이는 222.222.222.220임을 확인하고, ARB table에서 MAC 주소를 확인해 frame을 만들어 패킷을 다시 넣는다. 이때 주의할 점은 src가 222.222.222.220의 MAC 주소인 1A-23-F9-CD-06-9B라는 것이다. dest는 B의 MAC 주소인 49-BD-D2-C7-56-2A이다.

잘 전송된 것을 볼 수 있다.

Switch


이전에는 위와 같이 연결했다면, 현대에는 아래와 같이 연결 한다고 했었다. 그림만 보아도 새로운 연결이 있을 때 아래의 그림이 더 수월해보인다. 이는 switch를 이용한 것이며 연결을 쉽게 하기도 하지만, 충돌 영역을 분리시켜준다. 위의 상황에서는 전체가 충돌 영역이다. 따라서 두명이상 이야기하면 충돌이 일어나는데, 아래에선 각각 충돌 영역을 분리시켜 signal이 다른 host로 가지 않도록한다.

또한 switch는 host입장에서 보이지 않아 host는 하던대로 작동하면된다. 아무것도 없는 거라고 생각하면 된다.

예를 들어 6개가 연결되었다고 할때 A -> A', B -> B'으로 전송하고 싶다면 충돌 영역이 분리되어있기 때문에 그냥 동시에 전송하면 된다. A와 B가 동시에 A'에 보내고 싶다면 스위치에서 교통 정리를 해준다. switch내에 switch table이 있어서 A'으로 가기 위해선 4번 port로 나가야됨을 알려준다.

그렇다면 table을 어떻게 만들까? routing algorithm 처럼 어려운게 아니라 self learning을 사용한다.

switch가 위의 frame을 받았다면, 그렇다면 src가 A인데 1로 왔으므로 A로 가려면 1번 port를 이용해야함을 알고 table을 채울 수 있다.

이때 A는 switch로 frame을 보내는 것이 아니라 A'으로 보내는 것이고, switch의 존재또한 모른다.
A'은 table에 안채워져있어 모르므로 A를 제외한 모든 host에게 보낸다. 이것을 flood라고 하며 이제 A'이 table에 채워져 바로 갈 수 있게 되는 것을 selectively send라 한다.

만약 사람이 많아져 기존 switch로 모자라다면 이들을 또 switch로 연결해 LAN을 확장할 수 있는 것이다. Network layer 관점에서는 switch가 없고 같은 라우터를 바라보는 것이다.

만약 C에서 I로 frame을 보내려 할때 table이 어떻게 변하는지 살펴보자. 포트번호는 각 switch별로 반시계 방향으로 0부터 시작해 부여된다고 가정하자.

처음에 C가 S1에 보내 S1이 self learning을 한다.

  • S1
DestPort
C3

따라서 S1의 table은 위와 같다. 이때 I의 port번호가 없으므로 flood하는데 A,B는 이를 받고 버린다. S4는 이를 받아 self learning한다.

  • S4
DestPort
C0

따라서 S4의 table은 위와 같으며, S4도 table에 I가 없으므로 flood한다. 이때 S2, S3가 이를 받아 self learning한다.

  • S2
DestPort
C0
  • S3
DestPort
C0

그리고 S3는 flood해 I에게 전달된다.
이제 I -> C를 보자.

그렇다면 S3가 learning한다.

  • S3
DestPort
C0
I3

이때 S3 table에 C가 있으므로 0번으로 보낸다. 0번으로 보내면 S4가 있으므로 S4는 I에대해 self learning한다.

  • S4
DestPort
C0
I2

그리곤 table에 C가 있으므로 0번 port로 보낸다. 0번 port를 통해 S1에 도달하고 S1도 I에 대해 self learning한다.

  • S1
DestPort
C3
I0

그리곤 table에 C가 있으므로 3번 Port로 보내 C로 전달된다.
그렇다면, 이제까지 테이블이 채워진 상태에서 C->I의 과정은 어떻게 될까? 가는 길의 모든 switch의 table에 I에 대한 port 정보가 있으므로 flood하지 않고 알맞은 길을 선택해서 갈 것이다.

많은 host들의 next hop은 GWR이지만, 모두 switch로 연결되어있다.

공유기 VS 스위치

공유기는 스위치가 아닌 GWR라고 생각하면된다. 이 GWR가 통신사 모뎀에 연결되어 있는 것이다. 공유기를 확장하고 싶다면, 라우터를 붙이거나 스위치를 붙일 수 있다.

하지만 라우터를 붙이면 서브넷이 하나 더 생기는 것이고 통신자체가 라우팅이 되는 것이다. 하지만 스위치를 붙이면 서브넷이 늘어나지 않기 때문에 훨씬 덜 복잡하다.

Data center

예를 들어 www.google.com을 쳤다면 Google 서버로 가는 것이다. 보통 하나의 서버 프로세스에서 처리를 하는데, 엄청나게 많은 request가 있을 것이다. 그렇다면 어떻게 처리하는 것일까? 큰 인터넷 서비스를 하는 회사를 보면 request는 한 구멍으로 들어와도 해당 request를 처리하는 서버들은 무수히 많아서 가장 loading이 적은 서버가 처리한다. 이를 Data Center라한다.

그렇다면 이것들이 어떻게 연결되어있을까? switch로 연결되어있다. 외부에서 request가 들어오면 제일 먼저 load balancer로 가서 어떤 서버가 이 일을 처리하기 적합한지 보고 forwarding 시킨다.

사용자가 많으면 많을 수록 계층화 시켜서 처리하되 그 계층화의 이음새는 switch가 담당한다.

출처

컴퓨터네트워크 한양대학교 이석복 교수

profile
백엔드 개발자 지망생

0개의 댓글