공부함
링크 계층 본문
패킷을 만들면 1차적인 목적지는 gateway router이다. 실제 link는 많은 host가 공유한다. 따라서 보내려는 message가 collision이 발생하게 된다. 이런 충돌이 발생하지 않게 하거나 충돌을 해결하는 것이 link layer의 일이다. link layer에서 다루는 내용은 src에서 dest까지 전체 여정에 대한 이야기가 아닌 한 hop에 관한 내용이다. (유 무선인 상황을 나눠서 다룬다)
link layer 구현 위치
transport layer, network layer는 os 내부에 구현되어 있다. 즉 코드다. link layer는 network interface card에 구현되어 있다. network layer의 전송단위인 frame에 의해 전송하게 된다.
mac protocol
link가 p2p로 연결되어 있으면 간섭 문제가 없다. 하지만 link는 broadcast medium으로 여러 군데로 연결되어 있는 매체다. 따라서 medium access control, mac protocol로 어디에 접근할 지 제어를 해줘야 한다. wifi, lte 등이 mac의 예시이다. 많은 사람이 동시에 같은 wifi를 이용하지만 mac protocol에 의해 충돌하지 않는다.
이상적인 mac
bandwith R인 link에 대해 이상적인 mac은 아래와 같이 작동한다.
- 하나의 노드가 전송하고 싶으면 rate R로 전송할 수 있어야 한다.
- M개 노드가 전송하면 R/M으로 전송한다.
- decentralized 분산처리
- simple
실제 mac 프로토콜이 많이 있었고 3가지 분류로 나눌 수 있다
- channel partitioning
- random access
- taking turns
channel paritioning
TDMA
채널 파티셔닝 방식의 대표적인 예시가 TDMA이다. time division multiple access로 시간을 쪼개서 여러사람이 access 할 수 있게 만든다.
시간별로 나눠서 사용하는데 6slot인데 3명만 사용하니 3칸이 비어서 자원 낭비가 발생한다.
FDMA
FDMA도 채널 파티셔닝 방식이다. 시간이 아니라 주파수로 쪼개는 방식이다. TDMA와 같은 장단점을 같는다.
random access protocol
이것은 원할 때 접근해서 보내겠다는 프로토콜이다. 처으 개발된 random access protocol이 ALOHA이고 문제점을 개선해며 CSMA protocol이 개발되었다.
CSMA
csma는 random access protocol로 carrier sense multiple access이다. listen before transmit으로 먼저 듣던걸 다 듣고, 말하는 방식이다.
CSMA 충돌
CSMA를 사용하더라도 누군가의 말이 끝난 시점에 2명 이상이 동시에 말하려고 하면 충돌이 발생한다.
위 예시 상황은 2번째가 보낸 frame이 4번째에게 닿기 전에 4번째 입장에서는 현재 listen 할것이 없으므로 frame을 보낸 것이고 충돌이 발생한다. error 없이 온전히 받지 않은 frame은 날린다. 2번째가 보내고 4번째까지 도달하기의 시간, 즉 propogation deplay가 존재하기 때문이 이런 문제가 발생한 것이다. propogation delay가 존재하지 않을 수는 없다. 빛의 속도로 이동해서 걸리는 시간이기 때문이다. 따라서 이런 collision이 발생하지 않을 수는 없다. 위 예시에서는 coliision이 발생했음에도 불구하고 자신의 fragment를 끝까지 전송해서 낭비가 심하다. 대신 collision이 발생하면 남은 fragment를 전부 전송하는 것이 아니라 조취를 취하는 것이 최선이다.
CSMA/CD
CSMA/CD는 충돌을 감지하면 전송을 즉시 멈추는 방식이다. 충돌을 감지해서 멈춘 후의 동작에 대해 알아보자.
연속적으로 m번의 collision이 발생한다면 {0,1,2,....,2^m-1}의 시간 중 하나를 골라서 그만큼 기다린다. 예를 들어 충돌이 1회 발생하면 {0,1}중에 하나를 고른다. 반면 연속된 충돌 횟수가 많아지면 그만큼 오래 기다리게 된다. 연속해서 충돌이 발생할수록 도잇에 frame을 보내려는 사람들이 많을 확률이 높기 때문이다. backoff은 기다리는 시간, 즉 delay이다. 사용자가 많을수록 연속적으로 충돌이 발생할 확률이 커지고 delay가 길어진다. wifi를 사용할 때 접속한 사람이 많으면 체감 delay가 길어지는 이유다.
taking turns
채널 파티셔닝과 랜덤 억세스를 잘 조합해본 방식이다. 잘 쓰이지는 않는다.
polling
master가 slave들을 관리하는 방식으로, slave들이 순서에 맞춰 전송하도록 관리한다. 하지만 master에 문제가 발생하면 전체가 무너진다는 단점이 있다.
token passing
보낼 데이터가 없으면 token을 넘기고 있으면 token을 가지고 있는 채로 data를 보낸다. 하지만 token을 분실할 수 있으며 token에 의존하므로 역시 single point failure 문제가 있다.
우리가 일반적으로 사용하는 방식은 random access의 CSMA/CD 방식이다.
Ethernet
lan은 local area network로 공유되는 medium으로 연결된 집합이다. Lan 상황에서 작동하는 protocol이 ethernet이다. 이더넷은 과거에 나왔지만 단순하고 효과적이므로 지금까지도 사용된다.
요즘의 LAN 구성은 switch를 두고 구성된다. switch에 대해서는 뒤에서 자세히 다룬다
ip pkt을 프레임이 감싼다. 프레임 역시 헤더가 있다. 헤더 필드는 4개다. 특이하게 에러체킹에 사용하는 tail CRC가 있다.
- type : 프레임의 data가 상위 레이어의 어떤 프로토콜인지, 주로 IP다.
CSMA/CD
이더넷은 CSMA/CD를 사용한다. collision을 감지하면 link layer에서 재전송한다. 이것은 lan 수준에서의 재전송이다.
이더넷에서 CSMA/CD의 재전송은 gateway router까지 전송하다가 collision이 발생하면 재전송을 하는것이다. 반면 TCP의 재전송은 src -> dst까지 문제가 발생했을 때의 재전송이다. 이더넷에서 재전송하는게 TCP의 재전송보다 cost가 적다.
유선 상황에서 이더넷의 재전송은 collision이 발생했을 때만 일어난다. 왜냐하면 유선 link는 외부로부터 보호받으므로 내부로부터 발생한 collision이 아닐경우 99% gateway router까지 도달한다고 간주하기 때문이다. 따라서 gateway router는 굳이 link layer에게 feedback을 줄 필요는 없다.
collsion 발생을 detect 하지 못할 수 있을까? 먼저 collision detect 방법을 생각해보자. A가 frame을 보내는 동안(transmission delay 동안) B의 frame이 A에게 도착하면 collision detect한다. 따라서 실제 collision이 발생했어도, B의 frame이 A의 transmisson delay가 끝난 후 A에게 도달하면, 즉 A의 frame이 A의 손을 떠난 뒤 도달하면 A는 collision을 감지하지 못한다. B의 frame이 A에 도달하는 속도는 광속이므로 늘릴 수 없다. 따라서 A의 transmisson delay를 늘려야 한다. A가 더 오랫동안 frame을 보내게 하면 collision detect가 가능하기 때문이다. 따라서 64byte라는 minimum frame size를 지정한 것이다. 즉 A가 실제로 보내려는 데이터가 1byte여도 padding을 집어넣어서 64byte로 만들어준다.
mac address and arp
link layer에서 사용하는 독립적인 주소체계가 mac address다. frame 헤더에는 48bit짜리 mac address를 사용한다. 앞 24bit는 제조회사, 뒤 24bit는 그 인터페이스의 고유 number, 즉 mac address다. mac address는 비유하자면 주민번호처럼 바꿀 수 없는 인터페이스 카드의 고유한 값이다. 이 값을 frame 헤더의 src와 dest값에 넣는 것이다.
frame을 gwr까지 보내기 위해서는 dest mac addr을 알아야 한다. 우리는 dhcp에 의해 gwr ip addr은 알지만 mac addr은 모른다. 이것을 알기 위해 각 host마다 arp table이 있다. (application resolution protocol) arp table은 각 ip 주소와 mac addr을 매핑해놓은 테이블이다. arp에 원하는 host의 mac addr이 없을 수도 있다. 이것을 채워넣기 위해 arp procol을 사용한다. arp request frame을 lan 전체에 broadcasting 한다. broacast이므로 frame hdr의 dest는 FFFF이다. arp request의 body에는 mac addr을 알아내려는 대상의 ip를 적는다. broadcast에 의해 lan의 모든 host가 arp request를 받지만 request body에 적은 ip와 자신의 ip와 일치하는 경우에만 response를 보낸다. 또 arp table에는 ttl이 있다. ttl이 만료되면 다시 arp 요청을 해서 값을 갱신한다.
src에서 dest까지 frame을 보내는 동안 nw layer의 ip pkt의 src ip, dest ip는 변하지 않는다. 다만 router를 지날 때마다 frame hdr의 src addr, dest addr은 변한다. nw layer에서 forwarding table을 참고해 다음 router의 주소를 얻고, link layer에서 arp table을 참고해 그 router의 mac addr을 알아낸다. 즉 한번의 hop마다 forwarding table과 arp table을 참고한다.
switch
switch의 port에 선을 꼽아서 사용할 수 있다. switch는 편리하고 collision domain을 분리해주는 효과가 있다. 즉 위 예시의 4군데애서 동시에 보내도 충돌이 발생하지 않는다. 다만 각 host는 switch의 존재를 의식하지 않는다. switch가 없을때랑 똑같이 CSMA/CD를 한다. switch가 있기 때문에 충돌이 훨씬 적게 발생할 것이다.
- collision domain을 분리해줘서 A->A'와 B->B'를 동시에 보낼 수 있다.
- A와 B에서 A'으로 보내면 무엇을 먼저 보낼지 교통정리를 해준다.
- switch도 switch를 하기 위해 switch table을 사용한다.
- self-learning을 통해 switch table을 만든다.
- 최초에 A->A'인 frame이 switch에 도착하면 switch는 A가 1번 포트임을 알 수 있다.
- 반면 A'가 몇번 포트인지는 모르기 때문에 모든 포트로 보낸다 : flooding
- A'에서 출발한 frame이 추후에 switch에 오면 이제 A'의 port도 알 수 있고 switch table에 적는다.
- switch는 ip주소나 mac addr을 갖지 않는다. 반면 router는 ip interface가 있으므로 ip 주소와 mac addr을 갖는다.
switch에 switch를 연결해서 계층화 할 수도 있다. 위 예시에서 A에서 I로 frame을 보낸다면 최초에는 flooding이 발생한다. 하지만 한번 보내고 나서 I에서 C로 보낸다면 forwarding table에 필요한 정보가 있어서 flooding이 발생하지 않는다.
공유기는 특수한 형태의 컴퓨터다. app layer에서 nat, dhcp, ns가 동작한다. 통신사에서 할앋받은 ip를 nat을 통해 여러개 private ip로 만들어서 유,무선으로 제공한다. 즉 공유기는 외관은 switch처럼 생겼지만 일종의 라우터이자 컴퓨터이다.
구글 같은 대기업은 서버가 많다. 데이터 센터에 서버를 많이 놓고 switch를 계층적으로 구성해 연결한다. 로드밸런서를 사용한다.