기말고사의 주된 범위가 될 듯한 네트워크 레이어다. 이번 챕터의 목표도 살펴보자
Goal
- Network layer service 뒤에 있는 principle 이해하기 (특히 data plane)
- network layer service model
- forwarding versus routing
- how a router works
- addressing
- generalized forwarding
- internet architecture
- Internet의 instantiation, implementation
- IP protocol
- NAT, middleboxes
그럼 전체적인 overview로 먼저 들어가보자
본격적으로 어떤 것을 설명하기에 앞서 우리가 배울 것의 전체적인 overview를 보는 것은 앞으로의 이해에 도움이 된다. 해당 부분에서 전체 network layer라는 숲을 보고, 그 다음 network layer에는 어떤 종류의 나무들이 사는지 알아보자.
Network layer에서 제공하는 주된 service는 sending host에서 receiving host로 segment를 전송하는 것이다.
Network layer protocol들은 모든 internet device들(예를 들어보자면 host들이나, router들)에 있다.
이런 service를 제공하기 위해서 network layer에는 크게 두 개의 function이 있다.
1. forwarding (==switching)
위 기능을 구현하기 위해서 network layer는 data plane과 control plane으로 나뉜다.
Data plane (forwarding)
- local, per-router function (라우터 단위로 제공하는 기능들, 지역적임)
- router input port에 도착한 datagram을 어떻게 router output port로 옮길지 결정
Control plane (routing)
- network-wide logic (네트워크 단위의 로직)
- source host에서 destination host까지 가는 end-end path위의 router들을 결정
- 2가지 접근법이 있음
- traditional routing algorithms: router 내부에 구현되어 있어 router 내부에서 path를 계산함.
- software-defined networking(SDN): remote server들에 구현되어 있고, remote server가 전체적인 network 상황을 보면서 path를 계산
아래 control plane을 잠깐 조금 더 설명하고 넘어가자.
per-router control plane(traditional routing)에서는 각각의 모든 router의 control plane들이 상호작용해서 local forwarding table을 만들고, 해당 table을 lookup해서 output port를 결정한다.
-> control plane이 router 내부에 존재
반면 Software-Defined Networking(SDN)에서는 control plane이 remote server에 있어, remoter controller가 모든 정보를 취합해 route를 계산하고 forwarding table을 구성한다. 이후 해당 forwarding table을 각각의 router들에 뿌려준다. 이때 router 내부의 CA(controll agency)와 상호작용해서 forwarding table을 보내주는 형식.
-> control plane이 router 바깥에 있는 것이 중요
어떤 식으로 구현되어 있는지는 대충 봤으니까 이제 service model을 살펴보자
Sender에서 receiver로 datagram들을 보내는 channel을 위해 필요한 service model은 무엇이 있을까...?
참고로 "인터넷"의 service model은 거의 항상 "best effort"이기 때문에 최소한의 것만 보장되는 경우가 많다. best effort는 다시 정의하자면 그냥 '최선은 다해보겠다.'라는 뜻.. 때문에 다음에 대한 보장은 보통 없음
NO guarantees on:
- 목적지까지 성공적으로 datagram을 전송
- delivery의 순서나 timing
- end-end flow를 가능케하기 위한 bandwidth
아래는 다른 network service들에 대한 guranteee 여부
아무튼 이와 같은 best-effort service는 아래와 같은 도움을 받는다.
결론적으로 우리는 best-effort service model을 차용하고 있다는 것.
이제 전체적인 상황은 이해를 했으니, 구체적으로 어떻게 network layer를 구현해야 best effort가 되는지 알아보자. (늘 최선을 다하는 건 힘든 일이니까..)
간단히 말하자면, Router는 L3 switch이다. 여기서 L3란 layer가 3개라는 뜻인데(나중에 배우겠지만, 그냥 switch임에도 layer가 3개인 녀석들도 있다.), Router는 input port와 output port를 가지고 있으며, input port로 들어온 packet을 어떤 output port로 보낼지 결정해야 한다. 이제 어떤 식으로 그 결정을 내리는지 자세히 알아볼 것이다.
일반적인 router architecture를 high-level에서 보면 아래의 그림과 같다.
간단히 보면, routing processor가 control plane을 담당하여 routing을 관리하고, 그 아래에 있는 high-speed switching fabric에서 switching(forwarding, 맞는 output port로 보내기)을 담당한다.
input port를 자세히 보면 위 그림과 같다.
input port에서는 physical layer인 line에서 들어온 bit가 link layer의 protocol을 통해 recevie되고, 이를 switching header field의 값을 사용해서 output port를 찾는다.
위 사진처럼 범위를 설정해서 해당하는 link interface (output port)에 해당 packet을 전달하는 방식이 바로 destination-based forwarding이다.
만약 범위가 겹쳐서 나눠지면, 반드시 공통으로 들어가야하는 부분과 아무거나 와도 되는 부분으로 분리한다.
예를 들어 1101000 100000부터 1101000 111111까지가 0번 포트로 가는 범위였는데, 만약 1101000 101000부터 1101000 101111까지는 3번 포트로 가도록 routing결과가 변경된다면? 겹치는 부분만 3으로 나누고 나머지는 여전히 0번으로 보내는 것!
그냥 보면 어려우니까 그림으로 보자
이렇게 0번이 얌전히 00010000 00000000부터 00010111 11111111까지 먹고 있었는데 갑자기 00010000 00000100부터 00010000 00000111까지는 3번 포트로 가도록 routing 결과가 바꼈다? 그럼 위 그림과 같이 routing table을 수정된다.
그렇다면 어떤 식으로 패킷당 갈 link interface를 결정할까? 그 방식이 바로 Longest prefix match이다.
longest prefix match는 말 그대로, destination address 값과 forwarding table의 각 entry를 비교할 때 맨 앞의 비트부터 비교를 해서 가장 많이 일치한 interface로 해당 값을 보낸다.
위 그림에서 1번 packet은 0번 interface로 보내는 것이고, 2번 packet은 1번 interface로 보내는 것.
이제 그렇다면 이 과정이 왜 가장 빠른 시간에 비교할 수 있는 방법인지 살펴볼 것이다.
사실 LPM은 특별한 알고리즘 없이 진행해버리면 O(NM)의 시간이 걸린다. 근데 빠른 속도를 위해서 하드웨어에 구현되어 있으니 특별한 알고리즘을 구현할 수가 없다...
그래서 LPM은 TCAM(Ternary Content Addressable Memory) 를 사용해서 수행된다.
(O(N+M)이며 1 clock cycle안에 가능)
packet의 정보를 이용해서 output port를 찾는 방법에 대해서 배웠으니, 이제 해당 port(interface)로 packet을 물리적으로 전송하는 방법을 알아보자.
Switching fabric은 input link에서 적당한 output link로 pakcet을 전송한다. switching rate는 이렇게 packet이 input에서 output으로 전송되는 속도를 말한다.
사실 이 그림은 발전한 시간 순으로 나열된 것. memory에 넣어서 하던 것이 가장 옛날 방식이고, bus가 그다음, 지금은 interconnection network 방식을 선택한다. (bus도 가끔 사용)
메모리를 사용한 스위칭부터 차근차근 봐보자.
Switching via memory
- 1세대 router에서 사용
- CPU의 직접적인 control 아래에서 switching
- packet은 system memory에 복사된 후, 전송된다. (datagram당 2번의 bus crossing)
- 이 사이의 데이터 전송은 system bus를 통해서 이루어지며, 이는 모든 링크에 의해서 공유되기 때문에 결국 이 memory bandwidth에 의해서 속도가 제한됐다.
- 구현하기는 쉬워서 처음에 많이 사용됐던 방식이다.
Switching via bus
- shared bus를 통해서 input port의 memory에서 output port의 memory로 전송됐다.
- 중요한 것은 input port와 output port에 각각 memory가 생겼다는 점
- bus connection이기 때문에 여기서도 bus bandwidth에 의해서 스위칭 스피드가 제한된다. (bus 속도가 중요한데, 이걸 올리는건 쉽지 않음)
- 또한 이 bus도 공유했기 때문에 하나의 packet이 bus를 통과하고 있으면, 다른 packet들은 대기해야 한다.
- Cisco 5600에서는 32 Gbps bus를 사용한다. 이는 access router로 사용하기엔 충분!
- Access router는 사용자가 사용하는, edge단에 가까운 router를 의미함.
- Core는 훨씬 바쁘기 때문에 이거 가지곤 택도 없다.
Switching via interconnection network
- Crossbar, Clos networks 등 interconnection net들은 원래 multiprocessor에서 processor들을 연결하기 위해서 개발됐다.
- bus의 bandwidth에 의해 속도가 제한되는 것을 극복하기 위해서 등장함
- 작은 switches의 multiple stage들로 이루어진 n*n multistage swtich이다.
- parallelism이 사용 가능해서, 같은 output port로 가는 packet이 아니라면 동시에 전송될 수 있다!
- datagram을 고정된 크기의 cell로 자르고, fabric을 통과시킨 뒤 다시 datagram으로 조립해 내보낸다.
- 위 그림과 같이 scaling하기 쉽다!
- Cisco CRS router에서 사용하는데, 8개의 switching plane기본으로 가지고, 각 plane당 3-stage interconnection network를 갖는다. (100's Tbps이상의 switching capacity)
만약 input port 속도가 switching 속도보다 빠르면, input queue에서 queuing이 발생한다. input buffer overflow로 인한 queueing delay와 loss도 같이 발생하게 된다.
output port에서 transmission되는 속도보다 더 빠르게 datagram이 도착하는 경우 buffering 발생. input보단 output에서의 queuing이 더 일반적이다.
당연히 output port buffer overflow 발생시 queuing delay와 loss 발생한다..
또한, 어떤 packet을 drop할지도 생각해봐야된다... (FIFO는 쫌...) 그 이유는 멀리서 온 packet을 버리는 경우 network cost가 높아진다.
Scheduling discipline은 queued datagram 중 어떤 것을 transmission할지 선택한다.
잠깐 코너 속의 코너로 그렇다면, 얼만큼의 버퍼 사이즈를 가져야 좋은지에 대해서 생각해보자.
무조건 클수록 좋을까? buffer가 크다면, drop 없이 모든 packet이 쌓일텐데, 그렇게되면 모든 packet의 delay가 점점 길어진다.
그렇다고 무조건 짧다면? drop되는 패킷이 점점 많아질 것...
RFC 3439 rule of thumb에 따르면, 평균 buffering은 일반적인 RTT (250msec 정도)에 link capacity C를 곱한 값이라고 한다.
최근 연구에 따르면 N개의 flow가 있을 때 buffering = RTT * C / sqrt(N)의 공식이 성립한다고 한다.
- RTT * C는 1명의 Sender가 있을 때 dynamicity를 고려한 buffer size이다.
- TCP의 congestion control에서 봤듯, data는 점점 많이 증가하다가 갑자기 전송량이 절반으로 줄어든게 된다.
- 예를 들어 100개의 packet을 보낸다면, 이후에는 50개의 packet을 보내는것.
- 또한 이때 window size가 50으로 줄어든 것이기 때문에 이후에 새로운 packet을 보내기 위해선 50개의 ACK이 올 때까지 기다린다.
- 즉 Sender는 잠깐동안 packet을 보내지 않는다...! 또한, 만약 link에 아예 packet이 없다면 그것은 network가 under utilization된 상황이기 때문에 network 전체로 봤을 때 매우 좋지 않은 상황이다.
- 반면 sender가 데이터를 보내지 않아도 buffer에 data가 있다면, 그건 utilization됐다고 할 수 있는데, 이 전부를 고려한 buffer의 크기가 RTT * C이다!
그렇다면, 사용자가 더 많아졌을 땐 왜 buffer size를 더 줄일까?
- 사람이 많아지면 1명일 때보다 dynamicity가 줄어들고(buffer underutilization 확률 감소) network traffic이 normalize된다.
- TCP congestion control에서 봤던 톱날 모양의 packet 전송 그래프에서 톱날이 거의 사라지고 1자 선이 된다는 뜻
- 때문에 buffer의 size를 줄일 수 있다...!
Keep bottlenect link just full enough but not fuller
를 기억하자.
솔직히 위 내용 이해하려고 시간 꽤 썻다...
아무튼 이제 이 buffer를 어떻게 관리하는지 살펴보자. buffer의 관리는 drop과 marking으로 나뉜다.
Packet scheduling은 어떤 packet을 다음 link에 보낼지 결정하는 것이다. FCFS, priority, RR, weighted fair queuing 등의 기법이 있다.
이렇게 지금까지 low level의 view로 봤을 때, router에서 어떻게 packet이 forwarding되는지 살펴봤다. 다음은 protocol level에서 살펴보자.
다음은 network layer에서의 기능 들이다.
1. path-selection algorithms: OSPF, BGP 등의 routing protocol과 SDN controller에 의해서 구현된다.
2. IP protocol: Datagram format, addressing, packet 처리에 대한 convention들을 나타낸다.
3. ICMP protocol: error reporting이나 router signaling을 담당한다.
IP datagram format은 위 그림과 같다. 위에서부터 살펴보자.
ip datagram이 어떻게 이루어져있는지도 확인했으니, 이제 각각 ip를 통해서 어떻게 전송(addressing)되는지 보자.
IP address는 각 host와 router들의 interface당 1개씩 결합된 32-bit identifier이다.
Interface는 host/router와 physical link 사이의 연결을 의미한다.
이 interface들이 실제로 어떻게 연결되는지는 다음 chapter들에서 살펴볼 예정. 그냥 딱 말하자면 wired ethernet interface들은 ethernet switch에 의해서 연결되고, Wifi는 WiFi base station(Access Point)에 의해서 연결된다.
그렇다면 모든 host들이 하나의 network에 연결되어 있을까? 정답은 아니다.
네트워크는 여러 계층구조로 이루어져있는데, 하위 계층의 net을 의미하는 subnet이 바로 그것이다. 이제 subnet을 알아보자.
Subnet은 router를 통과하지 않고 내부에서 물리적으로 연결된 device interface들을 의미한다.
IP address는 subnet part와 host part로 구성된다.
Subnet을 결정하기 위해서 router로부터 각각의 interface를 분리한다. (위 그림에서 분리된 각각의 섬모양 네트워크들이 바로 subnet!
이제 개념을 알게 됐으니, 자연스레 두 가지 질문이 떠오른다.
Question1. Subnet에 포함된 한 host는 어떻게 IP 주소를 얻을 수 있을까? (address의 host part)
2. network는 그 자체로 IP address를 어떻게 얻을까? (address의 network part)
첫 번째 질문의 답은 아래와 같다.
1. 사람이 직접 sysadmin의 config file에 하나씩 hard-coding하는 방법.
2. DHCP(Dynamic Host Configuration Protocol)을 사용해서 서버가 동적으로 address를 할당하는 방법.
DHCP의 목표는 host가 network에 join할 때, network server에게 동적으로 IP address를 얻을 수 있도록 하는 것이다.
DHCP에는 크게 다음 4가지 packet이 있다.
DHCP 시나리오는 다음과 같다.
src: 0.0.0.0, 68
dest: 255.255.255.255, 67 (FFFF FFFF FFFF FFFF)
yiaddr: 0.0.0.0
transaction id: 654
src: 223.1.2.5, 67
dest: 255.255.255.255, 68
yiaddr: 223.1.2.4
transaction ID: 654
lifetime: 3600secs
src: 0.0.0.0, 68
dest: 255.255.255.255, 67 (FFFF FFFF FFFF FFFF)
yiaddr: 223.1.2.4
transaction id: 655
lifetime: 3600secs
src: 223.1.2.5, 67
dest: 255.255.255.255, 68
yiaddr: 223.1.2.4
transaction ID: 655
lifetime: 3600secs
이 과정에서 DHCP는 단지 IP address만 할당해주는 것이 아니라 host에게 더 많은 정보를 알려준다.
또한 이 모든 과정은 UDP로 이루어지는데, Client에는 아직 IP address가 없기 때문에 TCP connection을 만들 수 없어서 UDP를 사용한다.
여기까지가 첫 번째 질문에 대한 답변이다....
두 번째는 뭐였는지 가물가물 하니 다시 불러오자.
Network는 IP address의 subnet part를 어떻게 얻나?
정답은 의외로 간단하게 해당 subnet의 provider ISP에게서 얻는다. provider ISP address space의 일부를 할당받는 것.
위와 같은 Hierarchical addressing을 통해 routing information을 효율적으로 광고할 수 있다.
또한 하나의 조직이 만약 다른 ISP로 이동했을 지라도, ISP의 routing table만 update하면 될 뿐 subnet 내부의 ip는 변경하지 않아도 되니 아주 효율적이다!
Q. 추가적으로 ISP는 어떻게 IP를 할당받느냐..?
A. DNS를 관리하고, Domain name을 지정하며 ICANN이라는 기관에서 할당받은 것.
Q. 32bit의 ip를 쓴다면 그건 세상에 최대 2^32개의 interface만 존재할 수 있다는 말이다. 1인당 쓰는 기기가 스마트폰, 워치, 태블릿, 노트북, 데스크탑에다가 각종 IoT 기기들만 해도 2^32개가지곤 부족할 것 같은데.. 하물며 Interface가 저 개수로 제한되는 것은 말이 안된다.
A. NAT이 IPv4의 부족함을 해결해준다. (다음에 배움) 그리고 IPv6도 새로 나왔다!
다음 게시글에서는 NAT에 대해서 배워보자