ndt5 Data - NDT (Network Diagnostic Tool)

Current

ndt5 Data - NDT (Network Diagnostic Tool)#

Since M-Lab’s platform upgrade in 2019, the ndt5 protocol continues to support many NDT clients that used earlier NDT protocol versions. Measurements from the ndt5 protocol are based on TCP INFO instrumentation.

Ending Support and Transition to ndt7#

As of January 2024, we will no longer support ndt5+raw protocol due to our added support for admission control and transition to including virtual servers in the M-Lab platform. You can read more about about the transition on our blog.

While support ndt5+ws and ndt5+wss will remain available, new and existing client integrations are strongly encouraged to use the ndt7 protocol for better support, ease of integration, and client performance.

ndt5 data in Cloud Storage#

ndt5 BigQuery Schema#

Field nameTypeDescription
idSTRINGA unique id for this test. For rows with an S2C (download) or C2S (upload) measurement, this is the UUID of that measurement. For rows without either S2C or C2s, this is the UUID of the Control channel.
aRECORDFields summarizing or derived from the raw data.
a.UUIDSTRINGUUID for TCP connection.
a.TestTimeTIMESTAMPThe date and time of the measurement in UTC.
a.CongestionControlSTRINGThe congestion control algorithm used for connection.
a.MeanThroughputMbpsFLOATThe measured rate as calculated by the server. Presented in megabits per second, or Mbit/s, this value is the average of tcp-info snapshots taken at the beginning and end of an ndt7 measurement. Therefore it is identified as “MeanThroughputMbps”.
a.MinRTTFLOATThe minimum Round Trip Time observed during the measurement, recorded in milliseconds. Derived from TCPInfo.MinRTT after 2020-06-18.
a.LossRateFLOATLoss rate from the lifetime of the connection.
parserRECORDMetadata about how the parser processed this measurement row.
parser.VersionSTRINGVersion is the symbolic version (if any) of the running server code that produced this measurement.
parser.TimeTIMESTAMPThe time that the parser processed this row.
parser.ArchiveURLSTRINGThe Google Cloud Storage URL to the archive containing the Filename for this row.
parser.FilenameSTRINGThe name of the file within the ArchiveURL originally created by the measurement service. Results in the raw record are derived from measurements in this file.
parser.PriorityINTEGER
parser.GitCommitSTRINGThe git commit of this build of the parser.
parser.ArchiveSizeINTEGERThe original archive size as found in GCS.
parser.FileSizeINTEGERThe size of the file data provided to the parser for this row.
dateDATEDate is used by BigQuery to partition data to improve query performance.
rawRECORDFields from the raw data.
raw.GitShortCommitSTRINGGitShortCommit is the Git commit (short form) of the running server code that produced this measurement.
raw.VersionSTRINGVersion is the symbolic version (if any) of the running server code.
raw.ServerIPSTRINGThe IP address assigned to the M-Lab server that conducted the measurement.
raw.ServerPortINTEGERThe port used by the server to conduct the measurement.
raw.ClientIPSTRINGThe IP address assigned to the client that conducted the measurement.
raw.ClientPortINTEGERThe port used by the client to conduct the measurement.
raw.StartTimeTIMESTAMPThe date and time when the measurement began in UTC.
raw.EndTimeTIMESTAMPThe date and time when the measurement ended in UTC.
raw.ControlRECORDMetadata for TCP connections to the NDT5 control channel. All NDT5 measurements have a control channel.
raw.Control.UUIDSTRINGThe Universally Unique Identifier for the measurement’s control channel.
raw.Control.ProtocolSTRINGThe protocol used for S2C and C2S measurements. Values include WS, WSS, and PLAIN.
raw.Control.MessageProtocolSTRINGIndividual messages are sent with the MessageProtocol. Values include JSON, TLV.
raw.Control.ClientMetadataRECORDClient-reported metadata as name/value pairs.
raw.Control.ClientMetadata.NameSTRINGIf set, contains text that identifies and provides context for the corresponding metadata value. For example, “OS” or “clientApplication”
raw.Control.ClientMetadata.ValueSTRINGIf set, contains a value corresponding to metadata name. For example, “Windows 10” or “ndtJS”
raw.Control.ServerMetadataRECORDAuthoritative metadata added by the server configuration.
raw.Control.ServerMetadata.NameSTRINGIf set, contains the name of a single piece of metadata. This name will be the same for all measurements collected while this server was running with this configuration.
raw.Control.ServerMetadata.ValueSTRINGIf name is set, contains the text of a server configuration value. This value will be the same for all measurements collected while this server was running with this configuration.
raw.C2SRECORDMetadata for Client-to-Server (upload) measurements performed using the ndt5 protocol.
raw.C2S.ServerIPSTRINGThe IP address assigned to the M-Lab server that conducted the measurement.
raw.C2S.ServerPortINTEGERThe port used by the server to conduct the measurement.
raw.C2S.ClientIPSTRINGThe IP address assigned to the client that conducted the measurement.
raw.C2S.ClientPortINTEGERThe port used by the client to conduct the measurement.
raw.C2S.UUIDSTRINGThe Universally Unique Identifier assigned to the meeasurement.
raw.C2S.StartTimeTIMESTAMPThe date and time when the measurement began in UTC.
raw.C2S.EndTimeTIMESTAMPThe date and time when the measurement ended in UTC.
raw.C2S.MeanThroughputMbpsFLOATThe measured rate as calculated by the server. Presented in megabits per second, or Mbit/s, this value is the average of tcp-info snapshots taken at the beginning and end of an ndt5 measurement. Therefore it is identified as “MeanThroughputMbps”.
raw.C2S.ErrorSTRINGAny error message(s) recorded during a measurement.
raw.S2CRECORDMetadata for Server-to-Client (download) measurements performed using the ndt5 protocol.
raw.S2C.UUIDSTRINGThe Universally Unique Identifier assigned to the meeasurement.
raw.S2C.ServerIPSTRINGThe IP address assigned to the M-Lab server that conducted the measurement.
raw.S2C.ServerPortINTEGERThe port used by the server to conduct the measurement.
raw.S2C.ClientIPSTRINGThe IP address assigned to the client that conducted the measurement.
raw.S2C.ClientPortINTEGERThe port used by the client to conduct the measurement.
raw.S2C.StartTimeTIMESTAMPThe date and time when the measurement began in UTC.
raw.S2C.EndTimeTIMESTAMPThe date and time when the measurement ended in UTC.
raw.S2C.MeanThroughputMbpsFLOATThe measured rate as calculated by the server. Presented in megabits per second, or Mbit/s, this value is the average of tcp-info snapshots taken at the beginning and end of an ndt5 measurement. Therefore it is identified as “MeanThroughputMbps”.
raw.S2C.MinRTTINTEGERThe application measured minimum observed round trip time, recorded in nanoseconds.
raw.S2C.MaxRTTINTEGERThe application measured maximum sampled round trip time, recorded in nanoseconds.
raw.S2C.SumRTTINTEGERThe sum of all sampled round trip times, recorded in nanoseconds.
raw.S2C.CountRTTINTEGERThe number of round trip time samples included in S2C.SumRTT.
raw.S2C.ClientReportedMbpsFLOATThe download rate as calculated by the client, in megabits per second, or Mbit/s. Not all clients report this value.
raw.S2C.TCPInfoRECORDThe TCPInfo record provides results from the TCP_INFO netlink socket. These are the same values returned to clients at the end of the download (S2C) measurement.
raw.S2C.TCPInfo.StateINTEGERTCP state is nominally 1 (Established). Other values reflect transient states having incomplete rows.
Kernel: See TCP_ESTABLISHED in include/net/tcp_states.h
raw.S2C.TCPInfo.CAStateINTEGERLoss recovery state machine. For traditional loss based congestion control algorithms, CAState is also used to control window adjustments.
Kernel: tcp_set_ca_state in include/net/tcp.h
raw.S2C.TCPInfo.RetransmitsINTEGERNumber of timeouts (RTO based retransmissions) at this sequence. Reset to zero on forward progress.
Kernel: icsk_retransmits in include/net/inet_connection_sock.h
raw.S2C.TCPInfo.ProbesINTEGERConsecutive zero window probes that have gone unanswered.
Kernel: icsk_probes_out in include/net/inet_connection_sock.h
raw.S2C.TCPInfo.BackoffINTEGERExponential timeout backoff counter. Increment on RTO, reset on successful RTT measurements.
Kernel: icsk_backoff in include/net/inet_connection_sock.h
raw.S2C.TCPInfo.OptionsINTEGERBit encoded SYN options and other negotiations TIMESTAMPS 0x1; SACK 0x2; WSCALE 0x4; ECN 0x8 - Was negotiated; ECN_SEEN - At least one ECT seen; SYN_DATA - SYN-ACK acknowledged data in SYN sent or rcvd.
Kernel: TCPI_OPT_TIMESTAMPS in include/uapi/linux/tcp.h
raw.S2C.TCPInfo.WScaleINTEGERBUG Conflation of SndWScale and RcvWScale. See github.com/m-lab/etl/issues/790
raw.S2C.TCPInfo.AppLimitedINTEGERFlag indicating that rate measurements reflect non-network bottlenecks. Note that even very short application stalls invalidate max_BW measurements.
Kernel: rate_app_limited in include/linux/tcp.h
raw.S2C.TCPInfo.RTOINTEGERRetransmission Timeout. Quantized to system jiffies.
Kernel: icsk_rto in include/net/inet_connection_sock.h
raw.S2C.TCPInfo.ATOINTEGERDelayed ACK Timeout. Quantized to system jiffies.
Kernel: ato in icsk_ack in include/net/inet_connection_sock.h
raw.S2C.TCPInfo.SndMSSINTEGERCurrent Maximum Segment Size. Note that this can be smaller than the negotiated MSS for various reasons.
Kernel: mss_cache in include/linux/tcp.h
raw.S2C.TCPInfo.RcvMSSINTEGERMaximum observed segment size from the remote host. Used to trigger delayed ACKs.
Kernel: rcv_mss in icsk_ack in include/net/inet_connection_sock.h
raw.S2C.TCPInfo.UnackedINTEGERNumber of segments between snd.nxt and snd.una. Accounting for the Pipe algorithm.
Kernel: packets_out in include/linux/tcp.h
raw.S2C.TCPInfo.SackedINTEGERScoreboard segment marked SACKED by sack blocks. Accounting for the Pipe algorithm.
Kernel: sacked_out in include/linux/tcp.h
raw.S2C.TCPInfo.LostINTEGERScoreboard segments marked lost by loss detection heuristics. Accounting for the Pipe algorithm.
Kernel: lost_out in include/linux/tcp.h
raw.S2C.TCPInfo.RetransINTEGERScoreboard segments marked retransmitted. Accounting for the Pipe algorithm.
Kernel: retrans_out in include/linux/tcp.h
raw.S2C.TCPInfo.FacketsINTEGER
raw.S2C.TCPInfo.LastDataSentINTEGERTime since last data segment was sent. Quantized to jiffies.
Kernel: lsndtime in include/linux/tcp.h
raw.S2C.TCPInfo.LastAckSentINTEGERTime since last ACK was sent (not implemented). Present in TCP_INFO but not elsewhere in the kernel.
raw.S2C.TCPInfo.LastDataRecvINTEGERTime since last data segment was received. Quantized to jiffies.
Kernel: lrcvtime in icsk_ack in include/net/inet_connection_sock.h
raw.S2C.TCPInfo.LastAckRecvINTEGER
raw.S2C.TCPInfo.PMTUINTEGERMaximum IP Transmission Unit for this path.
Kernel: icsk_pmtu_cookie in include/net/inet_connection_sock.h
raw.S2C.TCPInfo.RcvSsThreshINTEGERCurrent Window Clamp. Receiver algorithm to avoid allocating excessive receive buffers.
Kernel: rcv_ssthresh in include/linux/tcp.h
raw.S2C.TCPInfo.RTTINTEGERSmoothed Round Trip Time (RTT). The Linux implementation differs from the standard.
Kernel: srtt_us in include/linux/tcp.h
raw.S2C.TCPInfo.RTTVarINTEGERRTT variance. The Linux implementation differs from the standard.
Kernel: mdev_us in include/linux/tcp.h
raw.S2C.TCPInfo.SndSsThreshINTEGERSlow Start Threshold. Value controlled by the selected congestion control algorithm.
Kernel: snd_ssthresh in include/linux/tcp.h
raw.S2C.TCPInfo.SndCwndINTEGERCongestion Window. Value controlled by the selected congestion control algorithm.
Kernel: snd_cwnd in include/linux/tcp.h
raw.S2C.TCPInfo.AdvMSSINTEGERAdvertised MSS.
Kernel: advmss in include/linux/tcp.h
raw.S2C.TCPInfo.ReorderingINTEGERMaximum observed reordering distance.
Kernel: reordering in include/linux/tcp.h
raw.S2C.TCPInfo.RcvRTTINTEGERReceiver Side RTT estimate.
Kernel: rcv_rtt_est.rtt_us in include/linux/tcp.h
raw.S2C.TCPInfo.RcvSpaceINTEGERSpace reserved for the receive queue. Typically updated by receiver side auto-tuning.
Kernel: space in rcvq_space in include/linux/tcp.h
raw.S2C.TCPInfo.TotalRetransINTEGERTotal number of segments containing retransmitted data.
Kernel: total_retrans in include/linux/tcp.h
raw.S2C.TCPInfo.PacingRateINTEGERCurrent Pacing Rate, nominally updated by congestion control.
Kernel: sk_pacing_rate in include/net/sock.h
raw.S2C.TCPInfo.MaxPacingRateINTEGERSettable pacing rate clamp. Set with setsockopt( ..SO_MAX_PACING_RATE.. ).
Kernel: sk_max_pacing_rate in include/net/sock.h
raw.S2C.TCPInfo.BytesAckedINTEGERThe number of data bytes for which cumulative acknowledgments have been received.
Kernel: bytes_acked in include/linux/tcp.h
raw.S2C.TCPInfo.BytesReceivedINTEGERThe number of data bytes for which have been received.
Kernel: bytes_received in include/linux/tcp.h
raw.S2C.TCPInfo.SegsOutINTEGERThe number of segments transmitted. Includes data and pure ACKs.
Kernel: segs_out in include/linux/tcp.h
raw.S2C.TCPInfo.SegsInINTEGERThe number of segments received. Includes data and pure ACKs.
Kernel: segs_in in include/linux/tcp.h
raw.S2C.TCPInfo.NotsentBytesINTEGERNumber of bytes queued in the send buffer that have not been sent.
Kernel: tcpi_notsent_bytes() in net/ipv4/tcp.c
raw.S2C.TCPInfo.MinRTTINTEGERMinimum Round Trip Time. From an older, pre-BBR algorithm. Recorded in microseconds.
Kernel: tcp_min_rtt in include/net/tcp.h
raw.S2C.TCPInfo.DataSegsInINTEGERInput segments carrying data (len>0).
Kernel: data_segs_in in include/net/tcp.h
raw.S2C.TCPInfo.DataSegsOutINTEGERTransmitted segments carrying data (len>0).
Kernel: data_segs_out in include/net/tcp.h
raw.S2C.TCPInfo.DeliveryRateINTEGERObserved Maximum Delivery Rate.
Kernel: tcp_compute_delivery_rate() in net/ipv4/tcp.c
raw.S2C.TCPInfo.BusyTimeINTEGERTime with outstanding (unacknowledged) data. Time when snd.una is not equal to snd.next.
Kernel: tcp_get_info_chrono_stats() in net/ipv4/tcp.c
raw.S2C.TCPInfo.RWndLimitedINTEGERTime spend waiting for receiver window.
Kernel: tcp_get_info_chrono_stats() in net/ipv4/tcp.c
raw.S2C.TCPInfo.SndBufLimitedINTEGERTime spent waiting for sender buffer space. This only includes the time when TCP transmissions are starved for data, but the application has been stopped because the buffer is full and can not be grown for some reason.
Kernel: tcp_get_info_chrono_stats() in net/ipv4/tcp.c
raw.S2C.TCPInfo.DeliveredINTEGERData segments delivered to the receiver including retransmits. As reported by returning ACKs, used by ECN.
Kernel: delivered in include/linux/tcp.h
raw.S2C.TCPInfo.DeliveredCEINTEGERECE marked data segments delivered to the receiver including retransmits. As reported by returning ACKs, used by ECN.
Kernel: delivered_ce in include/linux/tcp.h
raw.S2C.TCPInfo.BytesSentINTEGERPayload bytes sent (excludes headers, includes retransmissions).
Kernel: bytes_sent
raw.S2C.TCPInfo.BytesRetransINTEGERBytes retransmitted. May include headers and new data carried with a retransmission (for thin flows).
Kernel: bytes_retrans
raw.S2C.TCPInfo.DSackDupsINTEGERDuplicate segments reported by DSACK. Not reported by some Operating Systems.
Kernel: dsack_dups
raw.S2C.TCPInfo.ReordSeenINTEGERReceived ACKs that were out of order. Estimates reordering on the return path.
Kernel: reord_seen
raw.S2C.TCPInfo.RcvOooPackINTEGER
raw.S2C.TCPInfo.SndWndINTEGER
raw.S2C.ErrorSTRINGAny error message(s) recorded during a measurement.