{"id":598,"date":"2014-03-06T11:20:50","date_gmt":"2014-03-06T09:20:50","guid":{"rendered":"http:\/\/bergs.biz\/blog\/?p=598"},"modified":"2014-05-04T13:55:43","modified_gmt":"2014-05-04T11:55:43","slug":"how-to-properly-benchmark-your-broadband-connection","status":"publish","type":"post","link":"https:\/\/bergs.biz\/blog\/2014\/03\/06\/how-to-properly-benchmark-your-broadband-connection\/","title":{"rendered":"How to properly benchmark your broadband connection"},"content":{"rendered":"<p>Since a while my broadband connection gets slow frequently, so I wanted to perform regular benchmarking probes and create a graph to illustrate the actual uplink and downlink speed.<\/p>\n<p>Your first approach to this might be to download and upload a payload, measure the time this took, and divide the sizes of the files you downloaded and uploaded by the times it took. But this approach is seriously flawed&#8230; Why? Simple. In a usual scenario you have a router that terminates your internet connection, so eventually other LAN clients will cause traffic at the same time you&#8217;re performing your probe. This would &#8220;limit&#8221; the bandwidth you have for your probe, and thus artificially reduce the speed you calculate.<\/p>\n<p>So how to do it properly? You should ask your internet gateway (your router) for the traffic it sees.<\/p>\n<p><!--more--><\/p>\n<p>I&#8217;m running OpenWRT on my router. My first approach was to use SNMP to retrieve the interface statistics. But that was just a nice try, since the interface statistics are only updated periodically (about every 10 secs it seems), so that my measurements of the traffic that flew thru the WAN port (uplink) of my router were very imprecise.<\/p>\n<p>Then I had a great idea. <code>ifconfig<\/code> shows the actual RX and TX values for each interface. So I just created two tiny CGI scripts that would output the current values. On my intranet server where I run the benchmark every 5 mins. from cron I can easily retrieve the current values by issuing a simple <code>curl<\/code> command to the CGI URL.<\/p>\n<p>The script that does the actual benchmark probes has been modeled according to <a href=\"http:\/\/speedcheck.vodafone.de\/\" target=\"_blank\">Vodafone Germany&#8217;s speed check<\/a>. I snooped the traffic to understand what they do, and basically I do the same thing in my script apart from that I don&#8217;t download or send the smaller payloads, just the largest ones. I also run two of these downloads or uploads at the same time, exactly as Vodafone do.<\/p>\n<p>Ok, so here&#8217;s the two CGI scripts that read the interface counters:<\/p>\n<pre>#!\/bin\/ash\r\nIFCONFIG=`ifconfig pppoe-wan | grep \"RX bytes\"| while read l; do expr \"$l\" : 'RX bytes:\\([0-9]*\\) (.*$'; done`\r\n\r\necho \"Content-Type: text\/plain\"\r\necho \"\"\r\necho \"$IFCONFIG\"<\/pre>\n<pre>#!\/bin\/ash\r\nIFCONFIG=`ifconfig pppoe-wan | grep \"TX bytes\"| while read l; do expr \"$l\" : '.*TX bytes:\\([0-9]*\\) (.*$'; done`\r\n\r\necho \"Content-Type: text\/plain\"\r\necho \"\"\r\necho \"$IFCONFIG\"<\/pre>\n<p>And here&#8217;s the actual benchmarking script:<\/p>\n<pre>#!\/usr\/bin\/env perl\r\nuse warnings;\r\nuse strict;\r\nuse Config;\r\nuse Time::HiRes qw ( time );\r\nuse LockFile::Simple qw(unlock trylock);\r\nuse File::Basename;\r\nuse LWP::Simple;\r\nuse threads ('yield',\r\n\t     'stack_size' =&gt; 64*4096,\r\n\t     'exit' =&gt; 'threads_only',\r\n\t     'stringify');\r\nuse LWP::UserAgent;\r\n\r\nuse constant DEBUG =&gt; 0;\r\n\r\n# URL which will return the current \"RX bytes\" and \"TX bytes\" counters on WAN interface\r\nuse constant RX_BYTES_URL =&gt; \"http:\/\/gw\/cgi-bin\/get-rx-bytes.sh\";\r\nuse constant TX_BYTES_URL =&gt; \"http:\/\/gw\/cgi-bin\/get-tx-bytes.sh\";\r\n\r\nuse constant URL_DN =&gt; \"http:\/\/www.speedcheck.vodafone.de\/speedtest\/random2000x2000.jpg\";\r\nuse constant URL_UP =&gt; \"http:\/\/www.speedcheck.vodafone.de\/speedtest\/upload.php\";\r\n\r\nuse constant RRD_FILENAME =&gt; \"netbench.rrd\";\r\n\r\n# Function prototypes\r\nsub main();\r\nsub rnd_str(@);\r\n\r\nmain();\r\n\r\nsub do_download() {\r\n    my $before = time();\r\n\r\n    # Download dummy file twice, in two parallel threads\r\n    my $thr1 = threads-&gt;create(sub { get(URL_DN . '?y=1'); });\r\n    my $thr2 = threads-&gt;create(sub { get(URL_DN . '?y=2'); });\r\n    $thr1-&gt;join();\r\n    $thr2-&gt;join();\r\n\r\n    my $after = time();\r\n\r\n    my $time_dn = $after - $before;\r\n    return($time_dn);\r\n}\r\n\r\nsub do_upload() {\r\n    my $payload = rnd_str 54784, 'A'..'Z';\r\n\r\n    my $ua = LWP::UserAgent-&gt;new;\r\n    $ua-&gt;timeout(10);\r\n\r\n    my $b4 = time();\r\n    my $thr1 = threads-&gt;create(sub { my $response = $ua-&gt;post(URL_UP, Content_Type =&gt; 'application\/x-www-form-urlencoded',\r\n\t\t\t\t\t\t\t      Content =&gt; [content0 =&gt; $payload, content1 =&gt; $payload,\r\n\t\t\t\t\t\t\t\t\t  content2 =&gt; $payload, content3 =&gt; $payload]);});\r\n    my $thr2 = threads-&gt;create(sub { my $response = $ua-&gt;post(URL_UP, Content_Type =&gt; 'application\/x-www-form-urlencoded',\r\n\t\t\t\t\t\t\t      Content =&gt; [content0 =&gt; $payload, content1 =&gt; $payload,\r\n\t\t\t\t\t\t\t\t\t  content2 =&gt; $payload, content3 =&gt; $payload]);});\r\n    $thr1-&gt;join();\r\n    $thr2-&gt;join();\r\n\r\n    my $aftr = time();\r\n\r\n    return($aftr - $b4);\r\n}\r\n\r\n# Generate random string of specified length from specified set of characters\r\n# Usage: print rnd_str 8, 'a'..'z', 0..9;\r\nsub rnd_str(@) {\r\n    join'', @_[ map{ rand @_ } 1 .. shift ]\r\n}\r\n\r\nsub main() {\r\n    my $LOCKFILE_DIR = \"\/run\/lock\/\";\r\n    if (\"$Config{osname}\" eq \"darwin\") {\r\n\t$LOCKFILE_DIR = \"\/var\/tmp\/\";\r\n    }\r\n\r\n    my $LOCKFILE = basename($0, \".pl\");\r\n    $LOCKFILE = $LOCKFILE_DIR . $LOCKFILE;\r\n    die \"Cannot obtain lock ${LOCKFILE}.lock, already locked.\\n\" unless trylock($LOCKFILE);\r\n\r\n    my $in_octets_1 = get(RX_BYTES_URL);\r\n    my $time_dn = do_download();\r\n    my $in_octets_2 = get(RX_BYTES_URL);\r\n\r\n    if (DEBUG) {\r\n\tprintf \"Total octets downloaded: %d = %.1f MByte\\n\", $in_octets_2 - $in_octets_1,\r\n\t\t  ($in_octets_2 - $in_octets_1) \/ 1024**2;\r\n\tprintf \"Download took %.2f sec\\n\", $time_dn;\r\n    }\r\n\r\n    my $out_octets_1 = get(TX_BYTES_URL);\r\n    my $time_up = do_upload();\r\n    my $out_octets_2 = get(TX_BYTES_URL);\r\n\r\n    if (DEBUG) {\r\n\tprintf \"Total octets uploaded: %d = %.1f MByte\\n\", $out_octets_2 - $out_octets_1,\r\n\t\t  ($out_octets_2 - $out_octets_1) \/ 1024**2;\r\n\tprintf \"Upload took %.2f sec\\n\", $time_up;\r\n    }\r\n\r\n\u00a0\u00a0\u00a0 my $down = ($in_octets_2 - $in_octets_1) \/ $time_dn \/ 1024**2 * 8;\r\n\u00a0\u00a0\u00a0 my $up = ($out_octets_2 - $out_octets_1) \/ $time_up \/ 1024**2 * 8;\r\n\u00a0\u00a0\u00a0 my $now = time();\r\n\u00a0\u00a0\u00a0 printf \"%d\\t%.2f\\t%.2f\\n\", $now, $down, $up;\r\n\r\n\u00a0\u00a0\u00a0 my $values = sprintf(\"%d:%.2f:%.2f\", $now, $down, $up);\r\n\u00a0\u00a0\u00a0 RRDs::updatev (RRD_FILENAME, \"--template\", \"down:up\", $values);\r\n\u00a0\u00a0\u00a0 my $err = RRDs::error;\r\n\u00a0\u00a0\u00a0 if ($err) {\r\n\u00a0\u00a0 \u00a0    warn \"ERROR while updating \", RRD_FILENAME, \": \", $err;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n    unlock($LOCKFILE);\r\n    exit(0);\r\n\r\n}<\/pre>\n<p>The output my script creates looks like follows:<\/p>\n<pre>1394096383\t11.59\t0.67<\/pre>\n<p>That&#8217;s three tuples separated by tabs, the first is the seconds since epoch, the second is the download speed in MBit\/s, and the third is the upload speed in MBit\/s.<\/p>\n<p>The above script also updates an RRD archive with the current thruput values. <a href=\"http:\/\/web.taranis.org\/drraw\/\" target=\"_blank\">drraw<\/a>, a very nice frontend to RRDtool, can then be used to create nice graphs from the RRD file we created.<\/p>\n<p>To create the RRD database I used the following command:<\/p>\n<pre>rrdtool create netbench.rrd --start 1392936675 --step 300 \\\r\n    DS:down:GAUGE:600:0:20 DS:up:GAUGE:600:0:1 \\\r\n    RRA:AVERAGE:0.5:1:576 RRA:AVERAGE:0.5:3:960 \\\r\n    RRA:AVERAGE:0.5:6:1920 RRA:AVERAGE:0.5:12:4320 \\\r\n    RRA:AVERAGE:0.5:72:7300<\/pre>\n<p>This creates two datasources, <code>down<\/code> and <code>up<\/code>, and five round-robin archives: One for 48 hours with 5 min precision, one for 10 days with 15 min precision, one for 40 days with 30 min precision, one for 180 days with 1 h precision, and one for 5 years with 6 h precision.<\/p>\n<p>In case you wonder about that &#8220;strange&#8221; date ranges: I like to have some extra period of time on top of the standard ranges, so instead of 24 hours I like 40 hours, and instead of a week I like 10 days.<\/p>\n<p>The consolidation function to use is <code>AVERAGE<\/code>.<\/p>\n<p>So, this is it. I hope you find this useful. If you do, please let me know. \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>How to benchmark your broadband internet connection.<br \/>\nWie man die Geschwindigkeit seiner Breitband-Internetverbindung misst. Die Implementierung des Benchmarks ist exakt dem Vodafone SpeedCheck nachempfunden.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,84],"tags":[114,109,115],"class_list":["post-598","post","type-post","status-publish","format-standard","hentry","category-computers","category-networking-computers","tag-benchmarking","tag-dsl","tag-performance"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How to properly benchmark your broadband connection - Ralf&#039;s Blog<\/title>\n<meta name=\"description\" content=\"How to benchmark your broadband internet connection. Wie man die Geschwindigkeit seiner Breitband-Internetverbindung misst.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/bergs.biz\/blog\/2014\/03\/06\/how-to-properly-benchmark-your-broadband-connection\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to properly benchmark your broadband connection - Ralf&#039;s Blog\" \/>\n<meta property=\"og:description\" content=\"How to benchmark your broadband internet connection. Wie man die Geschwindigkeit seiner Breitband-Internetverbindung misst.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/bergs.biz\/blog\/2014\/03\/06\/how-to-properly-benchmark-your-broadband-connection\/\" \/>\n<meta property=\"og:site_name\" content=\"Ralf&#039;s Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-03-06T09:20:50+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2014-05-04T11:55:43+00:00\" \/>\n<meta name=\"author\" content=\"Ralf Bergs\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ralfbergs\" \/>\n<meta name=\"twitter:site\" content=\"@ralfbergs\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ralf Bergs\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/bergs.biz\\\/blog\\\/2014\\\/03\\\/06\\\/how-to-properly-benchmark-your-broadband-connection\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/bergs.biz\\\/blog\\\/2014\\\/03\\\/06\\\/how-to-properly-benchmark-your-broadband-connection\\\/\"},\"author\":{\"name\":\"Ralf Bergs\",\"@id\":\"https:\\\/\\\/bergs.biz\\\/blog\\\/#\\\/schema\\\/person\\\/354e37390b493c875f972bd313d29201\"},\"headline\":\"How to properly benchmark your broadband connection\",\"datePublished\":\"2014-03-06T09:20:50+00:00\",\"dateModified\":\"2014-05-04T11:55:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/bergs.biz\\\/blog\\\/2014\\\/03\\\/06\\\/how-to-properly-benchmark-your-broadband-connection\\\/\"},\"wordCount\":541,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/bergs.biz\\\/blog\\\/#\\\/schema\\\/person\\\/354e37390b493c875f972bd313d29201\"},\"keywords\":[\"benchmarking\",\"DSL\",\"performance\"],\"articleSection\":[\"Computers\",\"Networking\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/bergs.biz\\\/blog\\\/2014\\\/03\\\/06\\\/how-to-properly-benchmark-your-broadband-connection\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/bergs.biz\\\/blog\\\/2014\\\/03\\\/06\\\/how-to-properly-benchmark-your-broadband-connection\\\/\",\"url\":\"https:\\\/\\\/bergs.biz\\\/blog\\\/2014\\\/03\\\/06\\\/how-to-properly-benchmark-your-broadband-connection\\\/\",\"name\":\"How to properly benchmark your broadband connection - Ralf&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/bergs.biz\\\/blog\\\/#website\"},\"datePublished\":\"2014-03-06T09:20:50+00:00\",\"dateModified\":\"2014-05-04T11:55:43+00:00\",\"description\":\"How to benchmark your broadband internet connection. Wie man die Geschwindigkeit seiner Breitband-Internetverbindung misst.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/bergs.biz\\\/blog\\\/2014\\\/03\\\/06\\\/how-to-properly-benchmark-your-broadband-connection\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/bergs.biz\\\/blog\\\/2014\\\/03\\\/06\\\/how-to-properly-benchmark-your-broadband-connection\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/bergs.biz\\\/blog\\\/2014\\\/03\\\/06\\\/how-to-properly-benchmark-your-broadband-connection\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/bergs.biz\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to properly benchmark your broadband connection\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/bergs.biz\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/bergs.biz\\\/blog\\\/\",\"name\":\"Ralf's Blog\",\"description\":\"Just another WordPress weblog\",\"publisher\":{\"@id\":\"https:\\\/\\\/bergs.biz\\\/blog\\\/#\\\/schema\\\/person\\\/354e37390b493c875f972bd313d29201\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/bergs.biz\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/bergs.biz\\\/blog\\\/#\\\/schema\\\/person\\\/354e37390b493c875f972bd313d29201\",\"name\":\"Ralf Bergs\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/bergs.biz\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/Ralf-Tower-2026-1024x1024.jpg\",\"url\":\"https:\\\/\\\/bergs.biz\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/Ralf-Tower-2026-1024x1024.jpg\",\"contentUrl\":\"https:\\\/\\\/bergs.biz\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/Ralf-Tower-2026-1024x1024.jpg\",\"width\":1024,\"height\":1024,\"caption\":\"Ralf Bergs\"},\"logo\":{\"@id\":\"https:\\\/\\\/bergs.biz\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/Ralf-Tower-2026-1024x1024.jpg\"},\"description\":\"Geek, computer guy, licensed and certified electrical and computer engineer, husband, best daddy.\",\"sameAs\":[\"https:\\\/\\\/bergs.biz\\\/\",\"https:\\\/\\\/linkedin.com\\\/in\\\/ralfbergs\\\/\",\"https:\\\/\\\/x.com\\\/ralfbergs\"],\"url\":\"https:\\\/\\\/bergs.biz\\\/blog\\\/author\\\/rabe\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to properly benchmark your broadband connection - Ralf&#039;s Blog","description":"How to benchmark your broadband internet connection. Wie man die Geschwindigkeit seiner Breitband-Internetverbindung misst.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/bergs.biz\/blog\/2014\/03\/06\/how-to-properly-benchmark-your-broadband-connection\/","og_locale":"en_US","og_type":"article","og_title":"How to properly benchmark your broadband connection - Ralf&#039;s Blog","og_description":"How to benchmark your broadband internet connection. Wie man die Geschwindigkeit seiner Breitband-Internetverbindung misst.","og_url":"https:\/\/bergs.biz\/blog\/2014\/03\/06\/how-to-properly-benchmark-your-broadband-connection\/","og_site_name":"Ralf&#039;s Blog","article_published_time":"2014-03-06T09:20:50+00:00","article_modified_time":"2014-05-04T11:55:43+00:00","author":"Ralf Bergs","twitter_card":"summary_large_image","twitter_creator":"@ralfbergs","twitter_site":"@ralfbergs","twitter_misc":{"Written by":"Ralf Bergs","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/bergs.biz\/blog\/2014\/03\/06\/how-to-properly-benchmark-your-broadband-connection\/#article","isPartOf":{"@id":"https:\/\/bergs.biz\/blog\/2014\/03\/06\/how-to-properly-benchmark-your-broadband-connection\/"},"author":{"name":"Ralf Bergs","@id":"https:\/\/bergs.biz\/blog\/#\/schema\/person\/354e37390b493c875f972bd313d29201"},"headline":"How to properly benchmark your broadband connection","datePublished":"2014-03-06T09:20:50+00:00","dateModified":"2014-05-04T11:55:43+00:00","mainEntityOfPage":{"@id":"https:\/\/bergs.biz\/blog\/2014\/03\/06\/how-to-properly-benchmark-your-broadband-connection\/"},"wordCount":541,"commentCount":0,"publisher":{"@id":"https:\/\/bergs.biz\/blog\/#\/schema\/person\/354e37390b493c875f972bd313d29201"},"keywords":["benchmarking","DSL","performance"],"articleSection":["Computers","Networking"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/bergs.biz\/blog\/2014\/03\/06\/how-to-properly-benchmark-your-broadband-connection\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/bergs.biz\/blog\/2014\/03\/06\/how-to-properly-benchmark-your-broadband-connection\/","url":"https:\/\/bergs.biz\/blog\/2014\/03\/06\/how-to-properly-benchmark-your-broadband-connection\/","name":"How to properly benchmark your broadband connection - Ralf&#039;s Blog","isPartOf":{"@id":"https:\/\/bergs.biz\/blog\/#website"},"datePublished":"2014-03-06T09:20:50+00:00","dateModified":"2014-05-04T11:55:43+00:00","description":"How to benchmark your broadband internet connection. Wie man die Geschwindigkeit seiner Breitband-Internetverbindung misst.","breadcrumb":{"@id":"https:\/\/bergs.biz\/blog\/2014\/03\/06\/how-to-properly-benchmark-your-broadband-connection\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/bergs.biz\/blog\/2014\/03\/06\/how-to-properly-benchmark-your-broadband-connection\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/bergs.biz\/blog\/2014\/03\/06\/how-to-properly-benchmark-your-broadband-connection\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/bergs.biz\/blog\/"},{"@type":"ListItem","position":2,"name":"How to properly benchmark your broadband connection"}]},{"@type":"WebSite","@id":"https:\/\/bergs.biz\/blog\/#website","url":"https:\/\/bergs.biz\/blog\/","name":"Ralf's Blog","description":"Just another WordPress weblog","publisher":{"@id":"https:\/\/bergs.biz\/blog\/#\/schema\/person\/354e37390b493c875f972bd313d29201"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/bergs.biz\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/bergs.biz\/blog\/#\/schema\/person\/354e37390b493c875f972bd313d29201","name":"Ralf Bergs","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/bergs.biz\/blog\/wp-content\/uploads\/2026\/04\/Ralf-Tower-2026-1024x1024.jpg","url":"https:\/\/bergs.biz\/blog\/wp-content\/uploads\/2026\/04\/Ralf-Tower-2026-1024x1024.jpg","contentUrl":"https:\/\/bergs.biz\/blog\/wp-content\/uploads\/2026\/04\/Ralf-Tower-2026-1024x1024.jpg","width":1024,"height":1024,"caption":"Ralf Bergs"},"logo":{"@id":"https:\/\/bergs.biz\/blog\/wp-content\/uploads\/2026\/04\/Ralf-Tower-2026-1024x1024.jpg"},"description":"Geek, computer guy, licensed and certified electrical and computer engineer, husband, best daddy.","sameAs":["https:\/\/bergs.biz\/","https:\/\/linkedin.com\/in\/ralfbergs\/","https:\/\/x.com\/ralfbergs"],"url":"https:\/\/bergs.biz\/blog\/author\/rabe\/"}]}},"_links":{"self":[{"href":"https:\/\/bergs.biz\/blog\/wp-json\/wp\/v2\/posts\/598","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bergs.biz\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bergs.biz\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bergs.biz\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/bergs.biz\/blog\/wp-json\/wp\/v2\/comments?post=598"}],"version-history":[{"count":9,"href":"https:\/\/bergs.biz\/blog\/wp-json\/wp\/v2\/posts\/598\/revisions"}],"predecessor-version":[{"id":607,"href":"https:\/\/bergs.biz\/blog\/wp-json\/wp\/v2\/posts\/598\/revisions\/607"}],"wp:attachment":[{"href":"https:\/\/bergs.biz\/blog\/wp-json\/wp\/v2\/media?parent=598"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bergs.biz\/blog\/wp-json\/wp\/v2\/categories?post=598"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bergs.biz\/blog\/wp-json\/wp\/v2\/tags?post=598"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}