[구현] Linux_QoS

 

Traffic Control HowTo

IPv6 헤더의 Traffic Class에 3개의 서로다른 값(0x01, 0x02,0x03)을 넣어 QoS구현

IPv4 헤더의 TOS필드에 3개의 서로 다른 값을 넣어 QoS구현

 

1. TC에 관하여 ...

서버측에서 트래픽을 컨트롤 하기 위해서 TC라는 명령어를 이용한다. 아래는 tc명령어의 예제이다.

tc qdisc add dev eth1 handle 1:0 root dsmark indices 4 default_index 0
tc qdisc add dev eth1 handle 2:0 parent 1:0 prio
tc qdisc add dev eth1 handle 3:0 parent 2:1 bfifo limit 20480
tc qdisc add dev eth1 handle 4:0 parent 2:2 bfifo limit 40960

 

2. Traffic Control -Next Generation (tcng)

2.1 설치 방법

 

2.2 사용방법
  1. QoS정책 정의 : vi 에디터를 이용하여 c언어 스타일의 QoS 정책 정의 qos.tc로 저장
  2. tc 포맷으로 변환 : tcng -r qos.tc > qos.sh
    1. r 옵션은 이전의 설정 정보 삭제후 새 설정 적용
  3. QoS 정책 적용
    1. source qos.sh
    2. chmod +x qos.sh -> qos.sh
  4. 정책 보기 : tc -s class show dev eth0
  5. 정책 지우기 : tc qdisc del dev eth1 root

 

2.3 QoS 정책 정의법(예제) IPv6

#include "fields6.tc"       //IPv6의 필드정의 /usr/lib/tcng/include
dev "eth1" {                   //eth1 인터페이스로
   egress {                   // 나가는 패킷중에서

class (<$vital_sig>)
     if ip6_tc == 0x01;    //ip6_tc(IPv6 Traffic Controll 필드에 0x01로 설정되어 있으면 vital_sig
class (<$image>)
      if ip6_tc == 0x02;    //ip6_tc(IPv6 Traffic Controll 필드에 0x02로 설정되어 있으면 image
class (<$video>)
       if ip6_tc == 0x03;   //ip6_tc(IPv6 Traffic Controll 필드에 0x03로 설정되어 있으면 video

prio {

$vital_sig = class (1) {   fifo (limit 20kB);    }         // vitaㅣ_sig는 20kB 적용
$image = class (2) {  fifo (limit 40kB);     }        // image는 40kB 적용
$video = class (3) {  fifo (limit 60kB); }          // video는 60kB 적용
               }             }        }

 

설정의 관건은 tcng 언어를 습득하고 활용하는데 있을듯 하다. [메뉴얼: tcng.pdf]

 

 2.4 QoS 정책 정의법(예제) IPv4

 #include "fields.tc"
 
 dev "eth1"{
         egress{
// DS field 로 간주하기 때문에 오른쪽 2 bits 의 값은 무시가 된다. (masking으로 인해서 모두 0으로 인식)

                 class(<$high>) if ip_tos == 0x80;
                 class(<$mid>) if ip_tos == 0x40;
                 class(<$low>) if 1;
   

                htb () {  /* root qdisc */

                                class ( rate 10240kbps, ceil 10240kbps ) {  /* root class */
                                           $high  = class ( rate 5120kbps, ceil 5120kbps ) {sfq;} ;
                               $mid = class ( rate 1024kbps, ceil 2048kbps ) { sfq ; } ;
                               $low = class ( rate 512kbps, ceil 512kbps ) { sfq; } ;
                                   

                 }         } }

 

 

3. 사용 소프트웨어

IPv6 Traffic Control 부분에 특정 값을 마킹 & 트래픽 생성에 사용된 툴

iperf-2.0.2 (http://dast.nlanr.net/Projects/Iperf2.0/iperf-2.0.2.tar.gz)

 

3.1 수정 사항

 

[ PerfSocket.cpp ]

120 line : int rc = setsockopt( inSettings->mSock, IPPROTO_IP, IP_TOS,

121 line :                             (char*) &tos, len );

 

3.2 사용법

 

중희 수정

 

 

 4. Test Scenario

 

  1. Vessel (라우터) 에서 QoS 적용
    1. Traffic Class 0x01 : 0kb 의 rate 적용
    2. Traffic Class 0x02 : 40kb 의 rate 적용
    3. Traffic Class 0x03 : 60kb 의 rate 적용
  2. Vulture 에서 Valkyrie 로 트래픽 전송
    1. valkyrie$ ifperf -s -V
    2. vulture$ ifperf -c valkyrie -V -S 0x01
    3. vulture$ ifperf -c valkyrie -V -S 0x02
    4. vulture$ ifperf -c valkyrie -V -S 0x03

 

 

 

 

참고 사이트

참고 문서