SDN(Software Defined Networking)은 네트워크의 제어 평면(Control Plane)과 데이터 평면(Data Plane)을 분리해 소프트웨어로 네트워크를 중앙 집중식으로 제어하는 아키텍처다.
전통적 네트워크 vs SDN
| 구분 | 전통 네트워크 | SDN |
|---|
| 제어 방식 | 분산 (각 스위치) | 중앙 집중 (컨트롤러) |
| 프로그래밍 | 벤더 CLI | 오픈 API |
| 유연성 | 낮음 | 높음 |
| 장애 도메인 | 분산 | 컨트롤러 의존 |
아키텍처 계층
┌─────────────────────────────┐
│ 애플리케이션 계층 │ ← 비즈니스 앱, 오케스트레이션
├─────────────────────────────┤
│ 제어 계층 (컨트롤러) │ ← OpenDaylight, ONOS, Ryu
│ Northbound API (REST) │
├─────────────────────────────┤
│ 데이터 계층 (스위치/라우터) │ ← OpenFlow, P4
│ Southbound API │
└─────────────────────────────┘
OpenFlow 프로토콜
OpenFlow는 SDN의 핵심 Southbound 프로토콜로, 컨트롤러가 스위치 플로우 테이블을 직접 조작한다.
python
# Ryu SDN 컨트롤러 예시 (Python)
from ryu.base import app_manager
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER, set_ev_cls
from ryu.ofproto import ofproto_v1_3
class SimpleSwitch(app_manager.RyuApp):
OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]
@set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
def packet_in_handler(self, ev):
msg = ev.msg
dp = msg.datapath
ofp = dp.ofproto
parser = dp.ofproto_parser
# 플로우 규칙 설치: 모든 패킷을 플러드
actions = [parser.OFPActionOutput(ofp.OFPP_FLOOD)]
out = parser.OFPPacketOut(
datapath=dp, buffer_id=msg.buffer_id,
in_port=msg.match['in_port'], actions=actions
)
dp.send_msg(out)
SDN 주요 활용
- •데이터센터: 가상 네트워크 오버레이(VXLAN), 마이크로세그멘테이션
- •WAN 최적화: SD-WAN으로 MPLS 대체
- •보안: 동적 트래픽 격리, DDoS 대응
- •5G: 네트워크 슬라이싱 구현 기반
관련 문서
- •[[nfv|NFV (네트워크 기능 가상화)]]
- •[[vlan|VLAN]]
- •[network-slicing|[네트워크 슬라이싱 (5G)]]
- •[mpls|[MPLS]]