리눅스기반의 QoS 지원기술 QoS Implementation over Linux 박진 (J. Park) 강신각 (S.G. Kang) 통신프로토콜표준연구팀계약직연구원 통신프로토콜표준연구팀책임연구원, 팀장 인터넷 QoS 이슈는차세대인터넷핵심기술중의하나로서그동안많은연구가이루어져왔다. 실제로 QoS 를구현하고실험하기위해, 많은개발자들이가장일반적인형태의개발환경으로서리눅스 (Linux) 를사용해왔다. 특히, 리눅스커널버전 2.2 이상부터 TC 기능이지원되면서개발이더욱용이해졌다. 본고에서는 QoS 개발자들을위해리눅스커널 2.4 기반 TC 메커니즘과 2.4 커널메인스트림에새로이통합된 DiffServ 메커니즘에대해살펴본다. I. 서론 인터넷 QoS 이슈는차세대인터넷핵심기술중의하나로서그동안많은연구가이루어져왔다. 리눅스는 QoS를구현하고실험하는많은개발자들로부터가장일반적인형태의개발환경으로서사용되어왔다. 특히, 커널버전 2.2 이상부터 TC(Traffic Control) 기능이지원되면서개발이더욱용이해졌다. 본고에서는먼저 QoS 메커니즘개발에빌딩블록을제공하는리눅스 ( 커널버전 2.4) 커널의 TC 메커니즘과이를통해구현되어커널 2.4에새로이메인스트림으로추가된 DiffServ 메커니즘에대해알아본다. II. 리눅스트래픽컨트롤 본절에서리눅스기반의 QoS 제공기술로서리눅스커널버전 2.2(2.1.90) 이상에서지원되는 TC[1]-[3] 메커니즘에대해살펴본다. 라우터로설정된리눅스머신에패킷이입력인터페이스에도착 하면네트워크드라이버에의해수신된후리눅스내부버퍼 (skbuff) 로복사된다. 패킷에대한디멀티플렉싱 (demultiplexing) 을통해 TCP 등의상위계층프로토콜스택으로전달할것인지, 아니면포워딩을통해다음노드로전달할것인지를결정한후포워딩할패킷에대해서는출력인터페이스를통해다음노드로전달한다. TC가적용되는시점은패킷을출력큐에담는시점에적용되나, 커널 2.4부터는패킷이입력큐에저장되는시점에도 TC가적용될수있게개선되었다 (( 그림 1) 참조 ). 디바이스에대해어떤큐잉규칙을적용할때해당큐의포인터는디바이스구조체 (include/netdevice.h) 에저장된다. 전송할데이터가발생하면 IP 층은패킷에필요한헤더정보를추가한후 (net/ipv4/ip_output.c) dev_queue_xmit (net/core/dev.c) 함수호출을통해패킷전송을시도한다. dev_queue_xmit에서패킷이 dev hard_ start_xmit(skb, dev) 를통해실제전송되기전에디바이스가관리하는큐에패킷을넣은 (enqueue) 후해당디바이스를깨운다 (qdisc_wakeup(dev)). TC 에사용된큐잉규칙은 q=dev qdisc 를통해패킷이 1
전자통신동향분석제 18 권제 1 호 2003 년 2 월 Upper Layers(TCP, UDP,..) Input Interfaces Ingress Policing Input De- Multiplexing Forwarding Output Queuing Output Interfaces Traffic Control ( 그림 1) Traffic Control 적용시점 Class Queuing discipline Queuing discipline Class Queuing discipline ( 그림 2) 리눅스 TC 요소들 High TBF, Rate=1Mbps Default Low FIFO Queuing discipline with two delay priorities ( 그림 3) 리눅스 TC 설정예제 디바이스드라이버의큐에보내지기바로전에적용된다. 리눅스커널 2.4의 TC의요소들로서크게큐잉규칙 (queuing discipline), 클래스 (class), 필터 (filter), 폴리서 (policer) 등이있다 (( 그림 2) 참조 ). 각네트워크디바이스에설정된큐잉규칙은해당디바이스의입력큐에도착한패킷을어떻게처리할것인지를결정한다. 예를들어 sch_fifo 는 FIFO를구현한것이다. 보다정교하게큐잉규칙을적용하기위해서필터를사용할수있다. 필터를통해서패킷을서로다른클래스로구분하고특정클래스에대해우선순위를부여하여차별화할수있다. 각클래스에대해서다시나름대로의큐잉규칙이적용 될수있다. 큐잉규칙으로는 11가지가있으며그종류는 Class Based Queue(CBQ), Token Bucket Flow(TBF), Clark-Shenker-Zhang(CSZ), First In First Out(FIFO), Priority, Traffic Equalizer(TEQL), Stochastic Fair Queuing(SFQ), Asynchronous Transfer Mode(ATM), Random Early Detection(RED), Generalized RED(GRED), DiffServ Marker(DS_ MARK) 등이있다. ( 그림 3) 은 TC 설정의예를보인것이다. 한네트워크디바이스에두개의지연 (delay) 우선순위를가지는큐잉규칙을설정한다. 필터에의해선택된패킷은 높은 우선순위클래스로, 나머지는 낮은 우선순위클래스로매핑한다. 높은 우선순위클래 2
리눅스기반의 QoS 지원기술 스는 sch_prio 로구현하여버퍼에패킷이존재할때무조건 낮은 우선순위패킷보다먼저전송할수있으나, 낮은 우선순위패킷의기근현상 (starvation) 을막기위해토큰버켓 (TBF) 필터를사용한다. 낮은 우선순위패킷은 FIFO 큐잉규칙을가지고 높은 우선순위의패킷이없거나버스터시간이아닌동안전송된다. 이와같은설정이 CBQ를사용해서역시구현될수있다. 리눅스커널의 TC 모듈과통신하여 TC를사용자레벨에서제어하기위한응용프로그램으로서 IPROUTE2 를사용할수있다. IPROUTE2 패키지는리눅스커널 2.2 이상에서지원되는향상된 IP 처리기능을제어하기위한사용자프로그램으로서기존의디바이스설정 (device configuration), 프로토콜주소 (protocol address), 라우팅테이블 (routing table) 제어프로그램인 ip, rtmom 과 Netlink 소켓을이용한 TC 프로그램인 tc 를하나로통합한사용자프로그램이다. 인터넷트래픽에대해 QoS를적용하기위해서제공되는사용자레벨프로그램인 tc 는다양한큐를적용하고해당큐와관련되는클래스를연결시킨다. 또 라우팅테이블, u32 classifier, tcindex classifier, 그리고 rsvp classifier 등을기반으로필터를설정하는데도사용된다. tc 를통해서큐잉규칙, 필터, 클래스를다양하게조합하여패킷스케줄링모듈을만들어리눅스를지나는패킷을처리할수있다. IPROUTE2 는 2.4버전부터따로인스톨이필요없이리눅스커널의메인스트림에내장되어서비스된다. 리눅스커널의 TC 모듈과사용자응용프로세서간통신은 rtnetlink 소켓을통해서이루어지는데 rtnetlink 는 Netlink 소켓을기반으로한것으로서응용프로세스와리눅스커널간에 TC 오브젝트를전달하는데사용된다. 사용자는 sockaddr_nl 주소구조체를이용하여커널과통신한다. 사용자공간에서사용자응용이 Netlink 소켓을통해자신의요구메시지를커널에전달할때, 커널공간의 net/netlink/ af_netlink.c 내 netlink_sendmesg 함수가호출된다. 사용자공간의요구메시지는커널공간에서 net/core/rtnetlink.c 내 rtnetlink_rcv_msg 함수를통해커널로수신된다. 이함수에서메시지의헤더가검사되고메시지의타입에따라커널내각처리루틴으로분기한다. ( 그림 4) 는 tc를사용하기위한명령어문법을보인것이다. tc[options] OBJECT{COMMAND help} where OBJECT := {qdisc class filter} OPTIONS := {-s[statistics] -d[details] -r[raw]} ( 그림 4) tc command 사용문법 III. 트래픽컨트롤을이용한 QoS 지원 리눅스가제공하는 TC 메커니즘은실제 IntServ 와 DiffServ를구현하기위한기본적인프레임워크를제공한다. ( 그림 4) 와같이 queuing discipline, classes, 그리고 filters(policers) 는리눅스에서 QoS 메커니즘을지원하기위한빌딩블록을제공한다. IV. 리눅스기반의 Diffserv 리눅스커널 2.4에서는커널 2.2에서패치를통해서지원되었던 DiffServ extension[4],[5] 이리눅스커널메인스트림으로통합되었다. DiffServ 지원을위해추가된요소들은 cls_tcindex, sch_ dsmark, sch_gred, skb tc_index 등이다. 리눅스커널내 DiffServ의패킷처리과정은다음과같다. 일단네트워크인터페이스드라이버에의해수신된패킷은리눅스커널내버퍼에복사된다. skb iph tos 는 skbuff 내 IP 패킷의 TOS(Type Of Service) 필드를가리킨다. sch_dsmark 는해당노드가 DiffServ로동작하기위해서인터페이스당설정하는루트큐잉규칙 (root queuing discipline) 으로서패킷의 TOS 필드에서 DS 필드만을마스킹을통해가져온후 skb tc index 에복사한다. cls_tcindex 는패킷분류자로서 DS를이용해서키를만든후그키를이용해서해시테이블을검색하여해당패킷이매핑될클래스 ID를가져온다. 3
전자통신동향분석제 18 권제 1 호 2003 년 2 월 Intserv Node Classifier Policing Packet Scheduler Meter Diffserv Traffic Conditioner Classifier Marker Shaper Dropper Linux Kernel Traffic Control Police Classifier Queuing Discipline Class ( 그림 5) 리눅스 TC 기반의 IntServ/DiffServ 빌딩블록 skb iph tos Initial value of tc_index Initial DS field marking skb iph tos DS field is used for classification May change DS field cls_ rsvp cls_ tc index sch_dsmark tc_index may change sch_dsmark tc_index may change skb tc_index (a) DiffServ 에지라우터 ( 그림 6) 리눅스 DiffServ 블록도 skb tc_index (b) DiffServ 코어라우터 ( 그림 6) (a) 의 cls_rsvp 는 DiffServ 망의에지라우터 (Edge Router: ER) 가플로를구분하여초기 DS 필드를표시한필터로사용된다. 한클래스는자신의내부큐잉규칙을가진다. 커널 2.4에서 Diff- Serv의 PHB는지연우선순위만을기반으로구현되었다. Expedited Forwarding 은기존의 CBQ나 sch_prio를사용해서구현이되었으나 Assured Forwarding 은세개의드롭우선순위들을정하고있으므로이를구현하기위해서 RED를확장시킨 GRED, sch_gred 를내부큐잉규칙으로사용하였다. ( 그림 7) 은리눅스박스를 DiffServ로설정하고, DiffServ의에지라우터를설정하는예이다. 설정순서는다음과같다. (1) dsmarker 를 eth0에루트노드로설정한다. (2) 클래스 ID 1:1 패킷의 ECN 비트를무시하고 DSCP를 0x2e(EF) 로설정하기위한마스킹과 ORing을수행한다. (3), (4) 각각 AF31과 AF21의 DSCP를설정한다. (5), (6) 각각우선순위 4, 5의 u32 분류자를추가한다. (7), (8) 10.0.0./24 를전송률이 1M(2kburst) 이내일때클래스 ID 1:1 에매핑하고 1M 이상일때 1:2로매핑한다 (AF21). (9) 는 10.1.0.0/16 에서 192.1.0.0/16 으로향하는 TCP 패킷을클래스 ID 1:3(AF22) 으로매핑한다. ( 그림 8) 은 DiffServ의코어라우터 (Core Rou- 4
리눅스기반의 QoS 지원기술 u32 Meter Exceeded limit No match Class 1:1 Class 1:2 Class 1:3 FIFO DSCP 0x2e DSCP 0x18 DSCP 0x1a sch_dsmark(1:0) 1. tc qdisc add dev eth0 handle 1:0 root dsmark indices B4 2. tc class change dev eth0 classid 1:1 dsmark mask 0x3 value 0xb8 3. tc class change dev eth0 classid 1:2 dsmark mask 0x3 value 0x68 4. tc class change dev eht0 classid 1:3 dsmark mask 0x3 value 0x4B 5. tc filter add dev eth0 parent 1:0 protocol ip prio 4 handle 1:u32 divisor 1 6. tc filter add dev eth0 parent 1:0 protocol ip prio 5 handle 2:u32 divisor 1 7. tc filter add dev eth0 parent 1:0 prio 4 u32 match ip dst 10.0.0.0/24 police rate 1Mbit burst 2K continue flowid 1:1 8. tc filter add dev eth0 parent 1:0 prio 5 u32 match ip dst 10.0.0/24 flowid 1:2 9. tc filter add dev eth0 parent 1:0 prio 4 u32 match ip dst 10.1.0.0/16 match ip src 192.1.0.0/16 match ip protocol 6 0xff match ip dport 0x17 0xffff flowid 1:3 ( 그림 7) DiffServ 에지라우터설정예 DSCP=0x2E tcindex tcindex Class 2:1 pfifo No match CBQ(2:0) Class 2:2 RED sch_dsmark(1:0) 1. tc qdisc add dev eth0 handle 1:0 root dsmark indices 64 set_tc_index 2. tc filter add dev eth0 parent 1:0 protocol ip prio 1 tcindex mask 0xfc shift 2 3. tc qdisc add dev eth0 parent 1:0 handle 2:0 cbq bandwidth 10Mbit allot 1514 cell 8 avpkt 1000 mpu 64 4. tc class add dev eth0 parent 2:0 classid 2:1 cbq bandwidth 10Mbit rate 1500Kbit avpkt 1000 prio 1 bounded isolated allot 1514 weight 1 maxburst 10 defmap 1 5. tc qdisc add dev eth0 parent 2:1 pfifo limit 5 6. tc filter add dev eth0 parent 2:0 protocol ip prio 1 handle 0x2e tcindex classid 2:1 pass_on 7. tc class add dev eth0 parent 2:0 classid 2:2 cbq bandwidth 10Mbit rate 5Mbit avpkt 1000 prio 7 allot 1514 weight 1 maxburst 21 borrow 8. tc qdisc add dev eth0 parent 2:2 red limit 60KB min 15KB max 45KB burst 20 avpkt 1000 bandwidth 10Mbit probability 0.4 9. tc filter add dev eth0 parent 2:0 protocol ip prio 2 handle 0 tcindex mask 0 classid 2:2 pass_on ( 그림 8) DiffServ 코어라우터설정예 5
전자통신동향분석제 18 권제 1 호 2003 년 2 월 ter: CR) 를설정하는예이다. (1) dsmarker 를 eth0 에루트노드로설정한다. (2) ECN 비트를제거하고 DSCP 필드를꺼내기위해필터를추가하는과정이다. (3) 은 2:0에 CBQ 큐잉규칙을설정한것이다. (4) 는 CBQ 타입의자식클래스 2:1을설정하고 1.5Mbps rate 전송을설정한것이다. (5) CBQ 타입의 2:1에최대 5개패킷의큐를가진 pfifo 큐잉규칙을설정한것이다. (6) skb tc_index 가 0x2e(EF) 인모든패킷을 2:1 클래스로매핑한다. (7) 2:2 클래스가 BE(Best Effort) 트래픽을다루도록설정한것이고전송률을 5Mbps 로설정한다. 2:2 클래스에 borrow를설정하여여분의대역폭을빌려쓸수있으나 2:1 클래스가 isolated 로설정되어있으므로최대 3.3Mbps 를추가로빌려쓸수있다. (8) BE 트래픽을다루기위해 RED를버퍼관리스킴을사용할것을설정한것이다. (9) 0x2e 이외의모든패킷을 2:1로매핑할것을설정한것이다. V. 결론 본고에서리눅스환경에서 QoS 메커니즘구현을위한모듈로서 TC에대해서커널공간과사용자공간에대해설명하였다. 아울러, 리눅스커널 2.4에서통합된 DiffServ 모듈에대해커널공간에새로이추가된요소들, 동작메커니즘, 그리고사용자공 간에서 DiffServ 라우터설정예를살펴보았다. 현재까지는 DiffServ 만이리눅스커널에통합되어있으나 IntServ 나 MPLS의구현을위해서는 ISI의 RSVPd나캠브리지대학의 MPLS 리눅스코드등을사용하여구현할수있다. 참고문헌 [1] Werner Almesberger, Linux Network Traffic Control - Implementation Overview 2001, EPFL ICA. [2] Saravanan Radhakrishnan, Linux-Advanced Networking Overview ITTC, University of Kansas. [3] Netherlabs, Gregory Maxwell, Remco van Mook Martijn van Oosterhout, Paul B Schroeder, Jasper Spaans, Linux2.4 Advanced Routing Howto TLDP. [4] ICA Different Services on Linux, http://diffserv. sourceforge.net/ [5] Werner Almesberger, Jamal Hadi Salim, Alexey Kuznetsov, Differentiated Services on Linux EPFL ICA, Notel Networks, INR Moscow. [6] P. Trimintzios, I. Andrikopoulos, G. Pavlou, C.F. Cavalcanti, D. Goderis, Y. T Joens, P. Georgatsos, L. Georgiadis, D. Griffin, C. Jacquenet, R. Egan & G. Memenios, An Architectural Framework for Providing QoS in IP Differentiated Services Networks IST TEQUILA; 7th IFIP/IEEE International Symposium on Integrated Network Management, IM 2001. 6