FLOWSPEC
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 | ||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| TokenRate | DWORD | 4 | +0 | +0 | フローの存続期間中にデータを送信できる、許可された転送レートを指定します。TokenRate メンバーは、フレームリレーなどの WAN テクノロジーで見られる他のトークンバケットモデルと似ており、トークンはクレジット (与信) に相当します。こうしたトークンは、すぐに使用されない場合は蓄積され、一定の周期的な上限 (Windows 2000 のサービス品質の場合は PeakBandwidth) までのデータ送信を可能にします。ただし、クレジットの蓄積は指定された量 (TokenBucketSize) までに制限されます。合計クレジット (トークン) を制限することで、たとえばしばらく非アクティブであったフローが、大量に蓄積したトークンによって利用可能な帯域幅を占有してしまうといった状況を回避できます。フローは時間の経過とともに (TokenRate の値で) 送信クレジットを蓄積できますが、その上限は TokenBucketSize までであり、またバースト送信は PeakBandwidth に制限されるため、トラフィック制御とネットワークデバイスのリソースの健全性が維持されます。フローが一度に大量のデータを送信できないため トラフィック制御 が維持され、またそうしたデバイスが高いトラフィックバーストにさらされずに済むため、ネットワークデバイスのリソースの健全性が維持されます。 このモデルでは、アプリケーションは十分なクレジットが利用可能な場合にのみデータを送信できます。十分なクレジットが利用できない場合、アプリケーションは待機するか、トラフィックを破棄しなければなりません ( QOS_SD_MODE の値に基づきます)。したがって、アプリケーションは送信要件に対する妥当な見積もりに基づいて TokenRate を要求することが重要です。たとえばビデオアプリケーションでは、TokenRate は通常、ピークからピークまでの平均ビットレートに設定されます。 受信側でのみ TokenRate を QOS_NOT_SPECIFIED に設定した場合、TokenRate には最大転送単位 (MTU) が使用され、送信レートの制限 (トークンバケットモデル) は有効になりません。このように、TokenRate はバイト/秒で表されます。 TokenRate メンバーに 0 を設定することはできません。また、送信側の FLOWSPEC において既定値 (つまり QOS_NOT_SPECIFIED) として設定することもできません。 | ||||||||||||||||||||||||||
| TokenBucketSize | DWORD | 4 | +4 | +4 | フローの特定の方向が時間に関係なく蓄積できるクレジットの最大量をバイト単位で指定します。ビデオアプリケーションでは、TokenBucketSize は通常、最も大きい平均フレームサイズになります。一定レートのアプリケーションでは、TokenBucketSize は小さな変動を許容できる値に設定してください。 | ||||||||||||||||||||||||||
| PeakBandwidth | DWORD | 4 | +8 | +8 | 指定したフローに対する、時間ベースの送信許可の上限をバイト/秒で指定します。PeakBandwidth メンバーは、1 秒あたりのデータ送信の上限を強制することで、多量の送信クレジット (トークン) を蓄積したフローが、一時的または周期的なデータバーストによってネットワークリソースに過大な負荷をかけることを防ぎます。一部の中間システムはこの情報を活用でき、より効率的なリソース割り当てが可能になります。 | ||||||||||||||||||||||||||
| Latency | DWORD | 4 | +12 | +12 | 送信側がビットを送信してから、対象となる 1 つ以上の受信側がそれを受け取るまでに許容される最大の遅延をマイクロ秒単位で指定します。この値の正確な解釈は、QOS 要求で指定された保証のレベルによって異なります。 | ||||||||||||||||||||||||||
| DelayVariation | DWORD | 4 | +16 | +16 | パケットが受ける可能性のある遅延の最大値と最小値の差をマイクロ秒単位で指定します。アプリケーションは DelayVariation を使用して、フローの受信側で必要となるバッファー領域の量を決定します。このバッファー領域の情報は、元のデータ送信パターンを復元するために使用できます。 | ||||||||||||||||||||||||||
| ServiceType | DWORD | 4 | +20 | +20 | フローに対してネゴシエートするサービスのレベルを指定します。ServiceType メンバーには、次に定義されたサービスの種類のいずれかを指定できます。
次の一覧は、ServiceType の設定の相対的な優先度を示しています。 SERVICETYPE_CONTROLLED_LOAD 非準拠のトラフィック 簡単な例を挙げると、あるネットワークデバイスがリソースの制約を受けており、上記の ServiceType 設定のいずれかからパケットを 1 つ選んで送信しなければならない場合、まず SERVICETYPE_NETWORKCONTROL のパケットを送信し、その ServiceType で送信を要するパケットがなければ ServiceType が SERVICETYPE_GUARANTEED のパケットを送信する、というように動作します。 | ||||||||||||||||||||||||||
| MaxSduSize | DWORD | 4 | +24 | +24 | トラフィックフローで許可される、または使用されるパケットの最大サイズをバイト単位で指定します。 | ||||||||||||||||||||||||||
| MinimumPolicedSize | DWORD | 4 | +28 | +28 | 要求されたサービス品質が提供されるパケットの最小サイズをバイト単位で指定します。このサイズより小さいパケットは、トラフィック制御によって MinimumPolicedSize として扱われます。FLOWSPEC 構造体を RSVP と組み合わせて使用する場合、MinimumPolicedSize の値を 0 にすることはできません。ただし、FLOWSPEC 構造体を特に TC API と共に使用する場合は、MinimumPolicedSize に 0 を設定できます。 |
公式ドキュメント
FLOWSPEC 構造体は、 RSVP SP にサービス品質 (QOS) のパラメーターを提供します。これにより、QOS 対応のアプリケーションは、指定したフローに対して QOS 設定の適用、変更、または削除を行えます。 FLOWSPEC の一部のメンバーには既定値を設定できます。詳細については「解説」を参照してください。
解説(Remarks)
FLOWSPEC 構造体の多くのメンバーは、QOS_NOT_SPECIFIED を設定することで既定値にできます。既定値を設定できるメンバーは、その FLOWSPEC が受信側の FLOWSPEC か、送信側の FLOWSPEC かによって異なる点に注意してください。
トラフィック制御で FLOWSPEC を使用する際には、次のようないくつかの考慮事項があります。
- SERVICETYPE_NETWORKCONTROL、SERVICETYPE_QUALITATIVE、SERVICETYPE_BESTEFFORT では、TokenRate に QOS_NOT_SPECIFIED を指定できます。その他のすべての ServiceType の値では、TokenRate は有効な値でなければなりません。
- PeakBandwidth を指定する場合は、TokenRate 以上でなければなりません。
- Controlled Load Service の受信側では、既定値は送信側の TSPEC から導出されます。
- Guaranteed Service の受信側では、ServiceType と TokenRate を指定しなければなりません。
ServiceType の値が SERVICETYPE_GUARANTEED に設定されている場合は、次の内容も適用されます。
- RSPEC の RATE の値は、TokenRate の値に設定されます。
- RSPEC の DELAYSLACKTERM の値は DelayVariation に設定されます。DelayVariation が QOS_NOT_SPECIFIED に設定されている場合は 0 になります。
- SERVICETYPE_GUARANTEED を要求する受信側では、受信側の TokenRate を指定しなければなりません。これは、TokenRate に QOS_NOT_SPECIFIED を設定できる SERVICETYPE_CONTROLLEDLOAD の受信側とは対照的です。
トラフィック制御: 次の ServiceType は、特にトラフィック制御を直接扱う場合には無効です。自分がトラフィック制御を直接扱っているかどうか (つまり、次の ServiceType が自分の状況に該当するかどうかを気にする必要があるかどうか) がわからない場合は、おそらく扱っていません。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// FLOWSPEC (x64 32 / x86 32 バイト)
typedef struct FLOWSPEC {
DWORD TokenRate;
DWORD TokenBucketSize;
DWORD PeakBandwidth;
DWORD Latency;
DWORD DelayVariation;
DWORD ServiceType;
DWORD MaxSduSize;
DWORD MinimumPolicedSize;
} FLOWSPEC;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct FLOWSPEC
{
public uint TokenRate;
public uint TokenBucketSize;
public uint PeakBandwidth;
public uint Latency;
public uint DelayVariation;
public uint ServiceType;
public uint MaxSduSize;
public uint MinimumPolicedSize;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure FLOWSPEC
Public TokenRate As UInteger
Public TokenBucketSize As UInteger
Public PeakBandwidth As UInteger
Public Latency As UInteger
Public DelayVariation As UInteger
Public ServiceType As UInteger
Public MaxSduSize As UInteger
Public MinimumPolicedSize As UInteger
End Structureimport ctypes
from ctypes import wintypes
class FLOWSPEC(ctypes.Structure):
_fields_ = [
("TokenRate", wintypes.DWORD),
("TokenBucketSize", wintypes.DWORD),
("PeakBandwidth", wintypes.DWORD),
("Latency", wintypes.DWORD),
("DelayVariation", wintypes.DWORD),
("ServiceType", wintypes.DWORD),
("MaxSduSize", wintypes.DWORD),
("MinimumPolicedSize", wintypes.DWORD),
]#[repr(C)]
pub struct FLOWSPEC {
pub TokenRate: u32,
pub TokenBucketSize: u32,
pub PeakBandwidth: u32,
pub Latency: u32,
pub DelayVariation: u32,
pub ServiceType: u32,
pub MaxSduSize: u32,
pub MinimumPolicedSize: u32,
}import "golang.org/x/sys/windows"
type FLOWSPEC struct {
TokenRate uint32
TokenBucketSize uint32
PeakBandwidth uint32
Latency uint32
DelayVariation uint32
ServiceType uint32
MaxSduSize uint32
MinimumPolicedSize uint32
}type
FLOWSPEC = record
TokenRate: DWORD;
TokenBucketSize: DWORD;
PeakBandwidth: DWORD;
Latency: DWORD;
DelayVariation: DWORD;
ServiceType: DWORD;
MaxSduSize: DWORD;
MinimumPolicedSize: DWORD;
end;const FLOWSPEC = extern struct {
TokenRate: u32,
TokenBucketSize: u32,
PeakBandwidth: u32,
Latency: u32,
DelayVariation: u32,
ServiceType: u32,
MaxSduSize: u32,
MinimumPolicedSize: u32,
};type
FLOWSPEC {.bycopy.} = object
TokenRate: uint32
TokenBucketSize: uint32
PeakBandwidth: uint32
Latency: uint32
DelayVariation: uint32
ServiceType: uint32
MaxSduSize: uint32
MinimumPolicedSize: uint32struct FLOWSPEC
{
uint TokenRate;
uint TokenBucketSize;
uint PeakBandwidth;
uint Latency;
uint DelayVariation;
uint ServiceType;
uint MaxSduSize;
uint MinimumPolicedSize;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; FLOWSPEC サイズ: 32 バイト(x64)
dim st, 8 ; 4byte整数×8(構造体サイズ 32 / 4 切り上げ)
; TokenRate : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; TokenBucketSize : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; PeakBandwidth : DWORD (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; Latency : DWORD (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; DelayVariation : DWORD (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; ServiceType : DWORD (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; MaxSduSize : DWORD (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; MinimumPolicedSize : DWORD (+28, 4byte) st.7 = 値 / 値 = st.7 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global FLOWSPEC
#field int TokenRate
#field int TokenBucketSize
#field int PeakBandwidth
#field int Latency
#field int DelayVariation
#field int ServiceType
#field int MaxSduSize
#field int MinimumPolicedSize
#endstruct
stdim st, FLOWSPEC ; NSTRUCT 変数を確保
st->TokenRate = 100
mes "TokenRate=" + st->TokenRate