IRTT Packet Test Vectors
Source: Black-box captures from irtt 0.9.1 on macOS Darwin 25.3.0 arm64
Date: 2026-04-28
All vectors are from actual network captures (not constructed).
Vector 1: Open Request (no HMAC)
Scenario: Client opens session with default parameters (duration=3s,
interval=1s, stats=both, tstamp=both, clock=both).
Direction: Client → Server
irtt version: 0.9.1
Command: irtt client -d 3s -i 1s 127.0.0.1:2112
Packet (24 bytes):
14 a7 5b 01 01 02 02 80 f8 82 ad 16 03 80 a8 d6
b9 07 05 06 06 06 07 06
Field breakdown:
- Bytes 0-2: Magic
14 a7 5b - Byte 3: Flags
01(Open) - Bytes 4-23: Parameter payload:
- Tag 1 (ProtocolVersion): value
02→ zigzag → 1 - Tag 2 (Duration): value
80 f8 82 ad 16→ zigzag → 3000000000 ns (3s) - Tag 3 (Interval): value
80 a8 d6 b9 07→ zigzag → 1000000000 ns (1s) - Tag 5 (ReceivedStats): value
06→ zigzag → 3 (Both) - Tag 6 (StampAt): value
06→ zigzag → 3 (Both) - Tag 7 (Clock): value
06→ zigzag → 3 (Both)
- Tag 1 (ProtocolVersion): value
Notes:
- No connection token field (token not yet assigned)
- Tags 4 (Length), 8 (DSCP) omitted because values are 0
- Tag 9 (ServerFill) omitted because not specified
Vector 2: Open Reply (no HMAC)
Scenario: Server accepts session, returns token and echoed parameters.
Direction: Server → Client
Token: 0x7896b6ab87715213
Packet (32 bytes):
14 a7 5b 03 13 52 71 87 ab b6 96 78 01 02 02 80
f8 82 ad 16 03 80 a8 d6 b9 07 05 06 06 06 07 06
Field breakdown:
- Bytes 0-2: Magic
14 a7 5b - Byte 3: Flags
03(Open | Reply) - Bytes 4-11: Connection token
13 52 71 87 ab b6 96 78(LE: 0x7896b6ab87715213) - Bytes 12-31: Parameter payload (same as request — no restrictions)
Vector 3: Echo Request (no HMAC, default stats+timestamps)
Scenario: First test packet, sequence 0, default settings.
Direction: Client → Server
Token: 0x7896b6ab87715213, Seq: 0
Packet (60 bytes):
14 a7 5b 00 13 52 71 87 ab b6 96 78 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
Field breakdown:
- Bytes 0-2: Magic
14 a7 5b - Byte 3: Flags
00(no flags — echo request from client) - Bytes 4-11: Connection token
- Bytes 12-15: Sequence number
00 00 00 00(LE: 0) - Bytes 16-19: Received count (zeroed placeholder)
- Bytes 20-27: Received window (zeroed placeholder)
- Bytes 28-35: Receive wall timestamp (zeroed placeholder)
- Bytes 36-43: Receive mono timestamp (zeroed placeholder)
- Bytes 44-51: Send wall timestamp (zeroed placeholder)
- Bytes 52-59: Send mono timestamp (zeroed placeholder)
Notes: All stats and timestamp fields are zeroed in echo requests. They serve as placeholders to reach the negotiated packet length.
Vector 4: Echo Reply (no HMAC, default stats+timestamps)
Scenario: Server reply to seq 2, third packet in session.
Direction: Server → Client
Token: 0x7896b6ab87715213, Seq: 2, Recv Count: 3, Window: 0x07
Packet (60 bytes):
14 a7 5b 02 13 52 71 87 ab b6 96 78 02 00 00 00
03 00 00 00 07 00 00 00 00 00 00 00 b8 1a 33 0c
86 6d aa 18 de 26 35 95 00 00 00 00 80 4d 33 0c
86 6d aa 18 b2 57 35 95 00 00 00 00
Field breakdown:
- Bytes 0-2: Magic
14 a7 5b - Byte 3: Flags
02(Reply) - Bytes 4-11: Connection token
- Bytes 12-15: Sequence number
02 00 00 00(LE: 2) - Bytes 16-19: Received count
03 00 00 00(LE: 3) - Bytes 20-27: Received window
07 00 00 00 00 00 00 00(LE: 0x07, bits 0-2 set) - Bytes 28-35: Receive wall timestamp
b8 1a 33 0c 86 6d aa 18(LE int64) - Bytes 36-43: Receive mono timestamp
de 26 35 95 00 00 00 00(LE int64) - Bytes 44-51: Send wall timestamp
80 4d 33 0c 86 6d aa 18(LE int64) - Bytes 52-59: Send mono timestamp
b2 57 35 95 00 00 00 00(LE int64)
Window interpretation (for seq 2):
- Bit 0 (0x01): Seq 2 received ✓
- Bit 1 (0x02): Seq 1 received ✓
- Bit 2 (0x04): Seq 0 received ✓
Vector 5: Close Request (no HMAC)
Scenario: Client sends close after test.
Direction: Client → Server
Token: 0x7896b6ab87715213
Packet (12 bytes):
14 a7 5b 04 13 52 71 87 ab b6 96 78
Field breakdown:
- Bytes 0-2: Magic
14 a7 5b - Byte 3: Flags
04(Close) - Bytes 4-11: Connection token
Vector 6: HMAC Open Request
Scenario: Client opens session with HMAC key "testkey".
Direction: Client → Server
HMAC key: ASCII "testkey" (7 bytes)
Packet (40 bytes):
14 a7 5b 09 ff 90 16 a7 aa 53 78 16 9e c3 a2 d5
54 dc 30 36 01 02 02 80 d0 ac f3 0e 03 80 a8 d6
b9 07 05 06 06 06 07 06
Field breakdown:
- Bytes 0-2: Magic
14 a7 5b - Byte 3: Flags
09(Open | HMAC) - Bytes 4-19: HMAC
ff 90 16 a7 aa 53 78 16 9e c3 a2 d5 54 dc 30 36 - Bytes 20-39: Parameter payload
HMAC verified independently with Python (HMAC-MD5 over entire packet with HMAC field zeroed).
Vector 7: HMAC Echo Request
Scenario: Echo request with HMAC, seq 0.
Direction: Client → Server
Token: 0x4387e9eb5d3fca59, HMAC key: "testkey"
Packet (76 bytes):
14 a7 5b 08 d9 87 4f 82 b3 13 10 31 59 ad 2c 8f
6b da ef ff 59 ca 3f 5d eb e9 87 43 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
Field breakdown:
- Bytes 0-2: Magic
- Byte 3: Flags
08(HMAC) - Bytes 4-19: HMAC
- Bytes 20-27: Connection token
59 ca 3f 5d eb e9 87 43 - Bytes 28-31: Sequence number
00 00 00 00 - Bytes 32-75: Stats + timestamp placeholders (zeroed)
Vector 8: HMAC Close Request
Scenario: Close with HMAC.
Direction: Client → Server
Token: 0x4387e9eb5d3fca59, HMAC key: "testkey"
Packet (28 bytes):
14 a7 5b 0c f5 cd 0f a9 de 9d 7d 66 8d 91 a5 32
48 0e 42 e0 59 ca 3f 5d eb e9 87 43
Field breakdown:
- Bytes 0-2: Magic
- Byte 3: Flags
0c(Close | HMAC) - Bytes 4-19: HMAC
- Bytes 20-27: Connection token
Vector 9: No-Test Mode (Open+Close Request)
Scenario: Client opens and immediately closes.
Direction: Client → Server
Packet (25 bytes):
14 a7 5b 05 01 02 02 80 e0 ba 84 bf 03 03 80 a8
d6 b9 07 05 06 06 06 07 06
Field breakdown:
- Bytes 0-2: Magic
- Byte 3: Flags
05(Open | Close) - Bytes 4-24: Parameter payload
- Tag 1: ProtocolVersion = 1
- Tag 2: Duration = 60000000000 ns (60s, default)
- Tag 3: Interval = 1000000000 ns (1s, default)
- Tag 5: ReceivedStats = 3 (Both)
- Tag 6: StampAt = 3 (Both)
- Tag 7: Clock = 3 (Both)
Vector 10: No-Test Mode (Open+Close Reply)
Scenario: Server acknowledges no-test open+close.
Direction: Server → Client
Packet (33 bytes):
14 a7 5b 07 00 00 00 00 00 00 00 00 01 02 02 80
e0 ba 84 bf 03 03 80 a8 d6 b9 07 05 06 06 06 07
06
Field breakdown:
- Bytes 0-2: Magic
- Byte 3: Flags
07(Open | Reply | Close) - Bytes 4-11: Connection token
00 00 00 00 00 00 00 00(ZERO) - Bytes 12-32: Parameter payload
Notes: In no-test mode, the server returns a zero connection token. The Close flag in this context means "acknowledged close" not "rejected."
Vector 11: Minimal Echo Packet (no stats, no timestamps)
Scenario: Echo request with stats=none, tstamp=none.
Direction: Client → Server
Token: 0xa0316fa25c61154e, Seq: 0
Packet (16 bytes):
14 a7 5b 00 4e 15 61 5c a2 6f 31 a0 00 00 00 00
Field breakdown:
- Bytes 0-2: Magic
- Byte 3: Flags
00 - Bytes 4-11: Connection token
- Bytes 12-15: Sequence number
This is the absolute minimum echo packet size.
Vector 12: Midpoint Timestamps (both clocks)
Scenario: Echo reply with stats=both, tstamp=midpoint, clock=both.
Direction: Server → Client
Packet (44 bytes):
14 a7 5b 02 91 a4 1e 7a f0 14 f6 62 00 00 00 00
01 00 00 00 01 00 00 00 00 00 00 00 f7 0e 2c 93
a2 6d aa 18 5a 5f 14 47 03 00 00 00
Field breakdown:
- Bytes 0-2: Magic
- Byte 3: Flags
02(Reply) - Bytes 4-11: Token
- Bytes 12-15: Seq
00 00 00 00(0) - Bytes 16-19: Recv count
01 00 00 00(1) - Bytes 20-27: Recv window
01 00 00 00 00 00 00 00 - Bytes 28-35: Midpoint wall timestamp
- Bytes 36-43: Midpoint mono timestamp
Notes: Only midpoint timestamps present. No receive/send timestamp fields. Confirms midpoint is mutually exclusive with receive+send.