network-layer function에는 forwarding과 routing이 있다고 언급했었다. data plane에서는 forwarding을 담당하며, buffer를 관리하고 control plane에서는 routing을 담당한다.
control plane의 구조는 2가지 접근법이 있다.
라우팅 프로토콜의 목표는 src에서 dest까지의 좋은 path를 결정하는 것
link cost는 이렇게 그냥 방향 그래프로 보면 더 쉽다.
각 edge가 갖는 cost가 바로 link cost이며, 만약 연결이 없다면 INF(infinate)로 설정된다.
cost는 network operator에 의해서 설정되는데, 1일수도 있고, bandwidth의 역으로 설정될 수 있고 congestion 상태의 역으로 설정될 수 있다. (congestion이 good이면 low cost)
구체적으로 routing protocol의 분류는 아래와 같다.
글로벌은 모든 라우터가 네트워크 전체 topology와 link cost를 알고 있는 경우이며, link state 알고리즘을 사용한다.
분산형에서는 라우터가 물리적으로 연결된 이웃의 cost만 알고 있으며, 이웃의 정보를 받아 옴으로써 조금씩 업데이트한다. distacne vector algorithm을 사용한다.
-> 차이점은 맨 처음에 router가 전체 정보를 알고 있냐, 자기 정보만 알고 있냐의 차이
정적 알고리즘은 시간에 따른 경로 변경이 매우 느린 것을 의미하고, 동적은 시간에 따라서 휙휙 주기적으로 업데이트 하는 것을 말한다. 주기적으로 link cost를 업데이트 하는 것을 말함.
link state 알고리즘은 우리가 익히(?) 알고있는 다익스트라 알고리즘을 사용한다.
모든 노드가 전체 network topology와 link cost를 알고 있으며, 이는 link state broadcast에 의해서 알게 된다. (모든 노드가 아는 정보가 같음)
알고리즘은 다익스트라와 같다.
간단히 설명하면, 시작 노드에서 모든 노드들에 대한 비용을 구한다. 이후 N'에 포함되지 않은 모든 노드들에 대해서 최소비용을 탐색한다. (최소라면 N'에 추가)
이후 해당 노드의 주변 노드를 다시 탐색한다.
원래 경로와 새로 추가된 경로를 거쳐서 가는 경로의 cost를 비교해 더 작은 걸로 업데이트한다.
이건 다익스트라가 발생하는 과정을 표로 나타낸 것.
최종으로 남은 그래프는 위와 같고, 표로 나타낸 것도 포함했다. (표에는 시작 router u와 연결된 것 중 가장 첫 번째 router를 기록해둔 것이다.
시간복잡도는 O(n^2)인데, 가장 작은 노드 찾는 과정을 위 코드처럼 heap이나 priority queue에 넣고 하면 O(nlogn + e)으로 가능하다.
또한 각 router는 link state 정보를 다른 n개의 router에 broadcast해야 한다. 이 과정을 효율적인 broadcast algorithm을 사용하면 O(n)만에 link crossing이 가능하다.
또한, link cost를 traffic volume에만 의존하도록 설계하면 route oscilation이 발생할 수 있다.. --> 따라서 link cost를 traffic의 정도로만 설정하면 안된다!!!!
아래 그림을 보자. 이렇게 불필요한 반복을 통해 route가 계속 변동할 수 있다.
Distance vector 알고리즘은 Bellman-Ford(BF) equation을 사용한다. (Dynamic programming의 한 종류)
간단히 설명하자면, 이웃 노드로 가는 비용 + 이웃에서 목적지로 가는 비용을 비교해서 최소값을 선택하는 것이다.
그림을 보면 이해가 더 쉽다. u에서 z로 가는 비용을 계산할 때, 인접한 라우터들 중 어떤 걸 거쳐서 가는 것이 가장 빠를지만 결정하는 것
각 노드가 자신의 distance vector를 계산결과를 이웃에게 보낸다.
각 노드가 이웃으로부터 새로운 DV 결과를 받으면, BF방정식을 사용해 자신의 DV를 업데이트
보통 실제 상황에서 DV는 실제 최소비용 DV로 수렴한다.
즉, 각 노드는 자신의 link state를 모니터링하면서, 이웃들이 notify하는 것을 받는다. 주변의 notify가 오면 estimate를 다시 계산하고, DV가 바뀐 경우에만 이웃에게 알린다.
특징:
위는 t=1일 때의 DV정보 값들이다. 1일때는 바로 이웃 라우터의 정보를 받아서 거기서 갈 수 있는 정보까지 업데이트된 모습을 확인할 수 있다.
최종적으로 t만큼의 시간이 흘렀다면, t만큼 떨어진 router까지의 최단거리 정보를 계산할 수 있다.
distance vector는 link가 긍정적으로 변하는 경우 빨리빨리 전파되는데, 부정적으로 변하는 경우 엄청나게 느린 속도로 전파된다. 이를 count-to-infinity problem이라고 한다.
이렇게 있을 때, 4가 60으로 바꼈다면 y는 x로 가는 최단 루트를 업데이트 해야됨.
주변을 보니, z를 통해서 x로 가는 루트 (z->y->x)가 5니까, 5+1을 해서 6으로 업데이트하고, 그럼 z는 또 업데이트하고...
z->x로 가는 길이 51이 될 때까지 1씩 반복하면서 업데이트한다. (51이 되면 z->x로 직접 가는 link cost가 50이라 멈춤, 하지만 만약.. cost가 1000이라면?)
해당 문제는 z가 어떤 path를 통해서 x로 가는지를 말해주지 않기 때문임.
LS: N개의 노드일 때 O(n^2)만에 메시지 전달
DV: 이웃들 하고만 교환, 각 노드가 최소 cost로 수렴하기까지의 시간은 다양함.
LS: O(n^2) 알고리즘 O(n^2)메시지 요구 사용
DV: 다양한 시간이 걸림.
LS: 노드가 잘못된 링크 cost 브로드 캐스트 가능
DV: 잘못된 링크가 아니라 잘못된 PATH를 전파
LS: 브로드 캐스트로 모든 노드에게 일시에 교환, 전체 네트워크 상황을 아는 상황에서 작동
DV: 이웃하고만 정보 교환해서 시간 오래걸림
사실 지금까지의 routing에 대한 공부는 약간 이상적인 상황이었다. 모든 라우터가 식별 가능해야하며, network가 flat하다는 가정 하에 계산한 것.
실제로는 당연히 그렇지 않으며, 그렇지 않은 이유가 2가지 있다.
2.Administrative autonomy:
한 지역에 있는 router들의 집합체는 Autonomous System(AS, domains)라고 부른다. 이 AS 내외의 통신에는 두 가지 종류가 있다.
Forwarding table은 intra-AS와 inter-AS routing 알고리즘을 통해서 구성된다.
Intra-AS Routing: 실제 인터넷은 모든 네트워크가 플랫한 환경이 아닌 어떤 중앙 집중에서 가지치기 형태로 나오는, 트리 형태의 하위 계층을 가짐
scalability issue: 모든 목적지에 대해서 어떤 정보를 라우팅 테이블이 담기는 힘듦. 참여자 수가 늘어남에 따라 급격하게 성능이 악화되어 어느 이상이 되면 전혀 동작하지 않게 됨
autonomous system(AS): 동일한 네트워크 ID를 갖는 집합들(도메인). 한 기관에서 관리하는 네트워크 라우터들의 집합, 호스트들의 집합
각 네트워크들은 개별 관리자들이 관리하고 싶어함
Intra: AS 내부 라우팅. 대표적으로 distance vector와 link-state
Inter: AS 외부 라우팅
border router(gateway router, 경계 라우터): AS와 AS를 연결해주는 라우터
AS 간의 라우팅을 할 때는 gateway router가 inter-domain routing을 동작
하나의 라우터는 intra-AS 라우팅 + inter-AS 라우팅으로 포워딩 테이블 구성: Intra-AS 라우팅 알고리즘만으로는 외부로 가는 경로를 알 수 없기 때문에, Inter-AS 라우팅 알고리즘의 도움이 필요
RIP(Routing Information Protocol)
Distance Vector(30초마다)를 사용하는 프로토콜로 더 이상 많이 사용하지 않는다. path에 대한 (강건성, robustness 문제) 경로의 오류가 발생하면 안됨, count to infinity 등의 문제가 있기도 해서 요즘에는 많이 사용하지 않는다.
EIGRP(Enhanced Interior Gateway Routing Protocol)
Distance Vector based
Cisco가 갖고 있던 프로토콜로 2013년에 공개됨
OSPF(Open Shortest Path First, IS-IS protocol과 동일(ISO Standard)): 단거리를 우선시하는 프로토콜, 표준이 공개되어 이를 따르면 다른 라우터들과 문제없이 통신 가능
BGP(Border Gate Protocol): 내부 AS에서 외부 AS로 가려면 어떻게 갈지 정함
BGP 메시지: TCP를 기반(신뢰성 필요)
semi-permanent: 완벽하진 않지만 두 AS 간에 TCP 연결이 거의 항상 되어 있음
특정한 destination network prefixes를 목적지로 가진 데이터그램을 전달하기 위한 path 정보
ex) AS 64520이 AS 64512와 BGP 메시지 주고받기
path vector 프로토콜: 전달되는 정보가 패스를 말해주는 벡터 형태 ex) 642, 646, 647
메시지에 담긴 정보
ex) AS2(2a, 2b, 2c, 2d), AS3(3a, 3b, 3c, 3d, x)
policy-based routing: intra와 달리 inter는 어떠한 path는 accept하고, 어떤 path는 decline하는 등 policy가 중요함
위의 상황에서 AS3, X
와 AS2, AS3, x
중에서 어떤 것을 택할지 선택하는 것은 policy에 기반한다.
Hot potato routing: 실제 패스 길이를 따지지 않고, 더 가까운 border router에게 무조건 전달
뜨거운 감자를 잡을 경우 그냥 무지성으로 던져버리는 것 처럼, 그냥 무조건 Next-Hop이 짧은 link를 선택한다. 즉, 위의 경우에서는 2d라우터에서 Next-Hop이 짧은 2a 라우터로 전송한다.
Intra-AS routing과 Inter-AS routing 비교
둘이 서로 달라야 하는 이유: scalability
intra는 policy 반영 X, inter는 policy 반영 O
intra는 빠르게 전달하는 것이 중요, inter는 policy가 중요
그림과 같은 네트워크가 있다고 가정 합니다.
네모로 되어 있는 A, B, C 네트워크는 ISP,
여기서 B와 C는 서로 경쟁 관계의 인터넷 서비스 Provider입니다.
ISP : Internet Service Provider 인터넷 제공 업자들의 네트워크
그리고 고객 네트워크들을 W, X, Y 라고 표현했습니다.
그러면 A와 B와 C는 각각 개별적인 AS이기 때문에
서로간에 BGP 메시지를 주고 받을 텐데
A는 B와 C한테 Aw라는 네트워크로 가려면
결국 A를 통하면 W로 갈 수 있다는 정보(path vector 정보)를 가르쳐 줍니다.
그러면 B는 BAw라는 경로 vector 정보(path vector 정보)를 알게 됩니다.
이것을 X측에 전달 해 X는 ‘W로 보내려면 B와 A를 통과해서 W로 갈 수 있구나’
라는 것을 알 수 있겠지만 B는 C한테는 알려 주지 않는다는 겁니다.
그에 대한 이유로는 이런 경우를 생각해 봅니다.
C의 입장에서 C와 A 사이에 링크를 전달해서 가면 되는데
C가 이 링크의 bandwidth를 아껴 보겠다고 B를 통과해서 보낼 수도 있다는 겁니다.
그렇게 했을 경우에 B는 괜히 링크의 bandwidth만 소모되게 되고,
내부 노드의 자원도 소모되기 때문에 포워딩 해 주기 싫을 것 입니다.
일부러 알려 주지 않음으로써 C가 W쪽으로 보내야 될 정보를
B를 통과해서 가지 않도록 만드는 Policy가 구현되게 됩니다.
BGP (Border Gateway Protocol)는 대표적인 Inter-AS (Autonomous System 간) 라우팅 프로토콜입니다. BGP는 다음과 같은 주요 작업을 수행합니다:
라우팅 정보 교환: BGP는 서로 다른 자율 시스템 (AS) 간에 라우팅 정보를 교환합니다. 자율 시스템은 ISP (Internet Service Provider), 기업 네트워크 등과 같은 독립적인 네트워크를 의미합니다. BGP는 이러한 자율 시스템 간에 경로 정보를 교환하여 인터넷 상에서 패킷의 전달 경로를 결정합니다.
AS 경로 선택: BGP는 다양한 경로 중에서 가장 적합한 경로를 선택합니다. 이를 위해 BGP는 경로 속성 (예: AS 경로 길이, AS 경로 품질) 및 정책을 고려하여 최적 경로를 결정합니다. BGP는 경로 선택 알고리즘을 사용하여 여러 경로 중에서 가장 우선순위가 높은 경로를 선택하고 전파합니다.
대규모 네트워크 연결 관리: BGP는 대규모 네트워크 연결을 관리합니다. 인터넷은 많은 ISP와 기업 네트워크로 구성되어 있으며, BGP는 이러한 다양한 네트워크 간의 연결을 제어하고 유지합니다. BGP를 사용하여 네트워크 간의 연결을 설정하고 해제하며, 라우팅 루프를 방지하고 네트워크의 안정성을 유지합니다.
외부 경로 공지: BGP는 AS 내부의 라우팅 정보를 외부에 공지합니다. 자신의 AS에서 수신한 경로 정보를 BGP를 통해 다른 AS에 전파함으로써 인터넷 상에서의 경로 결정에 참여합니다. 이를 통해 인터넷 네트워크 간의 연결성을 제공하고 패킷의 전달을 가능하게 합니다.
BGP는 인터넷의 핵심적인 구성 요소로서 대규모 네트워크의 라우팅 및 연결 관리에 필수적인 역할을 수행합니다.
전통적으로 네트워크 계층은 분산적으로 라우팅을 처리를 했었다.
라우터별로 기본적으로 라우터마다 라우팅 알고리즘이 동작하고 라우터들끼리 통신해서 전체적인 라우팅을 처리하도록 만들어졌었다.
전통적인 방식에서는 라우터가 하드웨어랑 위에서 특별한 하드웨어가 존재하고 라우터에서 돌아가는 특정 OS가 있었다. 시스코라는 스위치 만드는 회사에서는 시스코 전용 OS를 만들어 사용했고, 그 위해서 지원하는 몇가지 프로토콜들을 위에서 일종의 소프트웨어를 올려서 같이 판매를 했다. 라우터 하나에 하드웨어뿐 아니라 os 소프트웨어까지도 포함되어 판매가 되었었다. 이 상황에서 네트워크 계층에 새로운 기능을 추가하고 싶으면 중간에 미들박스라는 것을 새로 추가했다. 미들박스도 하드웨어로 만들어서 판매했다. 방화벽, 로드벨런서 같은 경우는 새로운 미들박스를 구해서 하나씩 추가함으로써 네트워크를 동작하는 방식을 취했었다.
어느 순간부터는 네트워크 컨트롤 플레인에 대해서 다시 생각해보는 기회가 생겼다.
-> 기능이 바뀌면 관련된 sw만 바꿔서 할 수 있으면 좋지 않을까라는 생각이 기반이 되었다. SDN 방식을 고려하게 되었다.
굳이 중앙집중형으로 컨트롤 플레인을 만들어야 하나. 어떤 정점이 있을까
-> 네트워크 관리가 쉬워진다.
-> 하나의 라우터가 잘못설정되어있을 때 전체 네트워크에 영향을 미치는 문제를 해결할 수 있다. 트레픽을 처리하는 과정에서 좀더 유연하게 처리할 수 있다. 내가 원하는 경로로 패킷을 이동할 수 있도록 하나하나 세팅할 수도있다.
SDN을 사용함으로써 이전에는 라우터가 잘못 구성되는 경우도 있었는데 이를 피할 수 있고, traffic flow에 대한 유연성을 더 좋게 만들 수 있었다. 그래서 table-based forwarding 프로그래밍을 하게 된 것이다. (centralized 프로그래밍). 지금까지는 분리된 프로그래밍이었다.
그래서 table-based forwarding에 API를 하나 둬가지고 이부분을 OpenFlow API를 제공해주어 프로그래밍을 줄 수 있었다. 이 OpenFlow는 control plane을 open(누구나 쓸 수 있게)으로 구현하였다.
traffic이 한번에 많이 들어 왔을 때 잘 관리해주기 위한 기술이다.
u에서 z로 보내려면은, 기존에는 라우팅 알고리즘을 돌려서 경로를 결정해야한다. 그런데 역으로 생각해서 경로를 먼저 정해주고 보내주는 것은 어떨까?
예를 들면 u-z로 보낼 때 uvwz를 통해서만 traffic을 지나갈 수 있게 경로를 만들어주려고 한다. 그리고 x-z로 보낼 때 xwyz를 통해서만 지나갈 수 있게 만드려고 한다. 이것은 기존 라우팅 프로토콜로 불가능하다.
=> 이런 경로를 SDN에서 프로그래밍 해주는 것이다.
u-z로 보내는데 traffic을 분할하고 싶다. 절반은 uvwz로, 절반은 uxyz로. 이것은 load balancing하는 것인데, 라우팅 알고리즘이 두개 필요로 하게 된다. 그래서 기존 라우팅 프로토콜은 불가능하다.
=> 이런 경로를 SDN에서 프로그래밍 해주는 것이다.
data plane은 SDN control 되어있는 SDN-controlled switch들이다. 이것들은 스위치 기능을 해주는 하드웨어이다.
이 내부에는 flow table이 있어 table 기반의 switch control이다. software에 의해 control 되는 API가 존재하는데 이 API는 OpenFlow를 통해서 단일화되어 있는데, 어떤 것이 control 가능한지, 어떤 것이 안되는지 이런 것들이 정의되어 있다. 그리고 이 controller하고 communication해야 하므로 이에 대한 protocol이 있는데, 이 protocol은 OpenFlow에 의해서 정의가 되어있다.
하드웨어 switch 위에는 SDN controller가 있다. 이 controller는 network OS로 생각하면 된다. Network에 대한 상태정보를 갖고 있다. 그래서 실제 application들과 SDN-controlled switches들의 중간역할을 하게 된다. 그래서 SDN controller는 각각 분산적으로 구현이 된다. performance, scalability, fault-tolerance 등을 해결하기 위한 역할을 한다.
맨 위에 network-control application들 있다. 이게 핵심적인 routing, load balance, access control과 같은 부분이 있다. 여기서 중요한 것은 unbundled이다. 밑에 있는 하드웨어와 독립되어 있다. routing vendor 또는 SDN controller와 분리시킬 수 있다. 이 부분만 다른 vendor를 통해 할 수 있다. 다만 API를 통해서만 하면 된다.
각각의 controller와 switch로부터 공통된 정보를 주고받는 역할을 한다. 여기서는 message를 주고 받기 위해서 TCP가 사용된다(암호화를 선택적으로 선택). 그리고 OpenFlow message를 만들기 위해 세가지 클래스를 만들어놨다. (controller-to-switch, asynchronous(switch to controller), symmetric(msic))
Controller에서 switch로, 위에서 아래로 내려가는 것이다. 이 때는 어떤 message가 내려갈까?
switch에서 controller로, 아래서 위로 올라가는 messages이다.
network opertor들은 OpenFlow messages를 통해 바로 프로그램하는 것은 아니다. 이것은 공통되도록 정해지는 것이고, 실제 모든 것은 controller에서 작동한다. 즉 네트워크의 효율적 운용을 위해서 기능을 잘 분리시켜 놓았다는 것이다.
2.ONOS controller
맨 아래 부분이 좀 더 추가되긴 했지만 비슷한 구조이다. 중간 부분은 host, devices… 등등으로 구성된다. distributed core 이 부분에 대해서 많이 계산했다. service reliability라던지, performance scaling 등등… 이런 부분을 고려해서 만들었다.
SDN은 2010년 이후에 나온 기술로, 나온지가 오래되지는 않았다. 몇 년 되지는 않았지만 급속도로 시스템에 파고들고 있다. 실제 모바일 쪽, 5G 기관망에서도 SDN의 철학이 다 들어가 있다.
그래서 좀 전에 보듯이 controller들을 dependable하게 만들 수 있을까. 즉 얼마나 더 신뢰할 수 있을까. reliable의 상위개념이라고 보면 된다. performance-scalable, secure distributed system. 이런 부분들을 control plane을 얼마나 더 잘 설계할 것인가 하는 이슈가 계속 남아있음. real-time이라던지 ultra-secure 이런 mission-specific한 요구조건들을 맞추도록 어떻게 잘 설계할 것인가는 아직도 연구가 이루어지고 있다.
인터넷 상에서 보내고 받고 하는 수많은 control에 대한 부분을 해결해주는 protocol이다. 그래서 host나 router에서 사용된다. 주로 error reporting에 많이 사용된다. ping을 사용하여 echo (한 번 보내면 다시 오는)를 잘 갖고 오는지 확인한다.
그래서 destination network가 unreachable하거나 destination host가 unreachable하다… 등등 이런 여러 에러 메시지들 또는 ping같은 것에 의해서 사용되는 것이 ICMP이다.
ICMP 자체는 네트워크 계층의 프로토콜인데, IP 위에 올라간다. ICMP message는 type, code를 정의해놓고 8byte 정도의 message로 IP datagram에 넣는다.
출발지에서 도착지까지의 경로의 상태를 살펴보는 traceroute가 ICMP 이다. traceroute하는 과정을 살펴보자.
UDP로 보내는데, 일단 맨 처음 TTL=1로 찍어서 보낸다. TTL은 라우터 한번만 건너겠다는 뜻이다. 그러면 그 한 번에 담긴 시간과 정보들이 있다. 그리고 TTL=2로 찍어서 보낸다. 라우터를 두번 건너띄게 되고, 건너갈 때마다 각각에 대한 측정된 delay, 시간을 종합하면 전체 경로, node에 대한 정보를 수집할 수 있다. 그 때 사용하는 것이 ICMP로 하는 것이다.
그래서 ICMP message 내에 라우터의 이름이나 주소가 들어가 있다. delay도 계산 가능하다. 결국 destination host에 도착하게 되면, port unreachable message를 type3, code3으로 바꿔서 주면 source는 멈추게 된다.
autonomous system (또는 domain) 안에는 대략 1000개 정도의 component들이 상호작용하고 있다. 나름 복잡한 시스템이다.
비행기라던지, 핵발전소라던지, 주로 이런데서 모니터링하고 컨트롤 한다. 이것처럼 네트워크 사업자는 지켜보고 관리해줄 필요가 있다. 그래서 이런 것에 대한 프로토콜이 있다. 네트워크 관리는 deployment, integration, coordination, monitor, test 등등 이런 모든 것에 대한 control을 한다. 결국 QoS의 요건이 resonable한 cost로 제공이 되는지, performance가 제공이 되는지 등등 이런 것들을 확인하기 위해서 control하고 관리하고 하는 것들을 네트워크 관리라고 부른다.
관리를 받는 device들 (router, switch, host 등) 을 각각의 managed device라고 하면 이 device들이 데이터를 전달해서 하나의 어떤 관리체계를 만든다. 그것을 Management Information Base (MIB)라고 부른다. 이 MIB 내에 모든 각각 device들의 object들의 현재 상태들이 다 저장이 된다.
각각의 host들이 하나의 agent이고, 그 안에 data가 있다. 그러면 위 그림의 위쪽 managing entity가 있고, MIB를 돌리는 무언가가 있어야 한다. (server일 수도 있다.) 이 컴퓨터에서 managing entity가 있어서 여기서 MIB를 전부 관리하게 된다. 그래서 각각의 agent하고 주고받으면서 각각의 data들을 가져오는 것이다.
managing entity와 managed device간에 뭔가를 주고 받는데에 대한 프로토콜이 필요해진다. 이 프로토콜의 대표적인 예로 SNMP가 있다.
SNMP는 Simple Network Management Protocol의 약자이다. MIB 정보를 보내는 방법에는 두가지가 있다.
request/response mode : managed device 각각에다가 request 보내서 response하는 일반적인 mode.
trap mode : 어떤 변화가 생겼을 때 데이터들을 같이 유지하는 방식이다. 자기가 갖고 있는 entity가 변화가 생겼을 때, 변화에 대한 것들을 managing entity 서버에 전달해준다. 특별한, 예외적인 상황을 보고해주는 방식이다.
SNMP protocol에는 이와 같이 message type이 정의되어 있다. 주고받는 것에 대한 정보라고 생각하면 된다. trap은 agent가 manager에게 전달하는 예외적인 상황에서 발생한다. request는 어떤 특정 MIB value에 대해서 요청할 수 있다. 그래서 manager가 agent에게 "get me data". 나한테 데이터를 다 보내게 하는 것이다. manager가 agent에게 MIB value를 set하라고 명령할 수도 있다.
출처 :
ttps://velog.io/@cyw320712/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-5-Network-layer-control-plane-1https://cyj893.github.io/network/Network9/
https://ddongwon.tistory.com/97
https://team00csdu준다.tistory.com/149
https://m.blog.naver.com/haryan96/221854872834
https://junghyun100.github.io/Inter-AS-Routing-BGP(2)/
https://inyongs.tistory.com/73