Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
The SACK packet is used to selectively acknowledge outstanding packets. Packet acknowledgment (ACK) is typically bundled in all user data packets using the bSeq and bNRec fields found in the data frame (DFRAME) header. However, the SACK packet is used when a dedicated ACK is requested (that is, when the PACKET_COMMAND_POLL bit in the bCommand header field is set) or when no user data remains for further bundled ACKs.
|
|
|
|
|
|
|
|
|
|
1 |
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
|
3 |
|
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
bCommand |
bExtOpCode |
bFlags |
bRetry |
||||||||||||||||||||||||||||
bNSeq |
bNRcv |
wPadding |
|||||||||||||||||||||||||||||
tTimestamp |
|||||||||||||||||||||||||||||||
dwSACKMask1 (optional) |
|||||||||||||||||||||||||||||||
dwSACKMask2 (optional) |
|||||||||||||||||||||||||||||||
dwSendMask1 (optional) |
|||||||||||||||||||||||||||||||
dwSendMask2 (optional) |
|||||||||||||||||||||||||||||||
ullSignature (optional) |
|||||||||||||||||||||||||||||||
... |
bCommand (1 byte): The command-code bitmask that contains bitwise OR values from the following table. The PACKET_COMMAND_CFRAME flag MUST be set. The PACKET_COMMAND_POLL flag SHOULD NOT be set and SHOULD be ignored on receipt. All other bits MUST be set to zero and the packet MUST be ignored if they are not.
-
Value
Meaning
0x80
PACKET_COMMAND_CFRAME (command frame (CFRAME))
0x08
PACKET_COMMAND_POLL (acknowledge immediately)
bExtOpCode (1 byte): An extended operation code. It MUST be set to the following value:
-
Value
Meaning
0x06
FRAME_EXOPCODE_SACK
bFlags (1 byte): A status flag or flags. The value can be one or more of the following values. All other bits MUST be set to zero. The SACK_FLAGS_RESPONSE flag SHOULD be set and bRetry SHOULD be filled in properly.
-
Value
Meaning
0x01
SACK_FLAGS_RESPONSE (bRetry field is valid).
0x02
SACK_FLAGS_SACK_MASK1 (low 32 bits of the SACK mask are present in dwSACKMask1).
0x04
SACK_FLAGS_SACK_MASK2 (high 32 bits of the SACK mask are present in dwSACKMask2).
0x08
SACK_FLAGS_SEND_MASK1 (low 32 bits of the send mask are present in dwSendMask1).
0x10
SACK_FLAGS_SEND_MASK2 (high 32 bits of the send mask are present in dwSendMask2).
bRetry (1 byte): Indicates whether the last received packet was a retry. This value MUST be ignored if SACK_FLAGS_RESPONSE is not set. The value SHOULD be set to zero if the last received DFRAME for the connection was not marked as a retry; otherwise, the value SHOULD be nonzero. Recipients MUST NOT require that any particular bit or bits be set in the nonzero case—only that at least one bit is set.
bNSeq (1 byte): This field represents the sequence number of the next DFRAME to send. SACK packets do not have sequence numbers of their own.
bNRcv (1 byte): The expected sequence number of the next packet received. If the SACK_FLAGS_SACK_MASK1 or SACK_FLAGS_SACK_MASK2 flag is set, the bNRcv field is supplemented with the corresponding additional dwSACKMask1 or dwSACKMask2 bitmask field that selectively acknowledges frames with sequence numbers higher than bNRcv.
wPadding (2 bytes): This SHOULD be set to zero when sent and MUST be ignored on receipt.
tTimestamp (4 bytes): The sender's computer system tick count, in millisecond units, specified in little-endian byte order.
dwSACKMask1 (4 bytes): The optional low 32 bits of the SACK mask, in little-endian byte order. The existence of this field in the packet is dependent upon the bFlags field having SACK_FLAGS_SACK_MASK1 set.
dwSACKMask2 (4 bytes): The optional high 32 bits of the SACK mask, in little-endian byte order. The existence of this field in the packet is dependent upon the bFlags field having SACK_FLAGS_SACK_MASK2 set.
dwSendMask1 (4 bytes): The optional low 32 bits of the send mask, in little-endian byte order. The existence of this field in the packet is dependent upon the bFlags field having SACK_FLAGS_SEND_MASK1 set.
dwSendMask2 (4 bytes): The optional high 32 bits of the send mask, in little-endian byte order. The existence of this field in the packet is dependent upon the bFlags field having SACK_FLAGS_SEND_MASK2 set.
ullSignature (8 bytes): If the connection was established using signing, this MUST be the signature of the packet using the agreed-upon signing algorithm. The packet sequence ID to be used in the calculation is the value in bNSeq. This field MUST NOT be present if signing is not enabled for the connection.