WinTC Version : 0.2.9 WinTCとは --------- Windows 2000やWindows XPに追加された QoS Packet Schedulerを用いて QoS未対応のネットワークアプリケーションが使用するupstream帯域の上限を 設定したり(帯域制御)、アプリケーション毎のネットワークの優先順位を 設定(優先制御)できるプログラムです。 重要: あくまでもこのプログラムが動作しているPC上から送出されるパケット もしくはそのPCを経由するパケットのみが制御の対象となります。 問題 ---- ADSLやCATVインターネットではダウンロードスピード(downstream)は速い のに対しアップロードスピード(upstream)は非常に遅くなっています。 例 downstream upstream a slow ADSL 1.5Mbit/s 128kbit/s (~12KB/sec) a CATV 1.5Mbit/s 256kbit/s (~25KB/sec) an 8MB ADSL 8Mbit/s 1Mbit/s (~100KB/sec) アップロードを使用する例 1) メール送信 2) Webアップロード(たとえばデジカメ印刷サービスに写真をアップロードする時) 3) 自宅Web/FTPサーバによる情報発信 4) P2PやIMプログラムによるアップロード 自宅サーバやP2Pなどがupstream帯域をほとんど使い切ってしまうと より重要なメール送信やWebアップロードが使える帯域がきわめて小さくなって しまいます。 解決 ---- 上記アップロードカテゴリ毎に使用するupstream帯域を制限できます。 例えば、合計100KB/secのupstream帯域のうち30KB/secだけをサーバ目的に、 20KB/secだけをP2Pアップロード目的に使うように制限すると、常に残りの 50KB/secの帯域がより重要な他のアップロード目的に使えます。 また帯域を制限するだけでなく、アップロードカテゴリ毎にネットワーク パケットの優先順位を設定できます。 たとえば、先ほどの例とは逆に、メール送信とWebアップロードには50KB/sec分の 帯域を最も高い優先順位で送り出し、それ以外の帯域はサーバやP2P/IMが 好きなだけ自由に使えるといった設定をすることができます。このような設定では メール送信とWebアップロードが実行されていない間はサーバとP2P/IMがupstream 帯域をすべて使えるようになります。 System Requirements ------------------- - Microsoft Windows XP - Microsoft Windows 2000 (SP3 recommended) - Microsoft Windows 2003 Install ------- - wintc.zipをどこかのディレクトリに展開します。 Files included: rbp.exe - WinTCモジュールをホストするNTサービスプログラム rbp.conf - rbpの設定ファイル (修正不必要) wintc.exe - WinTCのコマンドラインツール wintc.conf, wintc_cl.conf - サンプル設定ファイル - QoS Packet Schedulerを帯域制御したいネットワークインターフェイスに インストールします。QoS Packet SchedulerはWinTCパッケージではなく OS付属です。 WinXP: 通常の物理的ネットワークインターフェイスにはすでにQoS Packet Schedulerがインストールされているはずです。 Win2000: 対象のネットワークインターフェースのプロパティを開き、インストール を選びます。「サービス」カテゴリからQoS Packet Schedulerを選びます。 - wintc.exeを実行して"wintc"という名前のNTサービスとしてインストールします。 rbp.exeがWinTCモジュールを実行するNTサービスプログラムです。 >wintc -kc 別のサービス名を使う必要がある場合、"wintc -kc "を実行します。 - 次セクションで説明されているように設定ファイル(wintc.conf)を修正して、 wintcサービスを開始します: >net start wintc - エラーやその他の情報メッセージはevent.logファイルに書き込まれます。 設定方法 -------- Flow : flowは1つのNICに関連付けされる仮想的なupstreamのパイプです。 flowは帯域制御に関する属性としてパケットの転送レートや優先順位を持ちます。 Filter : いくつかのTCP/IPの属性(source/destination portやsource/destination IPアドレスやプロトコル(TCP,UDP,ICMP))を用いてあなたによって定義される ネットワークサービス群です。たとえばTCP port 80番上のHTTPサービスを定義 できます。別の例として、LAN上の特定のコンピュータ群だけにサービスを行う SMBサービスという定義も可能です。 Assign : FilterをFlowにassignすることで特定のサービス群(上記Filterとして 定義した)が使用するネットワーク使用枠(Flow)を指定できます。 以下の3つのパラメータを設定ファイル(wintc.conf)に書き込んで設定していきます。 Flowの定義 define_flow = : flowにつける名前 : 帯域(1秒あたりの転送レート) bytes/secで指定 : flowのオプション属性のリスト (空白で区切る) prio= : 優先順位 (1=high,2=medium,3=standard) デフォルトは2 limit={yes|discard|no} : default is "yes". if yes or discard, bandwidth upper limit is enforced. if no, only packet prioritization is done and this flow is allowed to use more bandwidth than specified in as long as there are extra bandwidth left on the NIC. 例 define_flow = flow-test-1 30K prio=2 Filterの定義 define_filter = : filterにつける名前 : filterのオプション属性のリスト (空白で区切る) srcport=[/] : source port range dstport=[/] : dest port range は16bitマスク srcaddr=[/] : source addr range dstaddr=[/] : dest addr range は32bitマスク proto= tcp もしくは udp。 デフォルトはtcp。 もしくは10進数 (see IPPROTO_XXX in MSSDK/include/WinSock2.h) 例1 define_filter = filt-http srcport=80 define_filter = filt-https srcport=443 ポートやIPアドレスの範囲に任意の範囲指定をすることはできません。 代わりにbitmaskを使って範囲指定を行います。ポートは16bit、IPアドレスは 32ビットです。省略時はそれぞれ/16と/32です。 ポート範囲については、"wintc -u "でそのmaskで指定できる すべてのポート範囲を表示できます。 例2 - port range define_filter = filt-ftp-data-pasv srcport=0x2000/4 # source port range from 0x2000 to 0x2fff (from 8192 to 12287) 例3 - address range define_filter = filt-internal dstaddr=192.168.100.0/24 # destination address range from 192.168.100.0 to 19.168.100.255 FilterのFlowへの割り当て assign_filter = : assignするfilter(将来的には複数指定可能になる) : flowの名前 例 assign_filter = filt-http flow-test-1 assign_filter = filt-https flow-test-1 設定上の制限 Qos Packet Schedulerの仕様により以下のような制限があります - ひとつでもサーバ用帯域のfilterを定義すると、クライアント用帯域の定義が できなくなります。逆も同じです。 具体的には、次のような設定は不可能です。 define_filter = sv-http srcport=80 define_filter = cl-https dstport=443 なぜなら上記2つのフィルターが指定している範囲(range)はオーバーラップ しているからです。 sv-http : srcport=80 dstport=* srcaddr=* dstaddr=* cl-https : srcport=* dstport=443 srcaddr=* dstaddr=* srcport=80, dstport=443のパケットを送信する際にどちらのフィルターを 優先するかPacket Schedulerには判断する方法がないので、このような 定義を許していないようです。 したがって、サーバ用帯域・優先順位だけを設定するかクライアント用 帯域・優先順位だけを設定するかのどちらかになります。 詳しくはOverlapping Filtersセクションを参照。 複数NICがある場合のNICの指定方法 "wintc -i"を実行しPacket Schedulerが有効になっている全てのNICを表示します。 以下のどちらかを指定します a) Specify the interface number displayed in the following configuration parameter: default_netif = 1 b) Specify the interface name as displayed on "wintc -i" in the following configuration parameter (do not include double quotes): default_netif_name = Intel(R) PRO/100 VE Network Connection - Packet Scheduler Miniport サンプル設定ファイル -------------------- 2つあります。共にメール送信やWebアップロードなど重要なクライアント ネットワークアプリケーションに確実に帯域を割り当てるポリシーですが、 その実現方法が異なっています。 1)サーバ用帯域を制御する ファイル名: wintc.conf HTTP/FTPサーバによるファイル送信によるアップロードが使うことの できる帯域の上限を絞ることで、常に一定の空き帯域を重要AP用に確保して おきます。 srcport=80 (HTTP server) srcport=443 (HTTPS server) srcport=20 (FTP data - port mode) srcport=16384-16639 (FTP data - pasv mode - adjust to your FTP setup) 2)重要なクライアントAP用に優先帯域を定義しておく ファイル名: wintc_cl.conf これらAP用に優先順位の高い帯域を定義します。帯域上限はupstream回線と ほぼ同じ位に設定しておくことで優先APが必要なときに回線上限まで使い切れる ようになります。 dstport=80 (HTTP upload) dstport=443 (HTTPS upload) dstport=25 (SMTP send) なおFTP data接続用の帯域を定義することはできません。 3) LAN PC リモート制御用アプリケーション(RDPやVNC)に優先帯域を割り当てます。 srcport=3389 (RDP server - PC running Remote Desktop Server) srcport=5900 (VNC server - this will vary in your env) 4) Limit ALL application's upstream bandwidth use on a particular PC Let's say you have a child who are using up all upstream bandwidth with his P2P/IM upload! You want to limit ALL of his applications' upstream bandwidth to a fixed limit, say 20KB/sec, with "approved" applications excepted. In this case, first you put the cap on all applications/ports (catch-all filter), then add "exception" filters for applications/ports as necessary either as server-type or client type. This example uses overlapping filters but is possible because the ranges are proper subset of the catch-all filter. # cap for all ports / all IP addresses srcport=0/0 # "approved" applications dstport=80 (HTTP upload) dstport=443 (HTTPS upload) dstport=25 (SMTP upload) 起動 ---- WinTCをNTサービスとして開始するには >net start wintc wintc.confで設定した帯域制限はこのwintcサービスが実行している間だけ 有効です。終了するには"net stop wintc"を実行します。 現在OS上で定義されているパケットスケジューラーの情報をダンプするには >wintc -i -v What is "reservable bandwidth"? ------------------------------- Reservable bandwidth for a NIC is the bandwidth pool from which WinTC allocates bandwidth for each flow whose priority is either 1(high) or 2(medium). The value of reservable bandwidth for a NIC is determined by media speed (link speed) of NIC multiplied by Packet Scheduler's configuration variable (NonBestEffortLimit percentage). A flow of priority 3(standard) is allocated "best effort" bandwidth, so it's not confined within this reservable bandwidth limit. WinTC displays the following information before applying bandwidth rules to a NIC: Total reservable bandwidth: X bytes Remaining reservable bandwidth: Y bytes "wintc -i -v" shows the same information that is in effect currently. The following is a table of typical network media speed and their default reservable bandwidths. media speed 100% 80%(WinXP default) 20%(Win2K default) Ether 10Mbps 1250000bytes 1000000bytes 250000bytes Ether 100Mbps 12500000bytes 10000000bytes 2500000bytes wireless(B) 1375000bytes 1100000bytes 275000bytes Note: Windows XP documentation states that the default value (when unspecified) is 20(%). However the real default value is 80(%). You can change the value of NonBestEffortLimit with either of the following procedures: Windows XP Professional - "gpedit.msc"を打って、グループポリシーエディタを開きます。 - 「コンピュータの構成」-> 「管理用テンプレート」-> 「ネットワーク」-> 「QoS パケット スケジューラ」から「予約可能な帯域幅を制限する」を 開きます。 - 10進数で0から100までの値を指定します。 Windows 2000 Professional and Windows XP Home - Add the following registry entry: HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Psched Value Name: NonBestEffortLimit Data Type: DWORD Value Value Data: 0-100 (in decimal) - to specify the value for each NIC, add it to the following instead: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Psched\Parameters\Adapters\{Adpater-ID} Overlapping Filters ------------------- [Note: PSDK documentation on Traffic Control API is not clear about overlapping filter ranges. Information in this section is derived solely from my experiments on Windows XP SP1.] If WinTC says "[filter-name]: Possibly overlapping filters. Check port/address range" you must make sure that IP address range and/or port range that you define are not overlapping. Address ranges and port ranges that two filters define must be either 1) disjoint (no overlapping range), or 2) one filter's range is a proper subset of the other's range. Any other overlapping ranges are not allowed. This is to ensure that packet scheduler, upon packet inspection, can pick up a single filter without any ambiguity or ordering of filters. This limitation is actually very severe and might render this packet scheduler useless in some applications. Disjoint ranges - OK |---- filter-1 ----| |---- filter-2 ----| Proper subset - OK (subset filter applies) |---- filter-1 ----| |--filter-2--| Overlapping ranges - NG (can't determine which filter to apply) |---- filter-1 ----| |---- filter-2 ----| ex - [NG] overlapping ranges (1) filt-1 : srcport=80 dstport=* srcaddr=* dstaddr=* filt-2 : srcport=* dstport=433 srcaddr=* dstaddr=* ex - OK disjoint ranges filt-1 : srcport=8888 dstport=* srcaddr=* dstaddr=192.168.0.1/24 filt-2 : srcport=8888 dstport=* srcaddr=* dstaddr=130.32.0.1/8 ex - OK proper subset (1) filt-1 : srcport=0x2000/4 dstport=* srcaddr=* dstaddr=* filt-2 : srcport=8888 dstport=* srcaddr=* dstaddr=* ex - OK proper subset (2) filt-1 : srcport=80 dstport=* srcaddr=* dstaddr=* filt-2 : srcport=80 dstport=* srcaddr=* dstaddr=192.168.0.1/24 TODO ---- see wintc_en.txt EOF