오픈 플로우(OpenFlow) 프로토콜
오픈플로우 프로토콜은 TCP상에서 포트번호 6653을 가지고 동작한다. 컨트롤러는 연결 설정을 하려는 스위치에 대하여 TCP 포트 6653을 리스닝하고 있어야 한다. 스위치에 오픈플로우 펌웨어를 삽입한다.
컨트롤러와 스위치간에 전달되는 메시지를 알아보자
컨트롤러 -> 스위치(라우터)
- 설정 : 컨트롤러가 스위치의 설정 파라미터들을 문의하거나 설정할 수 있도록 한다.
- 상태 수정 : 컨트롤러가 스위치 플로우 테이블의 엔트리를 추가/제거 또는 수정하거나 스위치 포트의 특성을 설정하기 위해 사용된다.
- 상태 읽기 : 컨트롤러가 스위치 플로우 테이블과 포트로부터 통계 정보와 카운터 값을 얻기 위해 사용한다.
- 패킷 전송 : 컨트롤러가 제어하는 스위치의 지정된 포트에서 특정 패킷을 내보내기 위해 사용된다. 메시지 자체는 페이로드 부분에 보낼 패킷을 포함한다.
카운터(counters)는 플로우 테이블에 제어 정보가 등록된 순간부터 현재까지의 시간을 측정하는 용도로 사용된다. 플로우 테이블에 등록된 제어 정보는 영구적으로 저장하거나 정해진 시간 동안만 유지할 수 있는데, 카운터는 두 번째 경우로 생명 주기(life cycle) 관리에 사용된다.
스위치 -> 컨트롤러
- 플로우 제거 : 컨트롤러에게 어떤 플로우 테이블 엔트리가 시간이 만료되었거나 상태 수정 메시지를 수신한 결과로 삭제되었음을 알린다.
- 포트 상태 : 스위치가 컨트롤러에게 포트의 상태 변화(근처 장치와의 연결 끊김등)를 알리기 위해 사용된다.
- 패킷 전달 : 플로우 테이블과 일치하지 않는 패킷은 처리를 위해 컨트롤러에게 전달된다. 하지만 모두 일치하는 패킷도 특정 작업을 위해서 컨트롤러에 전달되기도 한다.
OpenFlow 프로토콜의 동작방식
- OpenFlow 프로토콜을 사용하는 스위치 내부에는 패킷 전달 경로와 방식에 대한 정보를 가지고 있는 플로우 테이블이 존재한다. 패킷이 들어오면 장치는 플로우 테이블이 해당 패킷에 대한 정보를 가지고 있는지 확인한다. 패킷에 대한 정보가 존재하면 그에 맞춰 패킷을 처리하고, 정보가 존재하지 않으면 해당 패킷에 대한 제어 정보를 OpenFlow 컨트롤러에 요청한다.
- 스위치로부터 제어 정보를 요청받은 OpenFlow 컨트롤러는 내부에 존재하는 패킷 제어 정보를 확인하고, 해당 결과를 OpenFlow 스위치에 전달한다. OpenFlow 컨트롤러 내의 패킷 제어 정보는 제어 애플리케이션에서 API를 통해 입력할 수 있다.
- OpenFlow 스위치는 컨트롤러로부터 전달 받은 제어 정보를 플로우 테이블에 저장하고(물론 컨트롤러도 복사본을 가진다), 이후 동일한 패킷이 발생하면 플로우 테이블에 있는 정보를 활용하여 패킷을 전달한다.
상호 작용 예제
가정
- S1과 S2는 단절됨
- 최단경로 알고리즘이 사용되고 있고 S1, S3, S4로 들어오고 나가는 플로우 테이블은 수정이 되었지만 S2의 동작은 바뀌지 않았음
- 통신 계층 프로토콜은 오픈플로우가 사용됨
- 제어 평면은 링크 상태 라우팅 외 다른 기능은 수행하지 않음
- 다익스트라 링크 상태 라우팅이 애플리케이션 계층으로 동작한다.
- 패킷 스위치들이 링크 업데이트 정보를 서로 간이 아닌 SDN 컨트롤러에게 전송한다.
- 스위치 S2와의 링크 단절을 감지한 S1은 오픈플로우의 포트 상태 메시지를 사용해서 링크 상태 변화를 SDN 컨트롤러에게 알린다.
- 통신 계층을 통해 메시지를 받은 SDN 컨트롤러는 메시지를 링크 상태 관리자에게 알리고 관리자는 링크 상태 데이터베이스를 갱신한다.
- 다익스트라를 담당하는 애플리케이션 계층은 링크 상태의 변화를 전달받는다. (변화가 생기면 알려달라고 요청함)
- 애플리케이션 계층이 상태 관리자와 접촉하여 갱신된 링크 상태를 가져온다. 갱신 작업은 상태 관리 계층에 있는 다른 구성요소의 도움이 필요할 수도 있다.
(어떤 구성요소가 어떤 도움을?)그 후 새로운 최소 비용 경로를 계산한다. - 애플리케이션 계층 관리자가 갱신되어야 할 플로우 테이블을 결정하는 플로우 테이블 관리자와 접촉해서 갱신한다.
- 플로우 테이블 관리자는 오픈플로우 프로토콜을 사용하여 링크 상태 변화에 영향을 받는 스위치들의 플로우 테이블을 갱신한다. S1(S2를 목적지로 하는 패킷을 S4를 통해 보낸다), S2(S1으로부터의 패킷을 S4를 통해 받는다), S4(S1에서 S2로 가는 패킷을 포워딩해야 한다.)
OpenFlow 적용 예
클라우드 환경에서는 간단한 사용자 조작으로 네트워크 부하를 분산하고 트래픽을 모니터링하며 서로 다른 데이터 센터나 서로 다른 지역 또는 서로 다른 국가에서 운영 중인 서버에 대해 네트워크를 관리할 수 있도록 하는 기술이 필요하다. 이를 효율적으로 하기 위한 프로토콜이 바로 OpenFlow이다. 클라우드 서비스는 공통된 물리 네트워크 인프라 위에 수 많은 VM(가상 서버)으로 이루어지는데 이들을 만들기 위한 환경에서는 몇 가지 사항이 만족돼야 한다. 바로 첫 번째로 보안, 두 번째로 자동화, 마지막으로 확장성이다.
공통의 물리 네트워크 인프라를 여러 명의 사용자가 공유해서 사용해야 하기 때문에, 가상 네트워크 인프라에서는 서로 다른 사용자의 VM 간에 보안이 보장되어야 한다.
일반적인 물리 서버에서는 네트워크 설정 정보를 추가하거나 변경하려면 네트워크 관리자에게 요청해야 하며, 완료되기까지 시간이 소요된다. 하지만 클라우드 환경에서는 사용자가 간단히 조작하여 네트워크를 설정하고 설정이 즉시 반영될 수 있어야 한다. 이를 위해서는 요청이 즉시 반영될 수 있도록 자동화해야 한다.
클라우드 서비스의 장점 중 하나는 필요한 만큼의 VM을 빠른 시간 내에 투입할 수 있다는 것이다. 이렇게 투입된 VM의 지역이나 국가가 다르거나, 전체 VM 수가 수백 대 또는 수천 대여도 쉽게 네트워크 환경을 구축할 수 있어야 한다.
위 조건을 모두 만족하는 네트워크 아키텍쳐 중 하나로 바로 SDN이 있다.
2명의 사용자가 각자 생성한 VM 그룹이 있다고 가정해 보자.
보안을 위해서는 각 사용자가 생성한 VM끼리만 통신할 수 있어야 하는데, OpenFlow의 플로우 테이블을 다음과 같이 구성하면 이를 해결할 수 있다.
SrcIp | DestIp | Protocol | SrcPort | DestPort | Priority | … | Action |
10.0.0.2 | 10.0.0.3 | * | * | * | 0 | * | NORMAL |
10.0.0.3 | 10.0.0.2 | * | * | * | 0 | * | NORMAL |
10.0.0.4 | 10.0.0.5 | * | * | * | 0 | * | NORMAL |
10.0.0.5 | 10.0.0.4 | * | * | * | 0 | * | NORMAL |
* | * | * | * | * | 65535 | * | DROP |
10.0.0.2, 10.0.0.3 간의 패킷과 10.0.0.4, 10.0.0.5 간의 패킷만 서로 전달하고 다른 모든 패킷은 drop하도록 설정되어 있다.
네트워크 설정을 자동화하려면 VM이 생성될 때마다 자동으로 위와 같이 설정되어야 한다. 외부 프로그램에서 API로 OpenFlow 컨트롤러에 정보를 입력할 수 있으므로, 해당 VM이 생성될 때 관리 프로그램에서 API를 호출해 관련 정보를 설정하도록 하면 이를 해결할 수 있다.
그리고 확장성을 보장하려면 네트워크 환경을 쉽게 구축할 수 있어야 한다. OpenFlow 스위치를 추가할 때에는 기존의 OpenFlow 컨트롤러와 연결하기만 하면 되고, OpenFlow 컨트롤러를 추가할 때에는 API로 패킷 제어 정보를 일괄 등록하고 OpenFlow 스위치와 연결하기만 하면 된다. 따라서 쉽고 빠르게 네트워크 환경을 구축할 수 있다.
'CS > Network' 카테고리의 다른 글
[Network] 이더넷(Ethernet) (0) | 2021.11.05 |
---|---|
[Network] 링크 계층 주소체계와 ARP (0) | 2021.11.04 |
[Network] 네트워크 계층 : SDN(Software-Defined Networking) (0) | 2021.10.08 |
[Network] 네트워크 계층 : 라우터(Router) (0) | 2021.10.01 |
[Network] 네트워크 계층 : 개요와 서비스 모델 (0) | 2021.10.01 |