SRT provides a powerful set of statistical data on a socket. This data can be used to keep an eye on a socket’s health, and track faulty behavior.

Statistics are calculated independently on each side (receiver and sender), and are not exchanged between peers, unless explicitly stated.

The following API functions can be used to retrieve statistics on an SRT socket. Refer to the documentation of the [API functions](API-functions.md) for usage instructions.

  • int srt_bstats(SRTSOCKET u, SRT_TRACEBSTATS * perf, int clear)

  • int srt_bistats(SRTSOCKET u, SRT_TRACEBSTATS * perf, int clear, int instantaneous)

# Total accumulated measurements

## msTimeStamp

Time elapsed since the SRT socket was started (after successful call to srt_connect(…) or srt_bind(…)), in milliseconds.

## pktSentTotal

The total number of sent data packets, including retransmitted packets. Applicable for data sender.

## pktRecvTotal

The total number of received packets, including received retransmitted packets. Applicable for data receiver.

## pktSndLossTotal

The total number of data packets considered or reported lost (sender side). Does not correspond to packets detected as lost at receiving side. Applicable for data sender.

A packet is considered lost in two cases: 1. Sender receives a loss report from receiver. 2. Sender initiates retransmission after not receiving ACK for a certain timeout. Refer to FASTREXMIT and LATEREXMIT algorithms.

## pktRcvLossTotal

The total number of data packets detected lost on the receiver’s side.

Includes packets that failed to be decrypted (only as of SRT version 1.4.0).

If a packet was received out of order, the gap (sequence discontinuity) is also treated as lost packets, independent of the reorder tolerance value.

Loss detection is based on gaps in Sequence Numbers of SRT DATA packets. Detection of a packet loss is triggered by a newly received packet. An offset is calculated between sequence numbers of the newly arrived DATA packet and previously received DATA packet (the received packet with highest sequence number). Receiving older packets does not affect this value. The packets from that gap are considered lost, and that number is added to this pktRcvLossTotal measurement. In the case where the offset is negative, the packet is considered late, meaning that it was either already acknowledged or dropped by TSBPD as too late to be delivered. Such late packets are ignored.

## pktRetransTotal

The total number of retransmitted packets. Calculated on the sender’s side only. Not exchanged with the receiver.

## pktSentACKTotal

The total number of sent ACK packets. Applicable for data sender.

## pktRecvACKTotal

The total number of received ACK packets. Applicable for data receiver.

## pktSentNAKTotal

The total number of NAK (Not Acknowledged) packets sent. Essentially means LOSS reports. Applicable for data sender.

## pktRecvNAKTotal

The total number of NAK (Not Acknowledged) packets received. Essentially means LOSS reports. Applicable for data receiver.

## usSndDurationTotal

The total accumulated time in microseconds, during which the SRT sender has some data to transmit, including packets that were sent, but is waiting for acknowledgement. In other words, the total accumulated duration in microseconds when there was something to deliver (non-empty senders’ buffer). Applicable for data sender.

## pktSndDropTotal

The number of “too late to send” packets dropped by sender (refer to TLPKTDROP).

The total delay before TLPKTDROP is triggered consists of the SRTO_PEERLATENCY, plus SRTO_SNDDROPDELAY, plus 2 * the ACK interval (default ACK interval is 10 ms). The delay used is the timespan between the very first packet and the latest packet in the sender’s buffer.

## pktRcvDropTotal

The number of “too late to play” missing packets. Receiver only.

TSBPD and TLPacket drop socket option should be enabled.

The receiver drops only those packets that are missing by the time there is at least one packet ready to play.

Also includes packets that failed to be decrypted (pktRcvUndecryptTotal). These packets are present in the receiver’s buffer, and not dropped directly.

## pktRcvUndecryptTotal

The number of packets that failed to be decrypted. Receiver side.

## pktSndFilterExtraTotal

The number of control packets supplied by the packet filter (refer to [SRT Packet Filtering & FEC](packet-filtering-and-fec.md)). Sender only.

Introduced in v1.4.0.

## pktRcvFilterExtraTotal

The number of control packets received and not supplied back by the packet filter (refer to [SRT Packet Filtering & FEC](packet-filtering-and-fec.md)). Receiver only.

Introduced in v1.4.0.

## pktRcvFilterSupplyTotal

The number of packets supplied by the packet filter excluding actually received packets (e.g. FEC rebuilt). Receiver only. Refer to [SRT Packet Filtering & FEC](packet-filtering-and-fec.md).

Introduced in v1.4.0.

## pktRcvFilterLossTotal

The number of lost packets, that were not covered by the packet filter. Receiver only. Refer to [SRT Packet Filtering & FEC](packet-filtering-and-fec.md).

Introduced in v1.4.0.

## byteSentTotal

Same as pktSentTotal, but expressed in bytes, including payload and all headers (SRT+UDP+IP). 20 bytes IPv4 + 8 bytes of UDP + 16 bytes SRT header. Sender side.

## byteRecvTotal

Same as pktRecvTotal, but expressed in bytes, including payload and all headers (SRT+UDP+IP). 20 bytes IPv4 + 8 bytes of UDP + 16 bytes SRT header. Receiver side.

## byteRcvLossTotal

Same as pktRcvLossTotal, but expressed in bytes, including payload and all headers (SRT+UDP+IP). 20 bytes IPv4 + 8 bytes of UDP + 16 bytes SRT header. Receiver side.

## byteRetransTotal

Same as pktRetransTotal, but expressed in bytes, including payload and all headers (SRT+UDP+IP). 20 bytes IPv4 + 8 bytes of UDP + 16 bytes SRT header. Sender side only.

## byteSndDropTotal

Same as pktSndDropTotal, but expressed in bytes, including payload and all headers (SRT+UDP+IP). 20 bytes IPv4 + 8 bytes of UDP + 16 bytes SRT header. Sender side only.

## byteRcvDropTotal

Same as pktRcvDropTotal, but expressed in bytes, including payload and all headers (SRT+UDP+IP). Bytes for dropped packet payloads are estimated based on average packet size. 20 bytes IPv4 + 8 bytes of UDP + 16 bytes SRT header. Receiver side only.

## byteRcvUndecryptTotal

Same as pktRcvUndecryptTotal, but expressed in bytes, including payload and all headers (SRT+UDP+IP). 20 bytes IPv4 + 8 bytes of UDP + 16 bytes SRT header. Receiver side.

# Interval-based measurements

These values can be reset by calling srt_bstats(…, int clear) with clear = 1. This is helpful to get statistical measurements within a certain period, e.g. 1 second.

## pktSent

Same as pktSentTotal, but for a specified interval.

## pktRecv

Same as pktRecvTotal, but for a specified interval.

## pktSndLoss

Same as pktSndLossTotal, but for a specified interval.

## pktRcvLoss

Same as pktRcvLossTotal, but for a specified interval.

## pktRetrans

Same as pktRetransTotal, but for a specified interval.

## pktRcvRetrans

Same as pktRcvRetransTotal, but for a specified interval.

## pktSentACK

Same as pktSentACKTotal, but for a specified interval.

## pktRecvACK

Same as pktRecvACKTotal, but for a specified interval.

## pktSentNAK

Same as pktSentNAKTotal, but for a specified interval.

## pktRecvNAK

Same as pktRecvNAKTotal, but for a specified interval.

## pktSndFilterExtra

Same as pktSndFilterExtraTotal, but for a specified interval.

Introduced in v1.4.0. Refer to [SRT Packet Filtering & FEC](packet-filtering-and-fec.md).

## pktRcvFilterExtra

Same as pktRcvFilterExtraTotal, but for a specified interval.

Introduced in v1.4.0. Refer to [SRT Packet Filtering & FEC](packet-filtering-and-fec.md).

## pktRcvFilterSupply

Same as pktRcvFilterSupplyTotal, but for a specified interval.

Introduced in v1.4.0. Refer to [SRT Packet Filtering & FEC](packet-filtering-and-fec.md).

## pktRcvFilterLoss

Same as pktRcvFilterLossTotal, but for a specified interval.

Introduced in v1.4.0. Refer to [SRT Packet Filtering & FEC](packet-filtering-and-fec.md).

## mbpsSendRate

Sending rate in Mbps. Sender side.

## mbpsRecvRate

Receiving rate in Mbps. Receiver side.

## usSndDuration

Same as usSndDurationTotal, but measured on a specified interval.

## pktReorderDistance

The distance in sequence numbers between the two original (not retransmitted) packets, that were received out of order. Receiver only.

The traceable distance values are limited by the maximum reorder tolerance set by  SRTO_LOSSMAXTTL.

## pktReorderTolerance

Instant value of the packet reorder tolerance. Receiver side. Refer to [pktReorderDistance](#pktReorderDistance).

SRTO_LOSSMAXTTL sets the maximum reorder tolerance value. The value defines the maximum time-to-live for the original packet, that was received after with a gap in the sequence of incoming packets. Those missing packets are expected to come out of order, therefore no loss is reported. The actual TTL value (pktReorderTolerance) specifies the number of packets to receive further, before considering the preceding packets lost, and sending the loss report.

The internal algorithm checks the order of incoming packets and adjusts the tolerance based on the reorder distance (pktReorderTolerance), but not to a value higher than the maximum (SRTO_LOSSMAXTTL).

SRT starts from tolerance value set in SRTO_LOSSMAXTTL (initial tolerance is set to 0 in SRT v1.4.0 and prior versions). Once the receiver receives the first reordered packet, it increases the tolerance to the distance in the sequence discontinuity of the two packets. After 10 consecutive original (not retransmitted) packets come in order, the reorder distance is decreased by 1 for every such packet.

For example, assume packets with the following sequence numbers are being received: 1, 2, 4, 3, 5, 7, 6, 10, 8, 9 SRT starts from 0 tolerance. Receiving packet with sequence number 4 has a discontinuity equal to one packet. The loss is reported to the sender. With the next packet (sequence number 3) a reordering is detected. Reorder tolerance is increased to 1. The next sequence discontinuity is detected when the packet with sequence number 7 is received. The current tolerance value is 1, which is equal to the gap (between 5 and 7). No loss is reported. Next packet with sequence number 10 has a higher sequence discontinuity equal to 2. Missing packets with sequence numbers 8 and 9 will be reported lost with the next received packet (reorder distance is still at 1). The next received packet has sequence number 8. Reorder tolerance value is increased to 2. The packet with sequence number 9 is reported lost.

## pktRcvAvgBelatedTime

Accumulated difference between the current time and the time-to-play of a packet that is received late.

## pktRcvBelated

The number of packets received but IGNORED due to having arrived too late.

Makes sense only if TSBPD and TLPKTDROP are enabled.

An offset between sequence numbers of the newly arrived DATA packet and latest acknowledged DATA packet is calculated. If the offset is negative, the packet is considered late, meaning that it was either already acknowledged or dropped by TSBPD as too late to be delivered.

Retransmitted packets can also be considered late.

## pktSndDrop

Same as pktSndDropTotal, but for a specified interval.

## pktRcvDrop

Same as pktRcvDropTotal, but for a specified interval.

## pktRcvUndecrypt

Same as pktRcvUndecryptTotal, but for a specified interval.

## byteSent

Same as byteSentTotal, but for a specified interval.

## byteRecv

Same as byteRecvTotal, but for a specified interval.

## byteRcvLoss

Same as byteRcvLossTotal, but for a specified interval.

## byteRetrans

Same as byteRetransTotal, but for a specified interval.

## byteSndDrop

Same as byteSndDropTotal, but for a specified interval.

## byteRcvDrop

Same as byteRcvDropTotal, but for a specified interval.

## byteRcvUndecrypt

Same as byteRcvUndecryptTotal, but for a specified interval.

# Instant measurements

The measurements effective at the time retrieved.

## usPktSndPeriod

Current minimum time interval between which consecutive packets are sent, in microseconds. Sender only.

Note that several sockets sharing one outgoing port use the same sending queue. They may have different pacing of the outgoing packets, but all the packets will be placed in the same sending queue, which may affect the send timing.

usPktSndPeriod is the minimum time (sending period) that must be kept between two packets sent consecutively over the link used by an SRT socket. It is not the EXACT time interval between two consecutive packets. In the case where the time spent by an application between sending two consecutive packets exceeds usPktSndPeriod, the next packet will be sent faster, or even immediately, to preserve the average sending rate.

Note: Does not apply to probing packets.

## pktFlowWindow

The maximum number of packets that can be “in flight”. Sender only. See also [pktFlightSize](#pktFlightSize).

The value retrieved on the sender side represents an estimation of the amount of free space in the buffer of the peer receiver. The actual amount of available space is periodically reported back by the receiver in ACK packets. When this value drops to zero, the next packet sent will be dropped by the receiver without processing. In file mode this may cause a slowdown of sending in order to wait until the receiver has more space available, after it eventually extracts the packets waiting in its receiver buffer; in live mode the receiver buffer contents should normally occupy not more than half of the buffer size (default 8192). If pktFlowWindow value is less than that and becomes even less in the next reports, it means that the receiver application on the peer side cannot process the incoming stream fast enough and this may lead to a dropped connection.

## pktCongestionWindow

Congestion window size, in number of packets. Sender only.

Dynamically limits the maximum number of packets that can be in flight. Congestion control module dynamically changes the value.

In file mode this value starts at 16 and is increased to the number of reported acknowledged packets. This value is also updated based on the delivery rate, reported by the receiver. It represents the maximum number of packets that can be safely sent without causing network congestion. The higher this value is, the faster the packets can be sent. In live mode this field is not used.

## pktFlightSize

The number of packets in flight. Sender only.

pktFlightSize <= pktFlowWindow and pktFlightSize <= pktCongestionWindow

This is the distance between the packet sequence number that was last reported by an ACK message and the sequence number of the latest packet sent (at the moment when the statistics are being read).

NOTE: ACKs are received periodically (at least every 10 ms). This value is most accurate just after receiving an ACK and becomes a little exaggerated over time until the next ACK arrives. This is because with a new packet sent, while the ACK number stays the same for a moment, the value of pktFlightSize increases. But the exact number of packets arrived since the last ACK report is unknown. A new statistic might be added which only reports the distance between the ACK sequence and the sent sequence at the moment when an ACK arrives, and isn’t updated until the next ACK arrives. The difference between this value and pktFlightSize would then reveal the number of packets with an unknown state at that moment.

## msRTT

Calculated Round trip time (RTT), in milliseconds. Sender and Receiver. The value is calculated by the receiver based on the incoming ACKACK control packets (used by sender to acknowledge ACKs from receiver).

The RTT (Round-Trip time) is the sum of two STT (Single-Trip time) values, one from agent to peer, and one from peer to agent. Note that the measurement method is different than in TCP. SRT measures only the “reverse RTT”, that is, the time measured at the receiver between sending a UMSG_ACK message until receiving the sender’s UMSG_ACKACK response message (with the same journal). This happens to be a little different from the “forward RTT” measured in TCP, which is the time between sending a data packet of a particular sequence number and receiving UMSG_ACK with a sequence number that is later by 1. Forward RTT isn’t being measured or reported in SRT, although some research works have shown that these values, even though they should be the same, happen to differ; “reverse RTT” seems to be more optimistic.

## mbpsBandwidth

Estimated bandwidth of the network link, in Mbps. Sender only.

The bandwidth is estimated at the receiver. The estimation is based on the time between two probing DATA packets. Every 16th data packet is sent immediately after the previous data packet. By measuring the delay between probe packets on arrival, it is possible to estimate the maximum available transmission rate, which is interpreted as the bandwidth of the link. The receiver then sends back a running average calculation to the sender with an ACK message.

## byteAvailSndBuf

The available space in the sender’s buffer, in bytes. Sender only.

This value decreases with data scheduled for sending by the application, and increases with every ACK received from the receiver, after the packets are sent over the UDP link.

## byteAvailRcvBuf

The available space in the receiver’s buffer, in bytes. Receiver only.

This value increases after the application extracts the data from the socket (uses one of srt_recv* functions) and decreases with every packet received from the sender over the UDP link.

## mbpsMaxBW

Transmission bandwidth limit, in Mbps. Sender only. Usually this is the setting from the SRTO_MAXBW option, which may include the value 0 (unlimited). Under certain conditions a nonzero value might be be provided by a congestion control module, although none of the built-in congestion control modules currently use it.

Refer to SRTO_MAXBW and SRTO_INPUTBW in [API.md](API.md).

## byteMSS

Maximum Segment Size (MSS), in bytes. Same as the value from the SRTO_MSS socket option. Should not exceed the size of the maximum transmission unit (MTU), in bytes. Sender and Receiver. The default size of the UDP packet used for transport, including all possible headers (Ethernet, IP and UDP), is 1500 bytes.

Refer to SRTO_MSS in [API.md](API.md).

## pktSndBuf

The number of packets in the sender’s buffer that are already scheduled for sending or even possibly sent, but not yet acknowledged. Sender only.

Once the receiver acknowledges the receipt of a packet, or the TL packet drop is triggered, the packet is removed from the sender’s buffer. Until this happens, the packet is considered as unacknowledged.

A moving average value is reported when the value is retrieved by calling srt_bstats(…) or srt_bistats(SRTSOCKET u, SRT_TRACEBSTATS * perf, int clear, int instantaneous) with instantaneous=false.

The current state is returned if srt_bistats(…) is called with instantaneous=true.

## byteSndBuf

Instantaneous (current) value of pktSndBuf, but expressed in bytes, including payload and all headers (SRT+UDP+IP). 20 bytes IPv4 + 8 bytes of UDP + 16 bytes SRT header. Sender side.

## msSndBuf

The timespan (msec) of packets in the sender’s buffer (unacknowledged packets). Sender only.

A moving average value is reported when the value is retrieved by calling srt_bstats(…) or srt_bistats(SRTSOCKET u, SRT_TRACEBSTATS * perf, int clear, int instantaneous) with instantaneous=false.

The current state is returned if srt_bistats(…) is called with instantaneous=true.

## msSndTsbPdDelay

Timestamp-based Packet Delivery Delay value of the peer. If SRTO_TSBPDMODE is on (default for live mode), it returns the value of SRTO_PEERLATENCY, otherwise 0. The sender reports the TSBPD delay value of the receiver. The receiver reports the TSBPD delay of the sender.

## pktRcvBuf

The number of acknowledged packets in receiver’s buffer. Receiver only.

This measurement does not include received but not acknowledged packets, stored in the receiver’s buffer.

A moving average value is reported when the value is retrieved by calling srt_bstats(…) or srt_bistats(SRTSOCKET u, SRT_TRACEBSTATS * perf, int clear, int instantaneous) with instantaneous=false.

The current state is returned if srt_bistats(…) is called with instantaneous=true.

## byteRcvBuf

Instantaneous (current) value of pktRcvBuf, expressed in bytes, including payload and all headers (SRT+UDP+IP). 20 bytes IPv4 + 8 bytes of UDP + 16 bytes SRT header. Receiver side.

## msRcvBuf

The timespan (msec) of acknowledged packets in the receiver’s buffer. Receiver side.

If TSBPD mode is enabled (defualt for live mode), a packet can be acknowledged, but not yet ready to play. This range includes all packets regardless of whether they are ready to play or not.

A moving average value is reported when the value is retrieved by calling srt_bstats(…) or srt_bistats(SRTSOCKET u, SRT_TRACEBSTATS * perf, int clear, int instantaneous) with instantaneous=false.

The current state is returned if srt_bistats(…) is called with instantaneous=true.

Instantaneous value is only reported if TSBPD mode is enabled, otherwise 0 is reported (see #900).

## msRcvTsbPdDelay

Timestamp-based Packet Delivery Delay value set on the socket via SRTO_RCVLATENCY or SRTO_LATENCY. The value is used to apply TSBPD delay for reading the received data on the socket. Receiver side.

If SRTO_TSBPDMODE is off (default for file mode), 0 is returned.