라우팅 - OSPF (Open Shortest Path First)
Dynamic 라우팅의 꽃이라고도 할 수 있는 OSPF 입니다.
앞선 라우팅의 거의 모든 내용들은 OSPF 를 위해서였다고 해도 과언이 아닐 정도로 어느 필드던 가장 많이 사용하고 접할 라우팅 프로토콜이 아닐까 합니다. 생소하고 비슷한 용어가 굉장히 많이 등장하지만.. 하나도 빼먹을게 없는 용어들이라 익숙해지시는 수밖에 없습니다.
최대한 상세히 풀어쓰고, 주석을 달아 놓겠지만 이해하기 어려운 부분이 많으실거라 생각되기도 합니다. 이해가 가지 않는 부분이 있거나 말이 어려운 부분이 있으면 댓글로 질문이나 수정요청하시면 답변드릴 수 있도록 하겠습니다.
1. OSPF
레거시 구성에서 OSPF 가 빠지는 경우는 거의 없죠. 모든 내용을 상세하게 다루고 싶으나 내용이 굉장히 방대해지므로.. 세부적인 내용은 제외하거나 별도로 작성하려 합니다. 기본적인 특징과 용어, 동작방식만 짚겠습니다.
- Dynamic Routing - 라우터끼리 라우팅 테이블을 주고받아 정보를 갱신.
- Interior Gateway Protocol - AS 내부에서 동작하는 라우팅 프로토콜.
- Link State - 토폴로지와 링크 비용을 기반으로 라우팅.
- VLSM, CIDR 지원
- Protocol Number - 89
- AD - 110
2. 동작방식
프로토콜별로 명칭은 조금씩 다르지만, 기본적인 동작 방식 자체는 사실 거의 비슷합니다. OSPF 의 경우에는 영역(Area) 이 다른 프로토콜과 핵심적인 차이점이라고 보시면 되겠습니다.
OSPF 에서 말하는 이 영역 의 개념은 AS의 개념과 유사합니다. 라우팅 프로토콜에서 IGP, EGP 를 분리한 이유는 영역을 구분함으로써 효율적인 라우팅이 가능하기 때문이었죠. OSPF 에서의 영역 역시 마찬가지로 네트워크의 규모가 거대해질수록 복잡해지는 구성과 라우팅을 논리적인 분리로 간소화하고 효율성을 높이기 위함입니다.
이를 위해서 OSPF에서는 반드시 Backbone Area 0가 존재하여야 하는 제약사항이 존재하며, 이러한 제약사항은 프로토콜이 토폴로지를 작성할때 내부적으로 계층적 구조를 갖게 함으로써 각종 연산 부하를 감소시키고 네트워크에 장애가 발생했을시에 영역을 격리시킬 수 있는 장점을 가집니다.
네트워크에서 이러한 계층적 구조는 과거부터 현재까지 이어지면서 많은 장점들을 이미 입증했고, 가장 기본적으로 많이 사용됩니다. OSPF 역시 장점을 계승하였다고 보시면 됩니다.
용어 | 설명 |
Backbone Area (Area 0) |
OSPF의 제약사항. 반드시 존재해야하는 Area. 모든 Area 는 Backbone Area 와 직간접적으로 연결되어 있어야 함. |
Backbone Router (BR) |
하나 이상의 인터페이스가 백본 Area 에 소속되어 있는 라우터. |
Non-Backbone Area | Backbone Area를 제외한 나머지 Area. |
Area Boundary Router (ABR) |
Area의 경계에 위치한 라우터. |
Internal Router (IR) |
모든 인터페이스가 하나의 Area에 속해있는 라우터. |
Autonomous System Border Router (ASBR) |
다른 Dynamic Routing 프로토콜(RIP, EIGRP 등)이 동작하는 경계에 위치한 라우터. |
시험보는것도 아니고 모든 용어들을 기억하실 필요는 없습니다.. 굳이 이렇게 풀네임으로 부르지는 않지만 Backbone Area 와 BR, IR, ASBR에 대한 개념정도는 이해하고 넘어가셔야 합니다.
OSPF Pakcet Header Format
구분 | 설명 |
Version | OSPF 버전. (현재는 version 2 사용) |
Type | OSPF 의 패킷 유형을 정의. |
Router ID | OSPF 패킷을 생성한 라우터의 ID. 한 AS 내에서 모든 라우터는 유일한 식별값을 필요로 함. |
Area ID | OSPF 패킷을 생성한 라우터가 속한 Area의 식별 ID. |
Checksum | 16비트 CRC. 체크섬 필드. |
Authentication | 보안 인증옵션 필드. |
참고만 하시되 Type, Router ID, Area ID 필드는 핵심적인 내용이니 기억하시기 바랍니다.
외에 OSPF가 가지는 특징적인 부분은 아래와 같습니다.
- 224.0.0.5 (ALL SPF Routers) : OSPF를 지원하는 모든 라우터에 전파할때 사용되는 멀티캐스트용 주소.
- 224.0.0.6 (ALL D Routers) : Designated, Backup Designated Router 에게 전달할때 사용하는 멀티캐스트용 주소.
- TTL = 1 설정값으로 이웃라우터에게 OSPF 패킷을 전달함.
- TOS = 110, OSPF 패킷은 Best-effort 패킷보다 우선시 처리함. 1
이웃을 맺는 과정은 다른 Link-State 프로토콜과 유사하고, OSPF의 핵심 키워드가 "영역" 인 만큼 같은 영역에 속한 인접 라우터 끼리만 이웃을 맺는다는 점을 우선 기억해주시면 되겠습니다.
Packet Type
패킷 종류 | 설명 |
Hello | 이웃 라우터의 발견, 인접관계 확립 및 유지를 위해 사용되며 정기적으로 전송하는 패킷. |
Database Description Packet (DDP / DD / DBD) |
라우터가 이웃을 맺은 다음 LSA를 교환할때 주고받는 패킷. 라우팅 정보 구축을 위해 사용되며 자신이 가지고 있는 Link State Database 내용을 보냄. |
Link State Request Packet (LSR) |
상대 라우터에게 링크 상태 정보를 요청할때 보내는 패킷. |
Link State Update Packet (LSU) |
각 라우터들이 토폴로지에 변화가 생기거나 정기적으로 인접 라우터에게 전송하는 패킷. |
Link State Acknowledgement (LSAck) |
응답용 패킷. 수신 확인과 LSA 플러딩의 신뢰성을 보장하기 위해 사용되는 패킷. |
Hello Packet Header Format
Hello Packet 의 헤더입니다. OSPF 패킷 타입중 가장 많이 확인하게 될 Hello 패킷에서 주목할 부분은 Interval, 지정 라우터(DR), 백업 지정 라우터(BDR), 이웃 라우터 목록들입니다. 이역시 당장은 이러한 정보가 포함되어 있다는 것만 기억하시면 충분합니다. 알아만 두셔도 나중에 트러블슈팅시에 덤프나 디버그로 확인해봐야 되는 경우 많은 도움이 되리라 생각됩니다.
Link State Advertisement (LSA) Type
번역하면 링크 상태 광고성 패킷 정도가 되겠네요. Link State 라우팅 알고리즘에서 사용되는 기초 정보가 담겨진 패킷 형태의 단위 정보를 LSA 라고 지칭합니다. 단순하게 생각해서 LSU, DDP 패킷에 실려서 전달되는 Link State 에 대한 정보들이라고 생각하시면 되겠습니다. 이 정보들은 네트워크의 정보를 일치시키기 위해서 라우터들끼리 정기적으로 플러딩하여 광고합니다.
LSA 역시 몇가지 타입이 존재하는데, 아래와 같습니다.
타입 | 설명 |
Router LSA (Type 1) |
하나의 라우터에 있는 모든 링크에 대한 광고. |
Network LSA (Type 2) |
다중 접속 링크에서 DR을 나타냄. |
Network Summary LSA (Type 3) |
네트워크 링크 요약 정보를 나타냄. (Internal) |
ASBR Summary LSA (Type 4) |
ASBR 링크상태 요약 정보. |
AS External LSA (Type 5) |
OSPF 도메인 밖의 루트를 나타냄. |
Multicast OSFP LSA (Type 6) |
멀티캐스트 OSPF LSA. |
NSSA External LSA (Type 7) |
BGP를 위한 외부 속성 LSA. Type5 를 대신하여 Stub area 에서 사용됨. |
OSPF Status
상태 | 설명 |
Down | 첫번째 OSPF 상태로, Hello 패킷을 받지 못한 상태. 또는 Dead Interval 시간동안 Hello 패킷을 수신하지 못한 경우. |
Attempt | NBMA 환경에서 수동으로 구성된 이웃 상태에서 Hello 패킷을 수신하지 못한 경우. |
Init | Hello 패킷을 수신하였으나 수신 라우터 ID가 Hello 패킷에 포함되지 않은 경우. 즉, 나의 Hello 패킷을 상대가 수신하지 못한 경우. |
2-Way | Neighbor 와 양방향 통신이 성사된 상태. 이 상태에서 DR/BDR을 선출하고 DROther 끼리들은 서로 정보교환을 하지 않으니 Adjacency 가 맺어지고 2-Way 상태에서 유지된다. |
Exstart | adjacent neighbor 가 맺어지는 첫 상태. 마스터와 슬레이브 선출이 이뤄지고, DDP 교환시 사용하는 DDP의 Sequence number를 고른다. |
Exchange | 각 라우터 자신의 링크 상태 데이터베이스에 저장된 LSA의 헤더만을 DDP 또는 DBD라고 부르는 패킷에 담아 상대에게 전송하는 단계. DDP 의 교환이 이뤄지는 상태. |
Loading | 상대방으로부터 DDP 수신을 마치고나서 자신에게 없는 정보가 있다면 LSR 패킷을 보내 없는 정보에 대한 상세한 내용을 다시 요청하는 상태. |
Full | adjacent router 간 모든 라우팅 정보 교환이 끝난 최종상태. 정상적인 neighbor 관계가 맺어진 상태. |
3. OSPF Neighbor Adjacency 과정 및 상태 요약
등장하는 용어가 많고 생소하여 복잡하게 느껴질 수 있는 부분이라고 봅니다. 그래서 동작순서와 상태변화를 설명드리기 전에 용어의 개념들만 간단히 짚고 시작하겠습니다. 해당 섹션이 본문에서 가장 중요한 내용이므로, 반드시 이해하고 넘어가시는것이 좋습니다.
Neighbor(이웃) 과 Adjacency(인접성) 두 키워드에 대한 차이점입니다. 언뜻 비슷하거나 같은 내용으로 인지하기 쉬우나 의미의 차이가 존재하기 때문에 헷갈리지 않으심이 좋습니다.
- 이웃 (Neighbor) : 몇몇 조건과 공통 구성정보를 공유하는 라우터의 관계. 라우팅 정보의 교환이 이뤄지지 않음.
- 인접성 (Adjacency) : 선택된 이웃들이 갖는 관계성. 라우팅 정보의 교환이 가능함.
이웃은 조금 더 포괄적인 의미입니다. 인접성은 이웃 중에서도 특별한 관계성을 일컫는것으로, 인사만 나누는 이웃과 반찬 나눠먹는, 교류가 있는 이웃의 차이라고 보시면 적당하지 않을까 싶네요.
다음으로 OSPF 에서 라우터가 관리하는 테이블(데이터)은 아래 3가지입니다.
- Neighbor Table : 이웃 라우터의 리스트
- Link-State Database Table : 네트워크 토폴로지 (LSA 패킷으로 구축)
- Routing Table : DDP를 참조하여 선출된 Best-Path 테이블
위에서 설명한 패킷 타입들은 라우터의 테이블에 직, 간접적인 관여를 통하여 최종적인 라우팅 경로를 지정하게 됩니다.
본격적인 상태변화와 동작순서를 알아보겠습니다. R1, R2 간 이웃을 맺는 과정과 상태를 요약한 그림입니다. 패킷 헤더의 필드들을 참조하시면서 살펴보시는게 이해에 도움이 될 것 같습니다.
- OSPF 구성 설정이 완료되면 R1, R2는 OSPF 가 구성된 라우터들에게 Hello 패킷을 전파합니다.
- 목적지 주소는 ALLSPFRouter (224.0.0.5) 주소로 설정합니다. 라우터는 주고받는 Hello 패킷에서 아래 필드들이 일치해야지 이웃을 맺을 수 있습니다.
- Subnetwork Mask
- Hello Interval
- Dead Interval
- Area ID
- Authentication
- Stub Area Flag
- MTU
- 이때, Hello 패킷을 수신한 라우터는 위 필드들을 비교하여 동일하다면, 이웃 목록에 자신의 Router ID를 기입하여 돌려보내는 과정을 거치고, 마찬가지로 이 패킷을 수신한 라우터도 neighbor table에 이웃목록을 갱신합니다.
- 다음, 필요하다면 DR, BDR의 선출이 이뤄지며 인접성을 위한 초기 시퀀스 번호를 선택합니다. 라우터 ID가 가장 높은 라우터가 Master 로 지정되며, Link State 교환을 시작합니다.
- 이후 DBD (=DDP) 를 교환합니다. 여기에 라우터는 Link-State Database Table(LSD) 의 내용을 담은 LSA 헤더를 주고받으며, 신뢰성있는 교환을 위해 LSAck 패킷으로 응답합니다.
- DBD 를 기반으로 전체 Link-State 정보를 LSR, LSA, LSU, LSAck 등을 송수신하며 갱신하는 과정입니다.
- Full State 는 이웃관계가 정상적으로 동작하고 있다는 것을 알리는 상태입니다.
DR, BDR 의 선출은 Priority, Router-ID 를 기반으로 선출하며, 하나의 네트워크 세그먼트(Subnet)마다 선출하게 됩니다. 따라서 Serial 구간에서는 큰 의미를 갖지 않지만, 아래와 같은 특정 구성에서는 상당한 의미를 가집니다.
위와 같은 구성은 모든 라우터가 이웃(neighbor) 상태입니다. 모든 라우터끼리 통신하므로 우측과 같은 논리적 상태라고 볼 수 있습니다. 이러한 상황에서 네트워크에 변화가 발생한다면, 모든 이웃은 변화를 서로에게 알리고 전파하기 위하여 필요보다 많은 횟수의 트래픽이 발생합니다.
왼쪽 그림처럼 모든 라우터가 인접성이 설정되면 총 12번의 패킷 교환이 이뤄져야 합니다. 하지만, DR을 선출하여 인접성을 설정하게 되면 모든 라우터가 DR에게서 LSU를 받아오는 형식으로 단 6번의 패킷 교환만으로 LSDB 의 업데이트가 가능합니다.
즉, DR/BDR의 선출은 이와같이 네트워크에서 불필요한 트래픽의 양을 줄이고, 가상의 Tree 구조를 형성하므로 STP와 비슷한 방식으로 동작한다고 볼 수 있겠습니다. 결론적으로 DR의 존재의의, 역할은 아래와 같습니다.
- 하나의 네트워크 세그먼트에 여러 라우터가 존재하는 경우에 발생하는 많은 양의 OSPF 메세지를 효율적으로 관리, 전파하기 위하여 관리자 역할을 부여.
- DR은 가장 완벽한 LSDB를 보유하고 관리하며, 네트워크 변경사항을 모든 라우터(DROTHER)에게 전파함.
- BDR은 DR이 Down 되었을 경우를 대비하여 지정되며, 직접적으로 동작하진 않지만 DR이 Down 되면 역할을 상속받아 동작함.
DR/BDR 의 선출기준은 아래와 같습니다.
- Priority 값이 높은 라우터 // Default 1, <0-255>
- Router-ID 가 가장 높은 라우터
실제 선출을 위해서는 Router-ID 를 사용하는것이 일반적입니다. Priorty를 설정하게 되면 관리해야할 요소가 하나 더 증가하는 것이나 마찬가지라서, 특수한 경우가 아니라면 굳이 사용하지는 않는 것 같습니다.
또한, DR/BDR 이 이미 선출된 네트워크 세그먼트에는 Router-ID가 높은 라우터가 추가되더라도 DR/BDR의 재선출이 이뤄지지는 않는다는점, 그리고 Priority 값을 0으로 설정하면 DR의 재선출을 강제로 발생시킬 수 있다는 점만 기억해주시면 되겠습니다.
4. 추가설명 및 주의사항
자주 접할 박스형 구성입니다. 위 내용들을 모두 이해하셨다면, 구성자체가 어렵지는 않을 것 같습니다. 다만 한가지 주목할점이 있는데, 바로 R1과 R4의 라우팅테이블입니다.
R1# show ip route
Codes: O - OSPF, IA - OSPF inter area
...
O IA 172.16.0.0 [110/3] via 10.10.20.2, 00:38:42, GigabitEthernet0/2
[110/3] via 10.10.10.2, 00:38:42, GigabitEthernet0/1
R4# show ip route
Codes: O - OSPF, IA - OSPF inter area
...
O IA 192.168.0.0/24 [110/3] via 10.10.40.1, 00:36:36, GigabitEthernet0/2
[110/3] via 10.10.30.1, 00:36:36, GigabitEthernet0/1
양 끝단의 네트워크로 나가는 경로가 두개입니다. 뭔가 좀 이상하죠? 아래쪽 경로는 FastEthernet 인데 Cost 가 동일합니다. 동적 라우팅 프로토콜은 알아서 효율적인 경로를 찾아야 하는데, 더 좋은 경로가 있음에도 불구하고 좋지 못한 경로를 선택하는것은 문제가 좀 있는 상황입니다.
이 문제는 OSPF의 Cost 계산식에 정답이 있습니다.
Cost = 기준대역폭 / 실제대역폭
OSPF 의 기준대역폭은 기본적으로 100Mbps 입니다. 인터페이스 타입별로 cost 를 계산하면 아래 표와 같아야 합니다.
인터페이스 타입 | 대역폭 | Cost |
10Gigabit Ethernet | 10 Gbps | 0.01 |
Gigabit Ethernet | 1 Gbps | 0.1 |
Fast Ethernet | 100 Mbps | 1 |
Ethernet | 10 Mbps | 10 |
DS1 | 1.544 Mbps | 64 |
DSL | 768 Kbps | 133 |
여기서, OSPF Cost는 소숫점을 계산하지 않습니다. 경로비용이 0에 가까워도, 내림하여 0이라는 비용으로 계산이 불가능합니다. 즉, OSPF는 소숫점을 버리고 모두 "올림" 처리하게 됩니다. 따라서, 아래와 같이 10Gbps, 1Gbps, 100Mbps 모두 cost 값이 1이되어버립니다.
인터페이스 타입 | 대역폭 | Cost |
10Gigabit Ethernet | 10 Gbps | 1 |
Gigabit Ethernet | 1 Gbps | 1 |
Fast Ethernet | 100 Mbps | 1 |
결과적으로 비효율적인 라우팅이 발생하겠죠. 개선을 위해서는 관리자가 ospf 에서 기준대역폭 값을 수정하거나 cost 값을 직접 수정해주는 수밖에 없겠습니다.
Router(config)# router ospf ?
<1-65535> Process ID
Router(config-router)# auto-cost reference-bandwidth ?
<1-4294967> The reference bandwidth in terms of Mbits per second
% OSPF: Reference bandwidth is changed.
Please ensure reference bandwidth is consistent across all routers.
기준대역폭 변경시에 모든 라우터가 일관된 값을 참조하는지 확인이 필요하고, 다중 경로를 선택하는 라우터의 테이블은 반드시 확인해야합니다.
Router(config)# interface <Interface>
Router(config-if)# ip ospf cost ?
<1-65535> Cost
기준대역폭 변경시에는 QoS 또는 다른 프로토콜에 영향을 미칠 수 있고, 관리하기 어려우므로 대부분 인터페이스 Cost 변경하는쪽이 유리합니다.
현대 네트워크에서, OSPF 를 돌리는 구간이 100Mbps 이하인 경우가 드뭅니다. 따라서 회선대역폭이 다른경우에 반드시 고려해야만 하는 사항입니다.
Virtual Link
OSPF의 제약사항은 계층적 구조를 위해 모든 Non-Backbone Area 가 Backbone Area 와 직접적인 연결이 되어있어야 한다는 내용입니다. 하지만 위에서 예시로 제시한 구성도는 Area2 가 Backbone Area 와 직접적인 연결을 갖고있지 않은 상태죠. 당연하게도 Backbone Area의 ABR 과 연결되지 않았으니, 라우팅정보를 갱신하지 못합니다.
이런 상황에서, ABR 간에 Virtual Link 라는 간접적인 Backbone Area와의 연결을 만들어주어서 이 제약사항을 해소할 수 있게 됩니다.
Router(config-router)# area <area> virtual-link <Router-ID>
처음 접했을때 헷갈릴 수 있을만한 내용이긴 하지만 이런 기술도 있다~ 정도로만 이해하셔도 됩니다. 실제 적용 사례는 굉장히 드물고 찾아보기 힘듭니다. 필요에 따라 구성할 일이 생길수도 있지 않을까 싶네요.
Command
Router# sh ip ospf ?
<1-65535> Process ID number
border-routers Border and Boundary Router Information
database Database summary
events OSPF event information
flood-list Link state flood list
interface Interface information
max-metric Max-metric origination information
mpls MPLS related information
multi-area Multi-area interfaces information
neighbor Neighbor list
nsf Non-stop forwarding state information
request-list Link state request list
retransmission-list Link state retransmission list
rib Routing Information Base (RIB)
sham-links Sham link information
statistics Various OSPF Statistics
summary-address Summary-address redistribution Information
timers OSPF timers information
topology-info Topology Info
traffic Traffic related statistics
virtual-links Virtual link information
| Output modifiers
Router(config)# router ospf [Process ID <1-65535>]
Router(config-router)# ?
Router configuration commands:
address-family Enter Address Family command mode
adjacency Control adjacency formation
area OSPF area parameters
auto-cost Calculate OSPF interface cost according to bandwidth
bfd BFD configuration commands
capability Enable specific OSPF feature
compatible OSPF compatibility list
default Set a command to its defaults
default-information Control distribution of default information
default-metric Set metric of redistributed routes
discard-route Enable or disable discard-route installation
distance Define an administrative distance
distribute-list Filter networks in routing updates
domain-id OSPF domain-id
domain-tag OSPF domain-tag
event-log OSPF Event Logging
exit Exit from routing protocol configuration mode
help Description of the interactive help system
ignore Do not complain about specific event
interface-id Source of the interface ID
ispf Enable incremental SPF computation
limit Limit a specific OSPF feature
local-rib-criteria Enable or disable usage of local RIB as route criteria
log-adjacency-changes Log changes in adjacency state
max-lsa maximum number of LSAs OSPF process will receive
max-metric Set maximum metric
maximum-paths Forward packets over multiple paths
mpls Configure MPLS routing protocol parameters
neighbor Specify a neighbor router
network Enable routing on an IP network
no Negate a command or set its defaults
nsf Non-stop forwarding
passive-interface Suppress routing updates on an interface
prefix-suppression OSPF prefix suppression
priority OSPF topology priority
queue-depth OSPF Hello/Router process queue depth
redistribute Redistribute information from another routing protocol
router-id router-id for this OSPF process
shutdown Shutdown the OSPF protocol under the current instance
snmp Modify snmp parameters
summary-address Configure IP address summaries
timers Adjust routing timers
traffic-share How to compute traffic share over alternate paths
ttl-security TTL security check
Reference
- Cisco OSPF 이해
https://www.cisco.com/c/ko_kr/support/docs/ip/open-shortest-path-first-ospf/7039-1.html#
- 쉽게 이해하는 OSPF
https://blog.naver.com/luexr/222460005000
- 정보통신기술용어해설 OSPF
- ACSA 교육 - OSPFv2
https://egstory.net/edge-study/tech-lesson/aos-cx-switching/950/
- IP 패킷 헤더 내 서비스 유형을 나타내는 필드. 우선순위 지정하는 필드임. [본문으로]