DUMMYNET(4)

명칭
dummynet - 유연한 대역 매니저 및 지연 에뮬레이터

서식
#include <sys/types.h> #include <sys/queue.h> #include <netinet/in.h> #include <netinet/ip_fw.h> int setsockopt(raw_socket, IPPROTO_IP, ipfw option, struct ipfw, size)

해설
dummynet 는, 대역폭과 큐의 사이즈에 제한을 더하거나 패킷의 지연이나 손실을 시뮬레이트 하는 것으로써, 여러가지 네트워크 인터페이스를 개입시켜 거래되는 트래픽을 제어 가능하게 합니다.

현재의 실장에서는, 패킷의 선별은 ipfw 프로그램의 ``파이프'' 룰에 의해 행해집니다. dummynet 의 파이프 냄새나서는, 대역폭, 지연, 큐 사이즈, 손실율을 설정할 수 있습니다. 이러한 설정은 ipfw 프로그램으로 실시합니다. 파이프에는 1 에서 65534 까지의 번호가 붙여집니다. 또, 패킷은 ipfw 의 설정에 따라서는 복수의 파이프를 개입시켜 송출하는 것이 가능합니다.

dummynet 는 IP 레벨로 동작합니다만, 브릿지 확장 기능을 유효하게 하는 것에 보다 , 브릿지 되는 패킷을 파이프를 개입시켜 송출할 수 있습니다.

사용법
아래와 같은 명령에 의해, 파이프에 패킷을 송출합니다.

        ipfw add pipe NNN ....

또, 파이프의 설정은 아래와 같은 명령에 의해 실시합니다.

        ipfw pipe NNN config bw B delay D queue Q plr P

다만, 대역폭 B 는, bit/s, Kbit/s, Mbit/s, Bytes/s, KBytes/s, MBytes/s 그리고 나타낼 수가 있습니다. delay 는 밀리 세컨드 단위로, 또, 큐 사이즈는 패킷수나 바이트수 에 의해 지정합니다. 또, plr 는 패킷이 랜덤에 없어지는 비율입니다.

ipfw 를 올바르게 동작시키는 것은 간단하지는 않습니다. 시스템이 라우터나 브릿지로서 기능하고 있는 경우는 더욱더 그러합니다.

라우터로서 기능하는 경우는, 루팅 되는 패킷의 입력 경로, 및, 출력 경로에 같은 룰 세트가 적용되기 때문에, 패킷이 같은 파이프를 두 번 통하지 않게 주의해 주세요 (정말로 그러한 있고 경우는 별도입니다).

브릿지로서 기능할 때는, 브릿지 되는 패킷에 대해서, ipfw 필터는, 입력 경로에서 한 번만 기동됩니다.

같이 진정한 전이중 채널을 시뮬레이트 하는 경우에는, 방향이 다르다 2 개의 파이프를 이용하도록 해 주세요. 예를 들면, 비대상인 쌍방향의 링크를 시뮬레이트 하는 경우의 룰 세트는 다음과 같이 되겠지요.

       ipfw add pipe 1 ip from A to B out
       ipfw add pipe 2 ip from B to A in
       ipfw pipe 1 config bw 1Mbit/s delay 80ms
       ipfw pipe 2 config bw 128Kbit/s delay 300ms

조작
ipfw 의 코드는, 대역폭, 큐 사이즈, 지연, 손실을 적용해야 한다 패킷을 선별해, 그러한 제한을 기술하는 ``파이프''의 식별자를 돌려줍니다.

선별된 패킷은, 우선 할당할 수 있었던 사이즈의 큐에 저축할 수 있습니다. 큐에 저축할 수 있었던 패킷은, 프로그램 된 속도로 꺼내져 지연을 시뮬레이트하기 위한 2 번째의 큐에 옮겨집니다. 2 번째의 큐로부터 꺼내질 때에, 패킷이 보내져 온 것과 같다 프로토콜 스택에 넣어집니다(예를 들면 ip_input(), ip_output(), bdg_forward() 등). 이것은 sysctl 의 sys.net.inet.ipfw.one_pass 의 설정치에 의존합니다. 파이프로부터 출력된 패킷은, 패킷의 행선지에 전송 되는지, 매치 한 룰의 뒤에 기술되었다 ipfw 의 룰에 다시 건네받습니다.

dummynet (은)는 타이머의 1 tick 마다 처리를 실시합니다. 즉, 처리의 주기는 커널 옵션의

        options HZ

에 의해 제어됩니다. 기본값 (100)는 10ms 주기를 의미합니다. 높은 데이터 속도로 정확한 시뮬레이션을 실시하기 위해서(때문에)는, 타이머 주기를 1ms 이하로 설정할 필요가 있을지도 모릅니다. 그러나, 프로그램에 의한 I/O (programmed I/O) (을)를 이용하고 있는 인터페이스안에는, 패킷을 출력하는데 상당한 시간을 필요로 하는 것이 있는 것에 주의해 주세요. 즉, 타이머 주기를 작게 너무 작게 하면(자) , 타이머의 주기에 처리가 따라붙지 않고, 처리의 정밀도를 해쳐 버릴 우려가 있습니다.

커널 옵션
커널 설정 파일내의 이하의 옵션이 dummynet 의 동작에 관계합니다.

      IPFIREWALL               - ipfirewall 를 유효화 (dummynet 사용에는 필수).
      IPFIREWALL_VERBOSE       - 파이어 월(fire wall)의 상세 출력을 유효화.
      IPFIREWALL_VERBOSE_LIMIT - 파이어 월(fire wall)의 상세 출력을 제한.
      DUMMYNET                 - dummynet 의 처리를 유효화.
      NMBCLUSTER               - 네트워크 패킷 버퍼의 크기를 설정.
      HZ                       - 타이머의 주기를 설정.

통상, 아래와 같은 옵션은 필수입니다.

      options IPFIREWALL
      options DUMMYNET

더해, 설정한 모든 파이프의, 대역폭과 지연 시간의 적이라고 큐 사이즈 의 합계에 따라서는, mbuf 클러스터 (네트워크 패킷을 저축해 두기 위해서(때문에) 사용됩니다) 의 수를 늘리는 편이 좋을지도 모릅니다.

SYSCTL 변수

        net.inet.ip.fw.one_pass

패킷이 파이어 월(fire wall)의 코드를 한 번 마셔 통과하도록(듯이) 하고 싶은 경우, 1 으로 설정합니다.

       net.link.ether.bridge_ipfw

브릿지 되는 패킷을 파이어 월(fire wall)의 코드에 건네주고 싶은 경우에 세트 합니다.

명령
파이프를 취급하기 위해서(때문에)는, 이하의 소켓 옵션을 이용합니다.

IP_DUMMYNET_CONFIGURE 는, 파이프의 설정을 갱신합니다. (또는 새롭다 파이프를 작성합니다. )

IP_DUMMYNET_DEL 는, 매치 하는 룰 번호가 존재하는 모든 파이프를 삭제합니다.

IP_DUMMYNET_GET 는, 지정한 번호에 매치 하는 파이프를 돌려줍니다.

IP_FW_FLUSH 지정한 번호에 매치 하는 파이프를 플래시 합니다.

커널 보안 레벨이 2 보다 큰 경우는, IP_DUMMYNET_GET 만이 사용 가능합니다.

관련 항목
setsockopt(2), ip(4), ipfw(8), sysctl(8).

버그
이 메뉴얼 페이지는 dummynet 사용 방법의 전부를 기술하고 있다 (뜻)이유가 아닙니다.

역사
dummynet dummynet (은)는, ACM Computer Communication Review, Jan. 97 issue 에 기술되고 있도록(듯이), TCP 의 congestion의 제어를 위해서(때문에) Luigi Rizzo <luigi@iet.unipi.it> 가 실장했습니다. 그 후, IP 및 브릿지 레벨로 기능하도록(듯이) 변경되어 한층 더 IPFW 패킷 필터에 통합되었습니다.