Win32 API 日本語リファレンス
ホームNetworkManagement.IpHelper › TCP_ESTATS_PATH_ROD_v0

TCP_ESTATS_PATH_ROD_v0

構造体
サイズx64: 160 バイト / x86: 160 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
FastRetranDWORD4+0+0Fast Retransmit アルゴリズムが呼び出された回数です。
TimeoutsDWORD4+4+4再送タイマーのバックオフ乗数が 1 の状態で、再送タイムアウトが満了した回数です。
SubsequentTimeoutsDWORD4+8+8

再送タイマーが 2 倍に延長された後に、再送タイムアウトが満了した回数です。

詳細については、後述の「解説」で触れている RFC 2988 のセクション 5.5 を参照してください。

CurTimeoutCountDWORD4+12+12

新しいデータに対する確認応答を受信しないまま、再送タイムアウトが満了した現在の回数です。

CurTimeoutCount メンバーは、新しいデータが確認応答されると 0 にリセットされ、RFC 2988 のセクション 5.5 が呼び出されるたびに増加します。

AbruptTimeoutsDWORD4+16+16

直前に重複確認応答やその他の輻輳の兆候がまったくない状態で発生したタイムアウトの回数です。突発的なタイムアウトは、そのパスでデータまたは確認応答のウィンドウ全体が失われたことを示します。

重複確認応答やその他の輻輳信号 (Explicit Congestion Notification など) が先行したタイムアウトは、突発的なものとしては数えられません。これらは、より高度な Fast Retransmit アルゴリズムであれば回避できた可能性があります。

PktsRetransDWORD4+20+20再送データを一部でも含んで送信されたセグメントの数です。
BytesRetransDWORD4+24+24再送されたバイト数です。
DupAcksInDWORD4+28+28受信した重複 ACK の数です。
SacksRcvdDWORD4+32+32受信した選択的確認応答 (SACK) オプションの数です。
SackBlocksRcvdDWORD4+36+36(SACK オプション内で) 受信した SACK ブロックの数です。
CongSignalsDWORD4+40+40

Fast Retransmit、Explicit Congestion Notification (ECN)、タイムアウトなど、あらゆる形式の輻輳信号に起因する、輻輳ウィンドウの乗算的な縮小の回数です。このメンバーは、Additive Increase Multiplicative Decrease (AIMD) 輻輳制御の乗算的減少 (MD) の部分を呼び出すすべてのイベントを集計したものであり、輻輳によって輻輳ウィンドウがどのような影響を受けているかを示す最良の指標です。

再送タイムアウトは、スロースタートのしきい値サイズを設定することで暗黙的にウィンドウを乗算的に縮小しますが、これも CongSignals メンバーに格納される値に含まれます。順序が乱れたセグメントによる誤った輻輳の通知を最小限に抑えるため、CongSignals メンバーは Fast Retransmit アルゴリズムに連動して増加します。

PreCongSumCwndDWORD4+44+44

輻輳信号を受信するたびに取得した輻輳ウィンドウの値 (バイト単位) の合計です。

このメンバーは CongSignals メンバーが増加するたびに更新されます。したがって、PreCongSumCwnd メンバーの変化量を CongSignals メンバーの変化量で割った値は、輻輳信号の直前における (一定区間の) 平均ウィンドウを表します。

PreCongSumRttDWORD4+48+48

輻輳信号を受信する直前における、ネットワークのラウンドトリップ時間 (RTT) の最後のサンプルの合計 (ミリ秒単位) です。RTT の最後のサンプルは SampleRtt メンバーに格納されます。

PreCongSumRtt メンバーは CongSignals メンバーが増加するたびに更新されます。したがって、PreCongSumRtt の変化量を CongSignals メンバーの変化量で割った値は、輻輳信号の直前における (一定区間の) 平均 RTT を表します。

PostCongSumRttDWORD4+52+52

各輻輳信号の後に取得された、ネットワーク RTT の最初のサンプル (SampleRtt メンバーに格納されます) の合計 (ミリ秒単位) です。

PostCongSumRtt メンバーの変化量を PostCongCountRtt メンバーの変化量で割った値は、輻輳信号の直後における (一定区間の) 平均 RTT を表します。

PostCongCountRttDWORD4+56+56

PostCongSumRtt メンバーに含まれる RTT サンプルの数 (バイト単位) です。

PostCongSumRtt メンバーの変化量を PostCongCountRtt メンバーの変化量で割った値は、輻輳信号の直後における (一定区間の) 平均 RTT を表します。

EcnSignalsDWORD4+60+60

ECN によって TCP 送信側に伝えられた輻輳信号の数です。

これは通常、Echo Congestion Experienced (ECE) ビットを持つセグメントの数ですが、ECN ノンスのチェックに失敗したセグメントやその他の明示的な輻輳信号も含まれます。

EceRcvdDWORD4+64+64Congestion Experienced (CE) のマークが付いた IP ヘッダーを持つセグメントを受信した数です。
SendStallDWORD4+68+68輻輳信号として扱われる、インターフェイスのストールや送信側のその他のローカルリソース制限の発生回数です。
QuenchRcvdDWORD4+72+72将来の使用のために予約済みです。このメンバーは常に 0 に設定されます。
RetranThreshDWORD4+76+76

Fast Retransmit をトリガーするために必要な重複確認応答の数です。

この値は従来の Reno TCP 実装では定数ですが、新しい多くの TCP 実装では適応的である点に注意してください。

SndDupAckEpisodesDWORD4+80+80

直前の ACK が重複でなかったときに送信された重複 ACK の数です。これは、連続する一連の重複確認応答が送信された回数を表します。

これは、リモートの TCP エンドポイントから手前の TCP エンドポイントへのパス上で失われた、または順序が入れ替わったデータセグメントの数を示します。

SumBytesReorderedDWORD4+84+84

再送を伴わずに重複 ACK のエピソードを終了させた確認応答において、SND.UNA が進んだ量の合計です。

SumBytesReordered メンバーの変化量を NonRecovDaEpisodes メンバーの変化量で割った値は、一定区間における平均の並べ替え距離の推定値となる点に注意してください。

NonRecovDaDWORD4+88+88

重複確認応答の数が RetranThresh に達する前に ACK が進んだため、Fast Retransmit をトリガーしなかった重複 ACK (または SACK) の数です。

NonRecovDa メンバーの変化量を NonRecovDaEpisodes メンバーの変化量で割った値は、一定区間におけるセグメント単位の平均の並べ替え距離の推定値となる点に注意してください。

NonRecovDaEpisodesDWORD4+92+92重複確認応答の数が RetranThresh に達する前に ACK が進んだため、Fast Retransmit をトリガーしなかった重複確認応答エピソードの数です。
AckAfterFrDWORD4+96+96将来の使用のために予約済みです。このメンバーは常に 0 に設定されます。
DsackDupsDWORD4+100+100D-SACK ブロックによってローカルホストに報告された重複セグメントの数です。
SampleRttDWORD4+104+104再送タイマー (RTO) の計算に使用される、最新の生のネットワークラウンドトリップ時間の測定値 (ミリ秒単位) です。
SmoothedRttDWORD4+108+108RTO の計算に使用される、平滑化されたラウンドトリップ時間 (ミリ秒単位) です。
RttVarDWORD4+112+112RTO の計算に使用される、ラウンドトリップ時間の変動 (ミリ秒単位) です。
MaxRttDWORD4+116+116サンプリングされたラウンドトリップ時間の最大値 (ミリ秒単位) です。
MinRttDWORD4+120+120サンプリングされたラウンドトリップ時間の最小値 (ミリ秒単位) です。
SumRttDWORD4+124+124

サンプリングされたすべてのラウンドトリップ時間の合計 (ミリ秒単位) です。

SumRtt メンバーの変化量を CountRtt メンバーの変化量で割った値は、区間全体で一様に平均化された平均 RTT となる点に注意してください。

CountRttDWORD4+128+128SumRtt メンバーに含まれるラウンドトリップ時間サンプルの数です。
CurRtoDWORD4+132+132再送タイマーの現在の値 (ミリ秒単位) です。
MaxRtoDWORD4+136+136再送タイマーの最大値 (ミリ秒単位) です。
MinRtoDWORD4+140+140再送タイマーの最小値 (ミリ秒単位) です。
CurMssDWORD4+144+144現在の最大セグメントサイズ (MSS)。バイト単位です。
MaxMssDWORD4+148+148MSS の最大値。バイト単位です。
MinMssDWORD4+152+152MSS の最小値。バイト単位です。
SpuriousRtoDetectionsDWORD4+156+156再送タイムアウトによって既に再送済みとなっているセグメントを報告する、確認応答の数です。

公式ドキュメント

TCP_ESTATS_PATH_ROD_v0 構造体は、TCP 接続のネットワークパス測定に関する拡張 TCP 統計の、読み取り専用の動的情報を格納します。

解説(Remarks)

TCP_ESTATS_PATH_ROD_v0 構造体は、Windows Vista 以降で利用できる TCP 拡張統計機能の一部として使用されます。

TCP_ESTATS_PATH_ROD_v0 は、TCP 接続のネットワークパス測定に関する読み取り専用の動的情報を保持する構造体のバージョン 0 として定義されています。この情報は、接続が確立された後に利用できます。

TCP_ESTATS_PATH_ROD_v0 構造体は、EstatsType パラメーターに TcpConnectionEstatsPath を渡して GetPerTcp6ConnectionEStats 関数または GetPerTcpConnectionEStats 関数を呼び出すことで取得します。この構造体を取得するには、TCP 拡張統計を有効にしておく必要があります。

パス MTU 探索と最大セグメントサイズについては、パス MTU 探索に関する IETF RFC 1191 で詳しく説明されています。詳細については、http://www.ietf.org/rfc/rfc1191.txt を参照してください。

TCP の輻輳制御と輻輳制御アルゴリズムについては、TCP 輻輳制御に関する IETF RFC 2581 で詳しく説明されています。詳細については、http://www.ietf.org/rfc/rfc2581.txt を参照してください。

SACK および SACK オプションの拡張については、TCP の選択的確認応答 (SACK) オプションの拡張に関する IETF RFC 2883 で詳しく説明されています。詳細については、http://www.ietf.org/rfc/rfc2883.txt を参照してください。

TCP の再送タイマー (RTO) と平滑化されたラウンドトリップ時間 (RTT) については、TCP の再送タイマーの計算に関する IETF RFC 2988 で詳しく説明されています。詳細については、http://www.ietf.org/rfc/rfc2988.txt を参照してください。

IP における Explicit Congestion Notification については、IP への Explicit Congestion Notification (ECN) の追加に関する IETF RFC 2581 で詳しく説明されています。詳細については、http://www.ietf.org/rfc/rfc3168.txt を参照してください。

この構造体のメンバーは、TCP 拡張統計 MIB に関する IETF RFC で定義されています。詳細については、http://www.ietf.org/rfc/rfc4898.txt を参照してください。

次に、TCP_ESTATS_PATH_ROD_v0 構造体のメンバーと、拡張 TCP 統計について RFC 4898 で定義されているエントリとの対応を示します。

用語 説明
FastRetran tcpEStatsStackFastRetran
Timeouts tcpEStatsPerfTimeouts
SubsequentTimeouts tcpEStatsStackSubsequentTimeouts
CurTimeoutCount tcpEStatsStackCurTimeoutCount
AbruptTimeouts tcpEStatsStackAbruptTimeouts
PktsRetrans tcpEStatsPerfSegsRetrans
BytesRetrans tcpEStatsPerfOctetsRetrans
DupAcksIn tcpEStatsStackDupAcksIn
SacksRcvd tcpEStatsStackSACKsRcvd
SackBlocksRcvd tcpEStatsStackSACKBlocksRcvd
CongSignals tcpEStatsPerfCongSignals
PreCongSumCwnd tcpEStatsPathPreCongSumCwnd
PreCongSumRtt tcpEStatsPathPreCongSumRTT
PostCongSumRtt tcpEStatsPathPostCongSumRTT
PostCongCountRtt tcpEStatsPathPostCongCountRTT
EcnSignals tcpEStatsPathECNsignals
EceRcvd tcpEStatsPathCERcvd
SendStall tcpEStatsStackSendStall
QuenchRcvd このメンバーに対応するものはありません。
RetranThresh tcpEStatsPathRetranThresh
SndDupAckEpisodes tcpEStatsPathDupAckEpisodes
SumBytesReordered tcpEStatsPathSumOctetsReordered
NonRecovDa tcpEStatsPathNonRecovDA
NonRecovDaEpisodes tcpEStatsPathNonRecovDAEpisodes
AckAfterFr このメンバーに対応するものはありません。
DsackDups tcpEStatsStackDSACKDups
SampleRtt tcpEStatsPathSampleRTT
SmoothedRtt tcpEStatsPerfSmoothedRTT
RttVar tcpEStatsPathRTTVar
MaxRtt tcpEStatsPathMaxRTT
MinRtt tcpEStatsPathMinRTT
SumRtt tcpEStatsPathSumRTT
CountRtt tcpEStatsPathCountRTT
CurRto tcpEStatsPerfCurRTO
MaxRto tcpEStatsPathMaxRTO
MinRto tcpEStatsPathMinRTO
CurMss tcpEStatsPerfCurMSS
MaxMss tcpEStatsStackMaxMSS
MinMss tcpEStatsStackMinMSS
SpuriousRtoDetections tcpEStatsStackSpuriousRtoDetected
 

TCP_ESTATS_FINE_RTT_ROD_v0 構造体には、TCP_ESTATS_PATH_ROD_v0 構造体の RttVarMaxRttMinRttSumRtt の各メンバーと同様のデータを提供するメンバーがあります。ただし、TCP_ESTATS_FINE_RTT_ROD_v0 構造体の対応するメンバーでは、時間はマイクロ秒単位で報告されます。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// TCP_ESTATS_PATH_ROD_v0  (x64 160 / x86 160 バイト)
typedef struct TCP_ESTATS_PATH_ROD_v0 {
    DWORD FastRetran;
    DWORD Timeouts;
    DWORD SubsequentTimeouts;
    DWORD CurTimeoutCount;
    DWORD AbruptTimeouts;
    DWORD PktsRetrans;
    DWORD BytesRetrans;
    DWORD DupAcksIn;
    DWORD SacksRcvd;
    DWORD SackBlocksRcvd;
    DWORD CongSignals;
    DWORD PreCongSumCwnd;
    DWORD PreCongSumRtt;
    DWORD PostCongSumRtt;
    DWORD PostCongCountRtt;
    DWORD EcnSignals;
    DWORD EceRcvd;
    DWORD SendStall;
    DWORD QuenchRcvd;
    DWORD RetranThresh;
    DWORD SndDupAckEpisodes;
    DWORD SumBytesReordered;
    DWORD NonRecovDa;
    DWORD NonRecovDaEpisodes;
    DWORD AckAfterFr;
    DWORD DsackDups;
    DWORD SampleRtt;
    DWORD SmoothedRtt;
    DWORD RttVar;
    DWORD MaxRtt;
    DWORD MinRtt;
    DWORD SumRtt;
    DWORD CountRtt;
    DWORD CurRto;
    DWORD MaxRto;
    DWORD MinRto;
    DWORD CurMss;
    DWORD MaxMss;
    DWORD MinMss;
    DWORD SpuriousRtoDetections;
} TCP_ESTATS_PATH_ROD_v0;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct TCP_ESTATS_PATH_ROD_v0
{
    public uint FastRetran;
    public uint Timeouts;
    public uint SubsequentTimeouts;
    public uint CurTimeoutCount;
    public uint AbruptTimeouts;
    public uint PktsRetrans;
    public uint BytesRetrans;
    public uint DupAcksIn;
    public uint SacksRcvd;
    public uint SackBlocksRcvd;
    public uint CongSignals;
    public uint PreCongSumCwnd;
    public uint PreCongSumRtt;
    public uint PostCongSumRtt;
    public uint PostCongCountRtt;
    public uint EcnSignals;
    public uint EceRcvd;
    public uint SendStall;
    public uint QuenchRcvd;
    public uint RetranThresh;
    public uint SndDupAckEpisodes;
    public uint SumBytesReordered;
    public uint NonRecovDa;
    public uint NonRecovDaEpisodes;
    public uint AckAfterFr;
    public uint DsackDups;
    public uint SampleRtt;
    public uint SmoothedRtt;
    public uint RttVar;
    public uint MaxRtt;
    public uint MinRtt;
    public uint SumRtt;
    public uint CountRtt;
    public uint CurRto;
    public uint MaxRto;
    public uint MinRto;
    public uint CurMss;
    public uint MaxMss;
    public uint MinMss;
    public uint SpuriousRtoDetections;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure TCP_ESTATS_PATH_ROD_v0
    Public FastRetran As UInteger
    Public Timeouts As UInteger
    Public SubsequentTimeouts As UInteger
    Public CurTimeoutCount As UInteger
    Public AbruptTimeouts As UInteger
    Public PktsRetrans As UInteger
    Public BytesRetrans As UInteger
    Public DupAcksIn As UInteger
    Public SacksRcvd As UInteger
    Public SackBlocksRcvd As UInteger
    Public CongSignals As UInteger
    Public PreCongSumCwnd As UInteger
    Public PreCongSumRtt As UInteger
    Public PostCongSumRtt As UInteger
    Public PostCongCountRtt As UInteger
    Public EcnSignals As UInteger
    Public EceRcvd As UInteger
    Public SendStall As UInteger
    Public QuenchRcvd As UInteger
    Public RetranThresh As UInteger
    Public SndDupAckEpisodes As UInteger
    Public SumBytesReordered As UInteger
    Public NonRecovDa As UInteger
    Public NonRecovDaEpisodes As UInteger
    Public AckAfterFr As UInteger
    Public DsackDups As UInteger
    Public SampleRtt As UInteger
    Public SmoothedRtt As UInteger
    Public RttVar As UInteger
    Public MaxRtt As UInteger
    Public MinRtt As UInteger
    Public SumRtt As UInteger
    Public CountRtt As UInteger
    Public CurRto As UInteger
    Public MaxRto As UInteger
    Public MinRto As UInteger
    Public CurMss As UInteger
    Public MaxMss As UInteger
    Public MinMss As UInteger
    Public SpuriousRtoDetections As UInteger
End Structure
import ctypes
from ctypes import wintypes

class TCP_ESTATS_PATH_ROD_v0(ctypes.Structure):
    _fields_ = [
        ("FastRetran", wintypes.DWORD),
        ("Timeouts", wintypes.DWORD),
        ("SubsequentTimeouts", wintypes.DWORD),
        ("CurTimeoutCount", wintypes.DWORD),
        ("AbruptTimeouts", wintypes.DWORD),
        ("PktsRetrans", wintypes.DWORD),
        ("BytesRetrans", wintypes.DWORD),
        ("DupAcksIn", wintypes.DWORD),
        ("SacksRcvd", wintypes.DWORD),
        ("SackBlocksRcvd", wintypes.DWORD),
        ("CongSignals", wintypes.DWORD),
        ("PreCongSumCwnd", wintypes.DWORD),
        ("PreCongSumRtt", wintypes.DWORD),
        ("PostCongSumRtt", wintypes.DWORD),
        ("PostCongCountRtt", wintypes.DWORD),
        ("EcnSignals", wintypes.DWORD),
        ("EceRcvd", wintypes.DWORD),
        ("SendStall", wintypes.DWORD),
        ("QuenchRcvd", wintypes.DWORD),
        ("RetranThresh", wintypes.DWORD),
        ("SndDupAckEpisodes", wintypes.DWORD),
        ("SumBytesReordered", wintypes.DWORD),
        ("NonRecovDa", wintypes.DWORD),
        ("NonRecovDaEpisodes", wintypes.DWORD),
        ("AckAfterFr", wintypes.DWORD),
        ("DsackDups", wintypes.DWORD),
        ("SampleRtt", wintypes.DWORD),
        ("SmoothedRtt", wintypes.DWORD),
        ("RttVar", wintypes.DWORD),
        ("MaxRtt", wintypes.DWORD),
        ("MinRtt", wintypes.DWORD),
        ("SumRtt", wintypes.DWORD),
        ("CountRtt", wintypes.DWORD),
        ("CurRto", wintypes.DWORD),
        ("MaxRto", wintypes.DWORD),
        ("MinRto", wintypes.DWORD),
        ("CurMss", wintypes.DWORD),
        ("MaxMss", wintypes.DWORD),
        ("MinMss", wintypes.DWORD),
        ("SpuriousRtoDetections", wintypes.DWORD),
    ]
#[repr(C)]
pub struct TCP_ESTATS_PATH_ROD_v0 {
    pub FastRetran: u32,
    pub Timeouts: u32,
    pub SubsequentTimeouts: u32,
    pub CurTimeoutCount: u32,
    pub AbruptTimeouts: u32,
    pub PktsRetrans: u32,
    pub BytesRetrans: u32,
    pub DupAcksIn: u32,
    pub SacksRcvd: u32,
    pub SackBlocksRcvd: u32,
    pub CongSignals: u32,
    pub PreCongSumCwnd: u32,
    pub PreCongSumRtt: u32,
    pub PostCongSumRtt: u32,
    pub PostCongCountRtt: u32,
    pub EcnSignals: u32,
    pub EceRcvd: u32,
    pub SendStall: u32,
    pub QuenchRcvd: u32,
    pub RetranThresh: u32,
    pub SndDupAckEpisodes: u32,
    pub SumBytesReordered: u32,
    pub NonRecovDa: u32,
    pub NonRecovDaEpisodes: u32,
    pub AckAfterFr: u32,
    pub DsackDups: u32,
    pub SampleRtt: u32,
    pub SmoothedRtt: u32,
    pub RttVar: u32,
    pub MaxRtt: u32,
    pub MinRtt: u32,
    pub SumRtt: u32,
    pub CountRtt: u32,
    pub CurRto: u32,
    pub MaxRto: u32,
    pub MinRto: u32,
    pub CurMss: u32,
    pub MaxMss: u32,
    pub MinMss: u32,
    pub SpuriousRtoDetections: u32,
}
import "golang.org/x/sys/windows"

type TCP_ESTATS_PATH_ROD_v0 struct {
	FastRetran uint32
	Timeouts uint32
	SubsequentTimeouts uint32
	CurTimeoutCount uint32
	AbruptTimeouts uint32
	PktsRetrans uint32
	BytesRetrans uint32
	DupAcksIn uint32
	SacksRcvd uint32
	SackBlocksRcvd uint32
	CongSignals uint32
	PreCongSumCwnd uint32
	PreCongSumRtt uint32
	PostCongSumRtt uint32
	PostCongCountRtt uint32
	EcnSignals uint32
	EceRcvd uint32
	SendStall uint32
	QuenchRcvd uint32
	RetranThresh uint32
	SndDupAckEpisodes uint32
	SumBytesReordered uint32
	NonRecovDa uint32
	NonRecovDaEpisodes uint32
	AckAfterFr uint32
	DsackDups uint32
	SampleRtt uint32
	SmoothedRtt uint32
	RttVar uint32
	MaxRtt uint32
	MinRtt uint32
	SumRtt uint32
	CountRtt uint32
	CurRto uint32
	MaxRto uint32
	MinRto uint32
	CurMss uint32
	MaxMss uint32
	MinMss uint32
	SpuriousRtoDetections uint32
}
type
  TCP_ESTATS_PATH_ROD_v0 = record
    FastRetran: DWORD;
    Timeouts: DWORD;
    SubsequentTimeouts: DWORD;
    CurTimeoutCount: DWORD;
    AbruptTimeouts: DWORD;
    PktsRetrans: DWORD;
    BytesRetrans: DWORD;
    DupAcksIn: DWORD;
    SacksRcvd: DWORD;
    SackBlocksRcvd: DWORD;
    CongSignals: DWORD;
    PreCongSumCwnd: DWORD;
    PreCongSumRtt: DWORD;
    PostCongSumRtt: DWORD;
    PostCongCountRtt: DWORD;
    EcnSignals: DWORD;
    EceRcvd: DWORD;
    SendStall: DWORD;
    QuenchRcvd: DWORD;
    RetranThresh: DWORD;
    SndDupAckEpisodes: DWORD;
    SumBytesReordered: DWORD;
    NonRecovDa: DWORD;
    NonRecovDaEpisodes: DWORD;
    AckAfterFr: DWORD;
    DsackDups: DWORD;
    SampleRtt: DWORD;
    SmoothedRtt: DWORD;
    RttVar: DWORD;
    MaxRtt: DWORD;
    MinRtt: DWORD;
    SumRtt: DWORD;
    CountRtt: DWORD;
    CurRto: DWORD;
    MaxRto: DWORD;
    MinRto: DWORD;
    CurMss: DWORD;
    MaxMss: DWORD;
    MinMss: DWORD;
    SpuriousRtoDetections: DWORD;
  end;
const TCP_ESTATS_PATH_ROD_v0 = extern struct {
    FastRetran: u32,
    Timeouts: u32,
    SubsequentTimeouts: u32,
    CurTimeoutCount: u32,
    AbruptTimeouts: u32,
    PktsRetrans: u32,
    BytesRetrans: u32,
    DupAcksIn: u32,
    SacksRcvd: u32,
    SackBlocksRcvd: u32,
    CongSignals: u32,
    PreCongSumCwnd: u32,
    PreCongSumRtt: u32,
    PostCongSumRtt: u32,
    PostCongCountRtt: u32,
    EcnSignals: u32,
    EceRcvd: u32,
    SendStall: u32,
    QuenchRcvd: u32,
    RetranThresh: u32,
    SndDupAckEpisodes: u32,
    SumBytesReordered: u32,
    NonRecovDa: u32,
    NonRecovDaEpisodes: u32,
    AckAfterFr: u32,
    DsackDups: u32,
    SampleRtt: u32,
    SmoothedRtt: u32,
    RttVar: u32,
    MaxRtt: u32,
    MinRtt: u32,
    SumRtt: u32,
    CountRtt: u32,
    CurRto: u32,
    MaxRto: u32,
    MinRto: u32,
    CurMss: u32,
    MaxMss: u32,
    MinMss: u32,
    SpuriousRtoDetections: u32,
};
type
  TCP_ESTATS_PATH_ROD_v0 {.bycopy.} = object
    FastRetran: uint32
    Timeouts: uint32
    SubsequentTimeouts: uint32
    CurTimeoutCount: uint32
    AbruptTimeouts: uint32
    PktsRetrans: uint32
    BytesRetrans: uint32
    DupAcksIn: uint32
    SacksRcvd: uint32
    SackBlocksRcvd: uint32
    CongSignals: uint32
    PreCongSumCwnd: uint32
    PreCongSumRtt: uint32
    PostCongSumRtt: uint32
    PostCongCountRtt: uint32
    EcnSignals: uint32
    EceRcvd: uint32
    SendStall: uint32
    QuenchRcvd: uint32
    RetranThresh: uint32
    SndDupAckEpisodes: uint32
    SumBytesReordered: uint32
    NonRecovDa: uint32
    NonRecovDaEpisodes: uint32
    AckAfterFr: uint32
    DsackDups: uint32
    SampleRtt: uint32
    SmoothedRtt: uint32
    RttVar: uint32
    MaxRtt: uint32
    MinRtt: uint32
    SumRtt: uint32
    CountRtt: uint32
    CurRto: uint32
    MaxRto: uint32
    MinRto: uint32
    CurMss: uint32
    MaxMss: uint32
    MinMss: uint32
    SpuriousRtoDetections: uint32
struct TCP_ESTATS_PATH_ROD_v0
{
    uint FastRetran;
    uint Timeouts;
    uint SubsequentTimeouts;
    uint CurTimeoutCount;
    uint AbruptTimeouts;
    uint PktsRetrans;
    uint BytesRetrans;
    uint DupAcksIn;
    uint SacksRcvd;
    uint SackBlocksRcvd;
    uint CongSignals;
    uint PreCongSumCwnd;
    uint PreCongSumRtt;
    uint PostCongSumRtt;
    uint PostCongCountRtt;
    uint EcnSignals;
    uint EceRcvd;
    uint SendStall;
    uint QuenchRcvd;
    uint RetranThresh;
    uint SndDupAckEpisodes;
    uint SumBytesReordered;
    uint NonRecovDa;
    uint NonRecovDaEpisodes;
    uint AckAfterFr;
    uint DsackDups;
    uint SampleRtt;
    uint SmoothedRtt;
    uint RttVar;
    uint MaxRtt;
    uint MinRtt;
    uint SumRtt;
    uint CountRtt;
    uint CurRto;
    uint MaxRto;
    uint MinRto;
    uint CurMss;
    uint MaxMss;
    uint MinMss;
    uint SpuriousRtoDetections;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; TCP_ESTATS_PATH_ROD_v0 サイズ: 160 バイト(x64)
dim st, 40    ; 4byte整数×40(構造体サイズ 160 / 4 切り上げ)
; FastRetran : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; Timeouts : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; SubsequentTimeouts : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; CurTimeoutCount : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; AbruptTimeouts : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; PktsRetrans : DWORD (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; BytesRetrans : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; DupAcksIn : DWORD (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; SacksRcvd : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; SackBlocksRcvd : DWORD (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; CongSignals : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; PreCongSumCwnd : DWORD (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; PreCongSumRtt : DWORD (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; PostCongSumRtt : DWORD (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; PostCongCountRtt : DWORD (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; EcnSignals : DWORD (+60, 4byte)  st.15 = 値  /  値 = st.15   (lpoke/lpeek も可)
; EceRcvd : DWORD (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; SendStall : DWORD (+68, 4byte)  st.17 = 値  /  値 = st.17   (lpoke/lpeek も可)
; QuenchRcvd : DWORD (+72, 4byte)  st.18 = 値  /  値 = st.18   (lpoke/lpeek も可)
; RetranThresh : DWORD (+76, 4byte)  st.19 = 値  /  値 = st.19   (lpoke/lpeek も可)
; SndDupAckEpisodes : DWORD (+80, 4byte)  st.20 = 値  /  値 = st.20   (lpoke/lpeek も可)
; SumBytesReordered : DWORD (+84, 4byte)  st.21 = 値  /  値 = st.21   (lpoke/lpeek も可)
; NonRecovDa : DWORD (+88, 4byte)  st.22 = 値  /  値 = st.22   (lpoke/lpeek も可)
; NonRecovDaEpisodes : DWORD (+92, 4byte)  st.23 = 値  /  値 = st.23   (lpoke/lpeek も可)
; AckAfterFr : DWORD (+96, 4byte)  st.24 = 値  /  値 = st.24   (lpoke/lpeek も可)
; DsackDups : DWORD (+100, 4byte)  st.25 = 値  /  値 = st.25   (lpoke/lpeek も可)
; SampleRtt : DWORD (+104, 4byte)  st.26 = 値  /  値 = st.26   (lpoke/lpeek も可)
; SmoothedRtt : DWORD (+108, 4byte)  st.27 = 値  /  値 = st.27   (lpoke/lpeek も可)
; RttVar : DWORD (+112, 4byte)  st.28 = 値  /  値 = st.28   (lpoke/lpeek も可)
; MaxRtt : DWORD (+116, 4byte)  st.29 = 値  /  値 = st.29   (lpoke/lpeek も可)
; MinRtt : DWORD (+120, 4byte)  st.30 = 値  /  値 = st.30   (lpoke/lpeek も可)
; SumRtt : DWORD (+124, 4byte)  st.31 = 値  /  値 = st.31   (lpoke/lpeek も可)
; CountRtt : DWORD (+128, 4byte)  st.32 = 値  /  値 = st.32   (lpoke/lpeek も可)
; CurRto : DWORD (+132, 4byte)  st.33 = 値  /  値 = st.33   (lpoke/lpeek も可)
; MaxRto : DWORD (+136, 4byte)  st.34 = 値  /  値 = st.34   (lpoke/lpeek も可)
; MinRto : DWORD (+140, 4byte)  st.35 = 値  /  値 = st.35   (lpoke/lpeek も可)
; CurMss : DWORD (+144, 4byte)  st.36 = 値  /  値 = st.36   (lpoke/lpeek も可)
; MaxMss : DWORD (+148, 4byte)  st.37 = 値  /  値 = st.37   (lpoke/lpeek も可)
; MinMss : DWORD (+152, 4byte)  st.38 = 値  /  値 = st.38   (lpoke/lpeek も可)
; SpuriousRtoDetections : DWORD (+156, 4byte)  st.39 = 値  /  値 = st.39   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global TCP_ESTATS_PATH_ROD_v0
    #field int FastRetran
    #field int Timeouts
    #field int SubsequentTimeouts
    #field int CurTimeoutCount
    #field int AbruptTimeouts
    #field int PktsRetrans
    #field int BytesRetrans
    #field int DupAcksIn
    #field int SacksRcvd
    #field int SackBlocksRcvd
    #field int CongSignals
    #field int PreCongSumCwnd
    #field int PreCongSumRtt
    #field int PostCongSumRtt
    #field int PostCongCountRtt
    #field int EcnSignals
    #field int EceRcvd
    #field int SendStall
    #field int QuenchRcvd
    #field int RetranThresh
    #field int SndDupAckEpisodes
    #field int SumBytesReordered
    #field int NonRecovDa
    #field int NonRecovDaEpisodes
    #field int AckAfterFr
    #field int DsackDups
    #field int SampleRtt
    #field int SmoothedRtt
    #field int RttVar
    #field int MaxRtt
    #field int MinRtt
    #field int SumRtt
    #field int CountRtt
    #field int CurRto
    #field int MaxRto
    #field int MinRto
    #field int CurMss
    #field int MaxMss
    #field int MinMss
    #field int SpuriousRtoDetections
#endstruct

stdim st, TCP_ESTATS_PATH_ROD_v0        ; NSTRUCT 変数を確保
st->FastRetran = 100
mes "FastRetran=" + st->FastRetran