네트워크는 Network Edge 와 Network Core 로 구성되어 있다.
Network Edge는 크게 Host와 Host가 접근하는 가장 가까운 네트워크인 Access Network,
그리고 이들 사이를 연결하는 Physical Link로 이루어져있다.
이제 Network Core에 대해 정리해보자.
Network Core, Forwarding, Routing
네트워크 코어는 라우터들이 서로 연결되어있는 mesh (그물망) 형태의 모양이다.
mesh 라고 하면, 정형화 되어있는 (특정한 형태가 있는) 모양이 아닌, 얼기설기 얽힌 모양을 뜻한다.
host의 어플리케이션이 보낸 메세지가 패킷으로 잘게 나뉘면, 이 패킷은 physical link를 타고 네트워크 코어에 있는 라우터로 들어간다.
호스트에서 인접한 라우터, 또는 하나의 라우터에서 그 다음에 연결된 라우터 사이를 'hop' 이라고 하는데,
라우터에서는 인접한 다른 라우터로 패킷을 포워딩한다. (포워딩:Forwarding = 밀어보내다 = 전송하다)
즉, 출발지(Source Computer)에서 목적지(Destination Computer)까지 hop by hop으로 포워드하면서 데이터를 보내는데,
이 과정에서 Packet Switching이 발생한다. (forwarding == switching)
Forwarding vs Routing
이제 구체적인 포워딩 과정을 살펴보자.
예를 들어 어떤 라우터로 패킷이 들어왔는데, 그 라우터에 인접한 라우터가 3개 있다고 해보자.
그러면 이 라우터는 받은 패킷을 어떤 인접한 라우터로 보낼지 결정을 해야한다.
패킷에는 여러가지 정보가 들어있는데, 패킷의 헤더에는 목적지의 주소에 해당하는 값이 들어있다.
이때 라우터는 패킷의 header value 에 따라 어떤 인접한 라우터로 가야하는지를 명시한 forwarding table 이라는 자료구조를 통해 포워딩할 라우터 정보를 찾는다.
그리고 이 자료구조는 Routing Algorithm 을 통해 만들어진다.
(라우팅 알고리즘은 '분산 알고리즘' 이다.
일반적으로 사용하는 알고리즘이 하나의 컴퓨터에서 실행시키는 것과 달리, 분산 알고리즘은 여러 컴퓨터가 자신의 정보를 서로 교환하여 최적의 결과를 찾는 방식을 뜻한다.)
각각의 라우터는 라우팅 알고리즘을 통해 만들어진 forwarding table을 각각 가지고 있다.
그래서 패킷이 들어오면 자신이 가지고 있는 forwarding table을 살펴보고 (look up) 다음에는 어떤 라우터로 보낼지 결정하게 된다.
이렇게 각각의 라우터가 하는 행위는 "local action" 이다.
라우터 자신의 좁은 시야에서 당장 받은 이 패킷을 어디로 보낼지 독자적으로 결정하는 행위이기 때문이다.
반면 라우팅은 "global action" 이다.
라우팅 알고리즘은 위에서 설명한대로 '분산 알고리즘'을 사용하여 여러 컴퓨터가 서로 협력하여 결과를 얻어낸다.
전역적으로 다수의 컴퓨터에서 알고리즘을 실행하여 source-destination 경로를 결정한다.
정리하면 라우팅은 네비게이션에서 경로 설정을 하는 것처럼, 전체 큰 그림에서의 경로를 알려주는 것을 의미하고,
포워딩은 해당 경로대로 이동하기 위해 필요한 정보 (인접 라우터 정보) 를 신속하게 찾아 실행하는 것을 의미한다.
네비게이션으로 치면 해당 경로대로 따라가려면 구체적으로 지금 갈림길에서 왼쪽으로 가야하는지 오른쪽으로 가야하는지 빠르게 알려주는 것과 같다.
Packet Switching : Store and Forwrard
현재 인터넷에서는 일반적으로 Packet Switching 방식을 사용하고 있다.
패킷 스위칭은 기본적으로 위에서 말한 Forwarding, Routing 개념을 사용한다.
다시한번 구체적인 예시를 들어보자.
A 컴퓨터에서 B 컴퓨터로 데이터를 전송하려고 하는데, 사이에 라우터가 하나 있다고 해보자.
컴퓨터와 라이터 사이에는 R bps 의 전송률을 가진 링크가 있고, 전송할 데이터는 L bit 의 패킷들이라고 하자.
지난 글에서 정리하였듯이, 패킷 하나의 데이터를 모두 통신 링크로 들여보내는데 걸리는 시간을 packet transmission delay 라고 하며, L/R 시간이 소요된다.
만약 10Kbit 의 패킷을 100Mbps 전송률의 링크로 밀어넣는 transmission delay를 구하라고 한다면
10Kbit / 100Mbit/s = 0.1 msec 가 된다.
이때 패킷을 연속적으로 보낼 때는 store and forward 방식을 일반적으로 사용한다.
말 그대로 모든 패킷 데이터가 라우터에 다 도착을 할 때까지 저장했다가, 패킷 데이터가 다 도착을 하면 그때 다음 라우터로 패킷 데이터를 전송하는 방식이다.
이와 대조되는 방식으로 Cut Through 방식이 있는데, 이 방식은 패킷 하나의 데이터가 아직 다 도착하지 않았더라도, 패킷의 헤더를 통해 목적지를 알았다면 일단 데이터가 오는 족족 바로 다음 라우터로 보내는 방식이다.
언뜻보면 이 방식이 더 효율적일 것 같지만, 실제로는 구현하기가 어려워서 많은 라우터들은 store and forward 방식을 사용한다고 한다.
Packet Switching : Queueing
이번엔 라우터 하나로 데이터를 보내는 컴퓨터가 여러대인 상황을 생각해보자.
하나의 라우터에서 여러대의 컴퓨터가 패킷을 보낸다면, 라우터는 뒤섞여 들어오는 여러 종류의 패킷을 어떻게 처리할까?
간단하다. 우리가 식당에서 줄을 서는 것처럼, 패킷도 큐에 넣어서 차례대로 output link 를 따라 전송시킨다.
이때 output link 로 나가는 속도보다 패킷이 들어오는 속도가 더 빠르다면, 큐에는 끊임없이 패킷이 쌓이게 되고, 결국 성능 문제를 일으킬 수도 있게 된다.
대표적인 성능 문제는 반응 시간이다. 웹사이트에 접속했는데, 사이트 로딩이 오래 걸리는 것도, 해당 사이트로 들어오는 요청의 양이 사이트가 한번에 처리하는 요청의 수보다 많아 요청이 쌓이면서 대기가 밀려서 발생한다.
심지어 이 현상이 심해져서 큐(메모리, 버퍼)가 가득 차버리면 내가 보낸 요청이 큐에 들어가지 못하고 버려지는 현상이 발생할 수도 있다. (이를 꼬리 자르기, tail drop 정책이라고 한다.)
이 경우, 패킷을 보내는 sender 쪽에서는 계속해서 반복적으로 패킷을 보낼 수도 있는데 이러면 또 악순환이 계속된다.
이 성능에 대한 문제는 뒤에서 자세히 다루기로 하고, 지금은 패킷 스위칭이 '큐'를 활용해서 라우터로 들어온 패킷을 큐를 사용해 순차적으로 처리한다는 것만 이해하자.
Circuit Switching
이 패킷 스위칭의 대안으로서 서킷 스위칭 방식도 존재한다.
이 방식은 마치 전화통화를 하는 것처럼 end-end resources 에게 이 둘만의 전용 회선(circuit)을 만들어주는 방식이다.
통신을 원하는 두 host 간의 연결이 성립되면, 그 두 host가 데이터를 주고받는 전용 회선이 생기고, 이 회선에서는 다른 데이터가 지나다니지 않기 때문에 품질(성능)을 보장할 수 있다는 장점이 있다.
하지만 단점도 존재한다.
우리가 전화를 할 때 1분 1초도 쉬지않고 계속 말만하는 것은 아니다.
가끔 할 말이 없으면 조용해지기도 하고, 말하다가도 중간에 쉬는 타이밍들이 존재한다.
서킷 스위칭 방식도 데이터를 주고받지 않는 대기 시간 (idle) 이 존재하는데, 이때 이 회선이 낭비된다는 단점이 있다.
이 방식을 구현할 때는 보통 예전에 쓰던 전화선을 그대로 활용해서 적용하는 경우가 많다.
FDM, TDM
서킷 스위칭과 관련하여 하나의 회선을 하나의 연결에 할당하는 방법으로 크게 2가지가 있다.
하나는 주파수 분할 다중화 (Frequency Division Multiplexing) 이다.
하나의 회선을 주파수별로 분할한 뒤, 특정 주파수를 하나의 연결에 온전히 할당하는 방식이다.
이 경우, 연결이 끊기지 않고 지속적으로 이어지지만, 주파수 대역이 비교적 좁으므로 한번에 많은 데이터를 보낼 수는 없다.
다른 하나의 방식은 시분할 당중화 (Time Division Multiplexing) 이다.
이 방법은 하나의 연결에 특정 시간동안 모든 주파수 대역을 사용할 수 있도록 하는 방법이다.
대신 시간을 쪼개서 돌아가며 특정시간동안만 주파수를 사용한다.
이렇게 시간을 쪼갠 단위를 'slot' 이라고 부른다.
각각의 연결들은 이 slot에 할당되어 더 넓은 대역폭으로 데이터를 주고받을 수 있다.
Packet Switching vs Circuit Switching
하지만 현대에는 대부분 패킷 스위칭방식을 사용한다.
왜 그런걸까?
가장 큰 이유는 경제적인 문제때문이다.
예를 들어, 1Gb/s 의 link 가 있고, 한 명의 유저는 실제로 회선을 사용할 때(active)는 100Mb/s 정도 사용하며, 전체 시간중에서 10%만 실제 회선을 사용한다고 해보자.
만약 서킷 스위칭방식을 쓴다면, 우리는 이 회선을 최대 10명의 유저에게밖에 대여해주지 못한다.
한명의 유저가 실제로 사용하지 않는 90%의 시간이 있더라도, 한번 할당된 회선은 독점적으로 그 유저만이 쓸 수 있기 때문이다.
반면 패킷 스위칭 방식을 쓰면, 단순 계산했을 때 35명 정도에게 대여해줄 수 있다.
(현실과는 다르지만) 10%의 사용시간을 독립시행으로 가정하여 계산했을 때, 한번에 11명~35명 사이의 유저가 특정 동시간대에 모두 회선을 쓰겠다고 몰릴 확률이 0.0004 이기 때문이다.
즉, 매우 높은 확률 (99.9996%)로 이 회선에는 10명 이내의 활성사용자들만이 존재하므로 35명까지 가입자를 받더라도 문제가 없다.
하지만 현실에서는 독립시행적이지 않고, 대부분의 유저가 몰리는 시간대가 편향되어 있으므로 이 방식처럼 계산은 못한다고 한다.
또한 패킷스위칭이 가지고 있는 문제 (패킷이 몰리면 느려지는 문제 등) 를 고성능 대역폭을 가진 회선을 이용함으로써 해결하는 등, 기술적인 발전도 뒷받침 되고 있어 요즘은 서킷 스위칭 방식을 고려하지 않는다고 한다.
또 다른 패킷 스위칭 방식의 장점은 유연하다는 것이다.
강의록에서는 bursty data 라고 하는데, 들쭉날쭉한 트래픽에 대해 대응을 보다 빠르게 할 수 있다.
서킷 스위칭 방식처럼 미리 할당을 받아야 하는 문제도 없고, 트래픽이 높아지면 회선을 더 많은 트래픽과 공유하여 사용할 수도 있다.
물론 장점만 있는 것은 아니다.
아까 위에서 서술한대로, 데이터가 너무 많이 몰리면 (excessive congestion) 버퍼 오버플로우로 인해 패킷 처리가 지연(delay)되거나 패킷이 손실(loss) 될 수도 있다.
그래서 이런 상황에 대해 어떻게 대응할지 미리 규약(프로토콜)을 정해둬야 한다. (Internet은 이 규약으로 tcp를 사용한다.)
물론 패킷 스위칭방식과 서킷 스위칭 방식의 장점을 모아서 품질도 보장되고, 많은 사용자들에게 효율적으로 회선을 나눠줄 수도 있다면 좋겠지만, 실제로는 이를 구현하는 것이 매우 복잡하다.
그럼에도 불구하고 몇가지 이를 구현한 방식이 있는데, 이런 "circuit-like" packet swtiching 기법에 대해서도 나중에 정리한다.
'CS > 컴퓨터 네트워크' 카테고리의 다른 글
[컴퓨터 네트워크] 6. Security (0) | 2024.04.08 |
---|---|
[컴퓨터 네트워크] 5. Performance (loss, delay, throughput) (0) | 2024.04.05 |
[컴퓨터 네트워크] 4. Network Core : Internet Structure (0) | 2024.03.20 |
[컴퓨터 네트워크] 2. Network Edge (0) | 2024.03.11 |
[컴퓨터 네트워크] 1. 인터넷과 프로토콜 (0) | 2024.03.05 |