web100 - NDT (Network Diagnostic Tool)

web100 was the NDT protocol used by M-Lab until November 2019. As a part of M-Lab’s platform upgrade, ndt-server replaced the now deprecated web100-based NDT server. The new server provides the ndt5 protocol for backward compatibility with current clients, and will add the ndt7 protocol for future client use.

NDT data using the web100 protocol was collected using the Web100 Linux kernel patch to provide access to a rich set of TCP information for each NDT test.

web100 NDT data can be found in the NDT web100 dataset.

Web100 Field Types and BigQuery Equivalents

Web100 fields were defined by the original working group in the file tcp-kis.txt. This file defines each Web100 variable with a specific SNMP type. The table below shows how to map each SNMP type to a BigQuery type.

BigQuery Type Corresponding SNMP Type
integer Integer32, Integer, INTEGER, Gauge32, ZeroBasedCounter32, Unsigned32, Unsigned16, Counter32, ZeroBasedCounter64
string Ip_Address
bool TruthValue

Blacklist Flags Field

The field blacklist_flags was used to mark test affected by the “switch discard issue” identified in 2015-2016. M-Lab NDT data from 2010-01-01 to 2015-10-02 was marked using this field. M-Lab may use the field for other use cases in the future for tests potentially impacted by site configuration issues, or otherwise communicate potentially relevant information about the state of the platform at the time of the test.

Currently, the following values are present in NDT data from 2010-01-01 to 2015-10-02 in these fields:

Field Name Value Description
blacklist_flags or anomalies.blacklist_flags 0 or NULL unaffected tests
  1 tests affected by switch discards
  2 tests not shown to be unaffected by switch discards

Querying Historical NDT web100 Data

M-Lab recommends querying NDT web100 data using our “unified” views:

  • measurement-lab.ndt.unified_downloads
  • measurement-lab.ndt.unified_uploads

These views contain a field called node_instruments, which will contain web100 if collected using the now deprecated web100 ndt server.

However, some researchers may wish to query this data directly. If this is desired, please refer to the schema and subsequent sections below, querying the table:

  • measurement-lab.ndt.web100

web100 NDT BigQuery Schema

Field name Type Description
partition_date DATE  
test_id STRING  
task_filename STRING  
parse_time TIMESTAMP  
parser_version STRING  
log_time TIMESTAMP  
blacklist_flags INTEGER  
anomalies RECORD  
anomalies. no_meta BOOLEAN  
anomalies. snaplog_error BOOLEAN  
anomalies. num_snaps INTEGER  
anomalies. blacklist_flags INTEGER  
connection_spec RECORD  
connection_spec. client_af INTEGER  
connection_spec. client_application STRING  
connection_spec. client_browser STRING  
connection_spec. client_hostname STRING  
connection_spec. client_ip STRING  
connection_spec. client_kernel_version STRING  
connection_spec. client_os STRING  
connection_spec. client_version STRING  
connection_spec. data_direction INTEGER  
connection_spec. server_af INTEGER  
connection_spec. server_hostname STRING  
connection_spec. server_ip STRING  
connection_spec. server_kernel_version STRING  
connection_spec. tls BOOLEAN  
connection_spec. websockets BOOLEAN  
connection_spec. client_geolocation RECORD  
connection_spec.client_geolocation. area_code INTEGER  
connection_spec.client_geolocation. city STRING  
connection_spec.client_geolocation. continent_code STRING  
connection_spec.client_geolocation. country_code STRING  
connection_spec.client_geolocation. country_code3 STRING  
connection_spec.client_geolocation. country_name STRING  
connection_spec.client_geolocation. latitude FLOAT  
connection_spec.client_geolocation. longitude FLOAT  
connection_spec.client_geolocation. metro_code INTEGER  
connection_spec.client_geolocation. postal_code STRING  
connection_spec.client_geolocation. region STRING  
connection_spec.client_geolocation. radius INTEGER  
connection_spec. server_geolocation RECORD  
connection_spec.server_geolocation. area_code INTEGER  
connection_spec.server_geolocation. city STRING  
connection_spec.server_geolocation. continent_code STRING  
connection_spec.server_geolocation. country_code STRING  
connection_spec.server_geolocation. country_code3 STRING  
connection_spec.server_geolocation. country_name STRING  
connection_spec.server_geolocation. latitude FLOAT  
connection_spec.server_geolocation. longitude FLOAT  
connection_spec.server_geolocation. metro_code INTEGER  
connection_spec.server_geolocation. postal_code STRING  
connection_spec.server_geolocation. region STRING  
connection_spec.server_geolocation. radius INTEGER  
connection_spec. client RECORD  
connection_spec.client. network RECORD  
connection_spec.client.network. asn STRING  
connection_spec. server RECORD  
connection_spec.server. iata_code STRING  
connection_spec.server. network RECORD  
connection_spec.server.network. asn STRING  
web100_log_entry RECORD  
web100_log_entry. log_time INTEGER  
web100_log_entry. version STRING  
web100_log_entry. connection_spec RECORD  
web100_log_entry.connection_spec. local_af INTEGER  
web100_log_entry.connection_spec. local_ip STRING  
web100_log_entry.connection_spec. local_port INTEGER  
web100_log_entry.connection_spec. remote_ip STRING  
web100_log_entry.connection_spec. remote_port INTEGER  
web100_log_entry. snap RECORD  
web100_log_entry.snap. AbruptTimeouts INTEGER  
web100_log_entry.snap. ActiveOpen INTEGER  
web100_log_entry.snap. CERcvd INTEGER  
web100_log_entry.snap. CongAvoid INTEGER  
web100_log_entry.snap. CongOverCount INTEGER  
web100_log_entry.snap. CongSignals INTEGER  
web100_log_entry.snap. CountRTT INTEGER  
web100_log_entry.snap. CurAppRQueue INTEGER  
web100_log_entry.snap. CurAppWQueue INTEGER  
web100_log_entry.snap. CurCwnd INTEGER  
web100_log_entry.snap. CurMSS INTEGER  
web100_log_entry.snap. CurRTO INTEGER  
web100_log_entry.snap. CurReasmQueue INTEGER  
web100_log_entry.snap. CurRetxQueue INTEGER  
web100_log_entry.snap. CurRwinRcvd INTEGER  
web100_log_entry.snap. CurRwinSent INTEGER  
web100_log_entry.snap. CurSsthresh INTEGER  
web100_log_entry.snap. CurTimeoutCount INTEGER  
web100_log_entry.snap. DSACKDups INTEGER  
web100_log_entry.snap. DataSegsIn INTEGER  
web100_log_entry.snap. DataSegsOut INTEGER  
web100_log_entry.snap. DupAcksIn INTEGER  
web100_log_entry.snap. DupAcksOut INTEGER  
web100_log_entry.snap. Duration INTEGER  
web100_log_entry.snap. ECN INTEGER  
web100_log_entry.snap. FastRetran INTEGER  
web100_log_entry.snap. HCDataOctetsIn INTEGER  
web100_log_entry.snap. HCDataOctetsOut INTEGER  
web100_log_entry.snap. HCThruOctetsAcked INTEGER  
web100_log_entry.snap. HCThruOctetsReceived INTEGER  
web100_log_entry.snap. LimCwnd INTEGER  
web100_log_entry.snap. LimRwin INTEGER  
web100_log_entry.snap. LocalAddress STRING  
web100_log_entry.snap. LocalAddressType INTEGER  
web100_log_entry.snap. LocalPort INTEGER  
web100_log_entry.snap. MSSRcvd INTEGER  
web100_log_entry.snap. MaxAppRQueue INTEGER  
web100_log_entry.snap. MaxAppWQueue INTEGER  
web100_log_entry.snap. MaxMSS INTEGER  
web100_log_entry.snap. MaxRTO INTEGER  
web100_log_entry.snap. MaxRTT INTEGER  
web100_log_entry.snap. MaxReasmQueue INTEGER  
web100_log_entry.snap. MaxRetxQueue INTEGER  
web100_log_entry.snap. MaxRwinRcvd INTEGER  
web100_log_entry.snap. MaxRwinSent INTEGER  
web100_log_entry.snap. MaxSsCwnd INTEGER  
web100_log_entry.snap. MaxSsthresh INTEGER  
web100_log_entry.snap. MinMSS INTEGER  
web100_log_entry.snap. MinRTO INTEGER  
web100_log_entry.snap. MinRTT INTEGER  
web100_log_entry.snap. MinRwinRcvd INTEGER  
web100_log_entry.snap. MinRwinSent INTEGER  
web100_log_entry.snap. MinSsthresh INTEGER  
web100_log_entry.snap. Nagle INTEGER  
web100_log_entry.snap. NonRecovDA INTEGER  
web100_log_entry.snap. OctetsRetrans INTEGER  
web100_log_entry.snap. OtherReductions INTEGER  
web100_log_entry.snap. PostCongCountRTT INTEGER  
web100_log_entry.snap. PostCongSumRTT INTEGER  
web100_log_entry.snap. PreCongSumCwnd INTEGER  
web100_log_entry.snap. PreCongSumRTT INTEGER  
web100_log_entry.snap. QuenchRcvd INTEGER  
web100_log_entry.snap. RTTVar INTEGER  
web100_log_entry.snap. RcvNxt INTEGER  
web100_log_entry.snap. RcvRTT INTEGER  
web100_log_entry.snap. RcvWindScale INTEGER  
web100_log_entry.snap. RecInitial INTEGER  
web100_log_entry.snap. RemAddress STRING  
web100_log_entry.snap. RemPort INTEGER  
web100_log_entry.snap. RetranThresh INTEGER  
web100_log_entry.snap. SACK INTEGER  
web100_log_entry.snap. SACKBlocksRcvd INTEGER  
web100_log_entry.snap. SACKsRcvd INTEGER  
web100_log_entry.snap. SampleRTT INTEGER  
web100_log_entry.snap. SegsIn INTEGER  
web100_log_entry.snap. SegsOut INTEGER  
web100_log_entry.snap. SegsRetrans INTEGER  
web100_log_entry.snap. SendStall INTEGER  
web100_log_entry.snap. SlowStart INTEGER  
web100_log_entry.snap. SmoothedRTT INTEGER  
web100_log_entry.snap. SndInitial INTEGER  
web100_log_entry.snap. SndLimBytesCwnd INTEGER  
web100_log_entry.snap. SndLimBytesRwin INTEGER  
web100_log_entry.snap. SndLimBytesSender INTEGER  
web100_log_entry.snap. SndLimTimeCwnd INTEGER  
web100_log_entry.snap. SndLimTimeRwin INTEGER  
web100_log_entry.snap. SndLimTimeSnd INTEGER  
web100_log_entry.snap. SndLimTransCwnd INTEGER  
web100_log_entry.snap. SndLimTransRwin INTEGER  
web100_log_entry.snap. SndLimTransSnd INTEGER  
web100_log_entry.snap. SndMax INTEGER  
web100_log_entry.snap. SndNxt INTEGER  
web100_log_entry.snap. SndUna INTEGER  
web100_log_entry.snap. SndWindScale INTEGER  
web100_log_entry.snap. SpuriousFrDetected INTEGER  
web100_log_entry.snap. StartTimeStamp INTEGER  
web100_log_entry.snap. StartTimeUsec INTEGER  
web100_log_entry.snap. State INTEGER  
web100_log_entry.snap. SubsequentTimeouts INTEGER  
web100_log_entry.snap. SumRTT INTEGER  
web100_log_entry.snap. TimeStamps INTEGER  
web100_log_entry.snap. Timeouts INTEGER  
web100_log_entry.snap. WinScaleRcvd INTEGER  
web100_log_entry.snap. WinScaleSent INTEGER  
web100_log_entry.snap. X_OtherReductionsCM INTEGER  
web100_log_entry.snap. X_OtherReductionsCV INTEGER  
web100_log_entry.snap. X_Rcvbuf INTEGER  
web100_log_entry.snap. X_Sndbuf INTEGER  
web100_log_entry.snap. X_dbg1 INTEGER  
web100_log_entry.snap. X_dbg2 INTEGER  
web100_log_entry.snap. X_dbg3 INTEGER  
web100_log_entry.snap. X_dbg4 INTEGER  
web100_log_entry.snap. X_rcv_ssthresh INTEGER  
web100_log_entry.snap. X_wnd_clamp INTEGER  
web100_log_entry. deltas RECORD REPEATED  
web100_log_entry.deltas. is_last BOOLEAN  
web100_log_entry.deltas. snapshot_num INTEGER  
web100_log_entry.deltas. delta_index INTEGER  
web100_log_entry.deltas. AbruptTimeouts INTEGER  
web100_log_entry.deltas. ActiveOpen INTEGER  
web100_log_entry.deltas. CERcvd INTEGER  
web100_log_entry.deltas. CongAvoid INTEGER  
web100_log_entry.deltas. CongOverCount INTEGER  
web100_log_entry.deltas. CongSignals INTEGER  
web100_log_entry.deltas. CountRTT INTEGER  
web100_log_entry.deltas. CurAppRQueue INTEGER  
web100_log_entry.deltas. CurAppWQueue INTEGER  
web100_log_entry.deltas. CurCwnd INTEGER  
web100_log_entry.deltas. CurMSS INTEGER  
web100_log_entry.deltas. CurRTO INTEGER  
web100_log_entry.deltas. CurReasmQueue INTEGER  
web100_log_entry.deltas. CurRetxQueue INTEGER  
web100_log_entry.deltas. CurRwinRcvd INTEGER  
web100_log_entry.deltas. CurRwinSent INTEGER  
web100_log_entry.deltas. CurSsthresh INTEGER  
web100_log_entry.deltas. CurTimeoutCount INTEGER  
web100_log_entry.deltas. DSACKDups INTEGER  
web100_log_entry.deltas. DataSegsIn INTEGER  
web100_log_entry.deltas. DataSegsOut INTEGER  
web100_log_entry.deltas. DupAcksIn INTEGER  
web100_log_entry.deltas. DupAcksOut INTEGER  
web100_log_entry.deltas. Duration INTEGER  
web100_log_entry.deltas. ECN INTEGER  
web100_log_entry.deltas. FastRetran INTEGER  
web100_log_entry.deltas. HCDataOctetsIn INTEGER  
web100_log_entry.deltas. HCDataOctetsOut INTEGER  
web100_log_entry.deltas. HCThruOctetsAcked INTEGER  
web100_log_entry.deltas. HCThruOctetsReceived INTEGER    
web100_log_entry.deltas. LimCwnd INTEGER  
web100_log_entry.deltas. LimRwin INTEGER  
web100_log_entry.deltas. MSSRcvd INTEGER  
web100_log_entry.deltas. MaxAppRQueue INTEGER  
web100_log_entry.deltas. MaxAppWQueue INTEGER  
web100_log_entry.deltas. MaxMSS INTEGER  
web100_log_entry.deltas. MaxRTO INTEGER  
web100_log_entry.deltas. MaxRTT INTEGER  
web100_log_entry.deltas. MaxReasmQueue INTEGER  
web100_log_entry.deltas. MaxRetxQueue INTEGER  
web100_log_entry.deltas. MaxRwinRcvd INTEGER  
web100_log_entry.deltas. MaxRwinSent INTEGER  
web100_log_entry.deltas. MaxSsCwnd INTEGER  
web100_log_entry.deltas. MaxSsthresh INTEGER  
web100_log_entry.deltas. MinMSS INTEGER  
web100_log_entry.deltas. MinRTO INTEGER  
web100_log_entry.deltas. MinRTT INTEGER  
web100_log_entry.deltas. MinRwinRcvd INTEGER  
web100_log_entry.deltas. MinRwinSent INTEGER  
web100_log_entry.deltas. MinSsthresh INTEGER  
web100_log_entry.deltas. Nagle INTEGER  
web100_log_entry.deltas. NonRecovDA INTEGER  
web100_log_entry.deltas. OctetsRetrans INTEGER  
web100_log_entry.deltas. OtherReductions INTEGER  
web100_log_entry.deltas. PostCongCountRTT INTEGER  
web100_log_entry.deltas. PostCongSumRTT INTEGER  
web100_log_entry.deltas. PreCongSumCwnd INTEGER  
web100_log_entry.deltas. PreCongSumRTT INTEGER  
web100_log_entry.deltas. QuenchRcvd INTEGER  
web100_log_entry.deltas. RTTVar INTEGER  
web100_log_entry.deltas. RcvNxt INTEGER  
web100_log_entry.deltas. RcvRTT INTEGER  
web100_log_entry.deltas. RcvWindScale INTEGER  
web100_log_entry.deltas. RecInitial INTEGER  
web100_log_entry.deltas. RetranThresh INTEGER  
web100_log_entry.deltas. SACKBlocksRcvd INTEGER  
web100_log_entry.deltas. SACKsRcvd INTEGER  
web100_log_entry.deltas. SampleRTT INTEGER  
web100_log_entry.deltas. SegsIn INTEGER  
web100_log_entry.deltas. SegsOut INTEGER  
web100_log_entry.deltas. SegsRetrans INTEGER  
web100_log_entry.deltas. SendStall INTEGER  
web100_log_entry.deltas. SlowStart INTEGER  
web100_log_entry.deltas. SmoothedRTT INTEGER  
web100_log_entry.deltas. SndInitial INTEGER  
web100_log_entry.deltas. SndLimBytesCwnd INTEGER  
web100_log_entry.deltas. SndLimBytesRwin INTEGER  
web100_log_entry.deltas. SndLimBytesSender INTEGER  
web100_log_entry.deltas. SndLimTimeCwnd INTEGER  
web100_log_entry.deltas. SndLimTimeRwin INTEGER  
web100_log_entry.deltas. SndLimTimeSnd INTEGER  
web100_log_entry.deltas. SndLimTransCwnd INTEGER  
web100_log_entry.deltas. SndLimTransRwin INTEGER  
web100_log_entry.deltas. SndLimTransSnd INTEGER  
web100_log_entry.deltas. SndMax INTEGER  
web100_log_entry.deltas. SndNxt INTEGER  
web100_log_entry.deltas. SndUna INTEGER  
web100_log_entry.deltas. SndWindScale INTEGER  
web100_log_entry.deltas. SpuriousFrDetected INTEGER  
web100_log_entry.deltas. StartTimeStamp INTEGER  
web100_log_entry.deltas. StartTimeUsec INTEGER  
web100_log_entry.deltas. State INTEGER  
web100_log_entry.deltas. SubsequentTimeouts INTEGER  
web100_log_entry.deltas. SumRTT INTEGER  
web100_log_entry.deltas. TimeStamps INTEGER  
web100_log_entry.deltas. Timeouts INTEGER  
web100_log_entry.deltas. WinScaleRcvd INTEGER  
web100_log_entry.deltas. WinScaleSent INTEGER  
web100_log_entry.deltas. X_OtherReductionsCM INTEGER  
web100_log_entry.deltas. X_OtherReductionsCV INTEGER  
web100_log_entry.deltas. X_Rcvbuf INTEGER  
web100_log_entry.deltas. X_Sndbuf INTEGER  
web100_log_entry.deltas. X_dbg1 INTEGER  
web100_log_entry.deltas. X_dbg2 INTEGER  
web100_log_entry.deltas. X_dbg3 INTEGER  
web100_log_entry.deltas. X_dbg4 INTEGER  
web100_log_entry.deltas. X_rcv_ssthresh INTEGER  
web100_log_entry.deltas. X_wnd_clamp INTEGER  

Calculating Common Metrics for NDT Web100 Data

If you are not using our unified_downloads or unified_uploads views, but instead are queryiing measurement-lab.ndt.web100, commonly reported metrics such as upload or download speed need to be calculated from data fields saved by the web100 NDT protocol.

The most commonly reported metrics are: Download Throughput (Mbit/s), Upload Throughput (bit/s), and Round Trip Time (ms). Recommended queries for these metrics are outlined below, limiting results to only valid tests. For the purposes of research, we consider valid NDT web100 tests to be those that:

  • At least 8 KB of data was transferred
  • Test duration was between 9 and 60 seconds
  • Congestion was detected
  • Tests with NULL results excluded
  • Tests from M-Lab Operations and Management infrastructure excluded
  • Traffic queuing on the switch was not present at the time of the test

Units of Measure, Converting to megabits per second (Mbit/s)

In the formulas and examples below, it is important to note the units of measure that NDT uses for fields that represent data sent and received, as well as for fields representing durations.

  • Data sent/recevied fields are a count of bytes
  • Duration fields are saved in microseconds

The formula below shows how we convert our final values to Mbit/s when calculating Download or Upload throughput, using 8 as a multiplier in our BigQuery clauses:

1 byte/microsecond * 8 bits/byte =
8 bits/microsecond * (1 / 1,000,000) megabits/bit =
8 / 1,000,000 megabits/microsecond * 1,000,000 microseconds/second =
8 megabits/second => 8 Mbit/s

Download throughput

Download throughput is computed for every server-to-client test as the ratio of the data transmitted during the test and the duration of the test. Results of tests that ended during slow start are excluded.

Download throughput is calculated using this formula within the query:

8 *
(web100_log_entry.snap.HCThruOctetsAcked /
 (web100_log_entry.snap.SndLimTimeRwin +
 web100_log_entry.snap.SndLimTimeCwnd +
 web100_log_entry.snap.SndLimTimeSnd))

The complete BigQuery example is:

#standardSQL
SELECT
  8 * (web100_log_entry.snap.HCThruOctetsAcked /
    (web100_log_entry.snap.SndLimTimeRwin +
    web100_log_entry.snap.SndLimTimeCwnd +
    web100_log_entry.snap.SndLimTimeSnd)) AS download_Mbps
FROM
  `measurement-lab.ndt.web100`
WHERE
  partition_date BETWEEN '2017-01-01' AND '2017-08-28'
  -- Data_direction specifies upload (0) or download (1) test
  AND connection_spec.data_direction = 1
  -- Traffic queuing on the switch was not present at the time of the test
  (blacklist_flags = 0 OR
    (blacklist_flags IS NULL AND anomalies.blacklist_flags IS NULL))
  -- Exclude tests from M-Lab Operations and Management infrastructure
  AND web100_log_entry.connection_spec.local_ip IS NOT NULL
  AND web100_log_entry.connection_spec.remote_ip IS NOT NULL
  AND web100_log_entry.connection_spec.remote_ip NOT IN("45.56.98.222", "35.192.37.249", "35.225.75.192", "2600:3c03::f03c:91ff:fe33:819", "23.228.128.99", "2605:a601:f1ff:fffe::99")
  -- At least 8 KB of data was transferred
  AND web100_log_entry.snap.HCThruOctetsAcked >= 8192
  -- Test duration was between 9 and 60 seconds
  AND (web100_log_entry.snap.SndLimTimeRwin +
    web100_log_entry.snap.SndLimTimeCwnd +
    web100_log_entry.snap.SndLimTimeSnd) >= 9000000
  AND (web100_log_entry.snap.SndLimTimeRwin +
    web100_log_entry.snap.SndLimTimeCwnd +
    web100_log_entry.snap.SndLimTimeSnd) < 60000000
  -- Congestion was detected
  AND web100_log_entry.snap.CongSignals > 0
  -- Sensible TCP end state
  AND web100_log_entry.snap.State IN (1,5,6,7,8,9,10,11)
  LIMIT 100

Upload throughput

Upload throughput is computed for every client-to-server test as the ratio of the data transmitted during the test and the duration of the test.

It is not possible to exclude results of tests that ended during slow start, because the web100 variable web100_log_entry.snap.CongSignals is not updated during client-to-server tests.

Upload throughput is calculated using this formula within the query:

8 * (web100_log_entry.snap.HCThruOctetsReceived/web100_log_entry.snap.Duration) AS upload_Mbps

The complete BigQuery example is similar to the download query above. Substitute the upload calculation for the one used above to calculate download, and change connection_spec.data_direction to 0.

Round Trip Time (RTT)

Server-to-client RTT is affected by TCP congestion. As a consequence, there are (at least) 2 ways to estimate the RTT using web100 data. These 2 ways provide different, non-equivalent information about the user connection.

Server-client (time) distance

  • Estimated using the minimum RTT measured during the test, which most likely happened before the test reached congestion.
  • This value is reported by the web100 variable web100_log_entry.snap.MinRTT
  • However, using this variable has the drawback that it might underestimate the connection RTT, because it might be measured in the SYC ACK exchange or some other tiny transaction which, for low speed links, does not represent the typical RTT for the full data segment.
  • Note that using PreCongSumRTT/PreCongCountRTT does not provide a more accurate estimate, because both PreCongSumRTT and PreCongCountRTT are recorded right before the first congestion signal, which, in the worst case, occurs when the receiver queue is already full, which affects the RTT.

Server-client latency during data transfers (with congestion)

  • Estimated using the average RTT, uniformly averaged over an entire test.
  • This value can be computed as web100_log_entry.snap.SumRTT/web100_log_entry.snap.CountRTT
  • In this case, it makes sense to exclude results of tests with 10 or fewer round trip time samples, because there are not enough samples to accurately estimate the RTT. This condition is expressed in BigQuery with:web100_log_entry.snap.CountRTT > 10

Given that the NDT server updates the web100 variables web100_log_entry.snap.MinRTT and web100_log_entry.snap.CountRTT only when it receives an acknowledgement and given that, during client-to-server tests the NDT server receives an ack only during the 3-way-handshake, RTT values are computed only for server-to-client tests in the web100 datatype.

The complete BigQuery example is:

#standardSQL
SELECT
  web100_log_entry.snap.MinRTT AS min_rtt
FROM
  `measurement-lab.ndt.web100`
WHERE
  connection_spec.client_geolocation.country_code = 'US'
  AND partition_date BETWEEN '2017-01-01' AND '2017-01-02'
  AND connection_spec.data_direction = 1
  AND web100_log_entry.snap.HCThruOctetsAcked >= 8192
  AND (web100_log_entry.snap.SndLimTimeRwin +
       web100_log_entry.snap.SndLimTimeCwnd +
       web100_log_entry.snap.SndLimTimeSnd) >= 9000000
  AND (web100_log_entry.snap.SndLimTimeRwin +
       web100_log_entry.snap.SndLimTimeCwnd +
       web100_log_entry.snap.SndLimTimeSnd) < 600000000
  AND web100_log_entry.snap.CountRTT > 10
  AND (web100_log_entry.snap.State = 1
       OR (web100_log_entry.snap.State >= 5
       AND web100_log_entry.snap.State <= 11))
  LIMIT 100
Back to Top