{"id":15561,"date":"2026-09-05T14:19:41","date_gmt":"2026-09-05T12:19:41","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/toolbox\/connection-mirror-what-the-server-sees\/"},"modified":"2026-09-05T14:19:41","modified_gmt":"2026-09-05T12:19:41","slug":"connection-mirror-what-the-server-sees","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/connection-mirror-what-the-server-sees\/","title":{"rendered":"Connection Mirror: What the Server Sees"},"content":{"rendered":"<div class=\"gtm-analyser-container\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 20px;\">Every request carries more than a page address. Before a single line of JavaScript runs, the server knows the IP address and whose network it is, which TLS version and cipher were negotiated, which languages the browser prefers, whether it sends a Global Privacy Control signal, and, in Chromium, the Client Hints that replaced the user agent string. This tool asks this server to report exactly that for the current connection, and sets it beside what the browser says about itself. Where the two disagree, an extension, a proxy or a VPN is usually in between.<\/p>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; margin-bottom: 16px;\">The request goes to this server only; nothing is stored beyond the hourly rate counter, and the answer is shown only here. Cookie values and authorisation headers are never returned, only cookie names. The reverse DNS lookup and one RDAP query for the network owner run on this server.<\/p>\n<p>    <button id=\"mi-btn\" class=\"button\" style=\"background: var(--accent, #7ee787); color: var(--on-accent, #0b1114); border: none; padding: 12px 24px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Show what this server sees<\/button><\/p>\n<div id=\"mi-ausgabe\" style=\"margin-top: 22px;\"><\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.8rem; margin: 24px 0 0;\">Limits worth knowing: the headers shown are those of a background fetch request, which carries fewer Sec-Fetch and Accept values than a page navigation; the HTTP version is what this server negotiates, not the best the browser can do; the network owner comes from the regional registry and names the provider, not a person; and the hosting hint is a heuristic on the network name.<\/p>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"Every request carries more than a page address. Before a single line of JavaScript runs, the server knows the IP address and whose network it is, which TLS version and cipher were negotiated, which languages the browser prefers, whether it sends a Global Privacy Control signal, and, in Chromium, the Client Hints that replaced the user agent string. This tool asks this server to report exactly that for the current connection, and sets it beside what the browser says about itself. Where the two disagree, an extension, a proxy or a VPN is usually in between.\",\"datenschutz\":\"The request goes to this server only; nothing is stored beyond the hourly rate counter, and the answer is shown only here. Cookie values and authorisation headers are never returned, only cookie names. The reverse DNS lookup and one RDAP query for the network owner run on this server.\",\"knopf\":\"Show what this server sees\",\"laeuft\":\"Asking the server...\",\"grenze\":\"Limits worth knowing: the headers shown are those of a background fetch request, which carries fewer Sec-Fetch and Accept values than a page navigation; the HTTP version is what this server negotiates, not the best the browser can do; the network owner comes from the regional registry and names the provider, not a person; and the hosting hint is a heuristic on the network name.\",\"h_verbindung\":\"Connection\",\"zeile_ip\":\"Address\",\"zeile_port\":\"port\",\"zeile_ptr\":\"Reverse DNS\",\"zeile_netz\":\"Network\",\"zeile_tls\":\"TLS\",\"zeile_http\":\"HTTP version\",\"zeile_cookies\":\"Cookies sent (names)\",\"zeile_dauer\":\"Took\",\"zeile_limit\":\"Calls left this hour\",\"familie_4\":\"IPv4\",\"familie_6\":\"IPv6\",\"wert_keiner\":\"none\",\"h_kopf\":\"Request headers as received ({n})\",\"h_vergleich\":\"Server against browser\",\"spalte_merkmal\":\"Property\",\"server_sieht\":\"Server sees\",\"browser_sagt\":\"Browser says\",\"gleich\":\"same\",\"verschieden\":\"different\",\"v_sprache\":\"Preferred language\",\"v_gpc\":\"Global Privacy Control\",\"v_ua\":\"User agent\",\"v_zeitzone\":\"Country of the network \\\/ time zone\",\"v_plattform\":\"Platform\",\"ja\":\"yes\",\"nein\":\"no\",\"h_befunde\":\"Findings\",\"stufe_hoch\":\"High\",\"stufe_mittel\":\"Medium\",\"stufe_niedrig\":\"Low\",\"stufe_info\":\"Information\",\"stufe_gut\":\"In order\",\"keine_befunde\":\"Nothing to report.\",\"fehler_zu_viele\":\"The limit of {limit} calls per hour for this address has been reached.\",\"fehler_zaehler\":\"The rate counter is unavailable, so nothing was checked.\",\"fehler_methode\":\"Wrong request method.\",\"fehler_netz\":\"The service could not be reached.\",\"fehler_antwort\":\"The answer could not be read.\",\"fehler_unbekannt\":\"Something went wrong that has no message of its own.\",\"befund_ipv6\":\"Connected over IPv6: {ip} || The address comes from the provider\\u0027s IPv6 allocation. Many providers hand out a new prefix regularly; the interface part can still stay stable for a long time.\",\"befund_ipv4\":\"Connected over IPv4: {ip} || Either the provider has no IPv6 yet, or the browser chose IPv4 for this host. Behind carrier-grade NAT, many customers share one such address.\",\"befund_adresse_unbekannt\":\"No client address readable || The server saw no usable remote address, which points at a misconfigured proxy.\",\"befund_adresse_privat\":\"The address is private: {ip} || The request reached this server from a local network or through a proxy that hides the origin. The reverse DNS and network lookups are skipped for private addresses.\",\"befund_ptr\":\"Reverse DNS: {ptr} || The provider\\u0027s name for this address. It often reveals the provider, the region and whether the line is residential or business, and it is visible to every site.\",\"befund_ptr_fehlt\":\"No reverse DNS name || The provider set no PTR record for this address. Nothing wrong with that; it just gives sites one clue less.\",\"befund_netz\":\"Network: {name}, {org} ({land}) || Who the address is allocated to, from the regional registry. This is the coarse location every site can derive from an address alone.\",\"befund_rechenzentrum\":\"The network belongs to a hosting or cloud provider: {anbieter} || Typical for a VPN, a proxy or an automated client. Sites that score visitors treat such addresses differently from residential ones.\",\"befund_proxy_kopf\":\"Proxy header present: {wert} || A Via, Forwarded or X-Forwarded-For header says that something between browser and server rewrote the request. Whatever is in it was added by that hop, not by the browser.\",\"befund_tls13\":\"TLS 1.3 with {cipher} || The current version: one-round-trip handshake, forward secrecy only, and the server certificate is encrypted on the wire.\",\"befund_tls12\":\"TLS 1.2 with {cipher} || Still fine, but the browser or a middlebox did not negotiate 1.3. Current browsers do; a corporate proxy that inspects traffic often stays on 1.2.\",\"befund_tls_alt\":\"Old TLS version: {protokoll} || TLS 1.0 and 1.1 are deprecated, and current browsers refuse them. Something old is in between.\",\"befund_kein_tls\":\"No TLS || The request arrived in plain text. Everything on this page, headers included, was readable on the way.\",\"befund_tls_unbekannt\":\"TLS details not exported || The connection is encrypted, but the server did not export the protocol details for this request.\",\"befund_http_version\":\"HTTP version {version} || The version this server negotiated for this request. It depends on what this server offers, not only on the browser.\",\"befund_gpc\":\"Global Privacy Control is set (Sec-GPC: 1) || The browser or an extension asks not to sell or share personal data. Under the California and Colorado privacy laws sites must honour it; in the EU it is a signal without a legal definition yet, but a clear statement of intent.\",\"befund_gpc_fehlt\":\"No Global Privacy Control signal || The browser sends no Sec-GPC header. Firefox and Brave can send it, Chrome does not; extensions such as Privacy Badger add it.\",\"befund_dnt\":\"Do Not Track: {wert} || The old opt-out signal. Never legally binding, ignored by most sites, removed from Firefox in 2024. Sending it still adds one bit to the fingerprint.\",\"befund_save_data\":\"Save-Data: {wert} || The browser asks for reduced data use, usually because a data saver mode is on. Sites may serve smaller images and fewer scripts.\",\"befund_ua_fehlt\":\"No User-Agent header || Unusual for a browser; automated clients sometimes send none.\",\"befund_ua\":\"User agent: {ua} || The string every site receives. In Chromium it is frozen (reduced), so it no longer reveals the exact version or the device model.\",\"befund_ua_reduziert\":\"Reduced user agent string || The version reads x.0.0.0 and the platform is generic: Chromium\\u0027s user agent reduction. The precise values moved to Client Hints, which a site has to ask for.\",\"befund_ua_automat\":\"The user agent looks automated || Names such as bot, curl or HeadlessChrome mark the client as a script or a crawler.\",\"befund_client_hints\":\"Client Hints: {ua}, platform {plattform}, mobile {mobil} || Chromium sends the browser brand, major version, platform and a mobile flag unasked. Everything beyond that (architecture, model, full version) only after the site requests it via Accept-CH.\",\"befund_client_hints_hoch\":\"High-entropy Client Hints sent unasked: {liste} || These are only meant to be sent after a site asked for them. Seeing them here means the browser or an extension sends them by default, which adds to the fingerprint.\",\"befund_client_hints_fehlen\":\"No Client Hints || Firefox and Safari do not send Sec-CH-UA headers; the user agent string is all a site gets before scripts run.\",\"befund_fetch_metadaten\":\"Fetch metadata: site {site}, mode {mode}, dest {dest} || The browser tells the server where the request comes from and what it is for. Servers use it to refuse cross-site requests before any content is produced.\",\"befund_sprache\":\"Preferred languages: {liste} || The Accept-Language header, in order. Sites pick a language from it; it is also one of the most identifying headers, especially with several entries.\",\"befund_sprache_viele\":\"{n} languages listed || A long Accept-Language list is rare and therefore identifying. Two entries are common; five are a fingerprint.\",\"befund_sprache_fehlt\":\"No Accept-Language header || Unusual for a browser.\",\"befund_kodierung\":\"Accepted encodings: {liste} (Brotli {br}, zstd {zstd}) || Which compressions the browser can decode. Every current browser accepts Brotli; zstd came to Chrome and Firefox in 2024.\",\"befund_referer\":\"Referer: {wert} || The page this request came from, as far as the Referrer-Policy allows.\",\"befund_entropie\":\"{n} headers beyond the user agent carry identifying detail: {liste} || A rough count of what a fingerprint could use from the headers alone, before any script runs.\",\"befund_b_sprache_abweichend\":\"Language differs: server sees {server}, browser reports {browser} || Accept-Language and navigator.languages normally match. A difference points at an extension or a proxy rewriting headers, or a privacy setting that spoofs one of them.\",\"befund_b_gpc_abweichend\":\"GPC differs: header {server}, navigator.globalPrivacyControl {browser} || The header and the JavaScript property should agree. If only one is set, an extension injects the header, or the browser exposes the property without sending the signal.\",\"befund_b_ua_abweichend\":\"The user agent string the server received differs from navigator.userAgent || Something rewrote the header on the way, or a script overrides the property. Sites that compare both flag this as spoofing.\",\"befund_b_zeitzone\":\"Time zone {zeitzone} does not fit the network country {land} || The browser\\u0027s clock is set to a region other than the one the address belongs to. Typical for a VPN or a traveller; sites use exactly this mismatch to detect VPN use.\",\"befund_b_geraet\":\"Device as the browser reports it: screen {bildschirm}, pixel ratio {dpr}, {kerne} cores, {speicher} memory, network {netz}, cookies {cookies} || These values are only available to scripts, not in headers, and are the usual raw material of a fingerprint.\"};<\/p>\n<p>    var ENDPUNKT = '\/lw-mirror.php';\n    var STUFEN = ['hoch', 'mittel', 'niedrig', 'info', 'gut'];\n    var KOPF_REIHE = ['user-agent', 'accept', 'accept-language', 'accept-encoding', 'sec-ch-ua', 'sec-ch-ua-mobile', 'sec-ch-ua-platform', 'sec-ch-ua-arch', 'sec-ch-ua-model', 'sec-ch-ua-full-version-list', 'sec-ch-ua-platform-version',\n        'sec-fetch-site', 'sec-fetch-mode', 'sec-fetch-dest', 'sec-fetch-user', 'sec-gpc', 'dnt', 'save-data', 'upgrade-insecure-requests', 'priority', 'referer', 'origin', 'host', 'via', 'x-forwarded-for', 'forwarded', 'cache-control', 'pragma', 'te', 'connection', 'device-memory', 'viewport-width', 'downlink', 'ect', 'rtt'];<\/p>\n<p>    function liste(w) { return Array.isArray(w) ? w : []; }\n    function zahl(w) { return (typeof w === 'number' && isFinite(w)) ? w : null; }\n    function text(schluessel, daten) {\n        var t = T[schluessel];\n        if (typeof t !== 'string') { return null; }\n        return t.replace(\/\\{([a-z_0-9]+)\\}\/g, function (m, k) {\n            return (daten && daten[k] !== undefined && daten[k] !== null) ? String(daten[k]) : m;\n        });\n    }<\/p>\n<p>    \/** Was der Browser ueber sich selbst sagt. Jede Sonde einzeln abgesichert. *\/\n    function sammeln(nav, fenster) {\n        nav = nav || navigator; fenster = fenster || window;\n        var r = { ua: null, sprachen: [], gpc: null, dnt: null, zeitzone: null, plattform: null, marken: [], mobil: null, bildschirm: null, dpr: null, kerne: null, speicher: null, cookies: null, netz: null };\n        try { r.ua = String(nav.userAgent || ''); } catch (e) {}\n        try { r.sprachen = liste(nav.languages).map(String); if (!r.sprachen.length && nav.language) { r.sprachen = [String(nav.language)]; } } catch (e) {}\n        try { r.gpc = (typeof nav.globalPrivacyControl === 'boolean') ? nav.globalPrivacyControl : null; } catch (e) {}\n        try { r.dnt = nav.doNotTrack !== undefined ? nav.doNotTrack : null; } catch (e) {}\n        try { r.zeitzone = Intl.DateTimeFormat().resolvedOptions().timeZone || null; } catch (e) {}\n        try { if (nav.userAgentData) { r.plattform = nav.userAgentData.platform || null; r.mobil = !!nav.userAgentData.mobile; r.marken = liste(nav.userAgentData.brands).map(function (b) { return b.brand + ' ' + b.version; }); } } catch (e) {}\n        try { r.bildschirm = fenster.screen ? fenster.screen.width + 'x' + fenster.screen.height : null; r.dpr = fenster.devicePixelRatio || null; } catch (e) {}\n        try { r.kerne = nav.hardwareConcurrency || null; r.speicher = nav.deviceMemory || null; } catch (e) {}\n        try { r.cookies = typeof nav.cookieEnabled === 'boolean' ? nav.cookieEnabled : null; } catch (e) {}\n        try { r.netz = (nav.connection && nav.connection.effectiveType) ? String(nav.connection.effectiveType) : null; } catch (e) {}\n        return r;\n    }<\/p>\n<p>    function bewerten(antwort) {\n        var a = antwort || {};\n        if (a.fehler) { return { fehler: String(a.fehler), limit: zahl(a.limit) }; }\n        var befunde = liste(a.befunde).map(function (f) {\n            return { key: String(f.key || ''), stufe: STUFEN.indexOf(f.stufe) === -1 ? 'info' : f.stufe, daten: (f.daten && typeof f.daten === 'object') ? f.daten : {} };\n        });\n        var kopf = {};\n        if (a.kopf && typeof a.kopf === 'object') { Object.keys(a.kopf).forEach(function (k) { if (typeof a.kopf[k] === 'string') { kopf[k.toLowerCase()] = a.kopf[k]; } }); }\n        var rdap = (a.rdap && typeof a.rdap === 'object') ? a.rdap : null;\n        var tls = (a.tls && typeof a.tls === 'object') ? a.tls : {};\n        var http = (a.http && typeof a.http === 'object') ? a.http : {};\n        return {\n            fehler: null, ip: a.ip ? String(a.ip) : '', familie: zahl(a.familie) || 0, ptr: a.ptr ? String(a.ptr) : null, port: zahl(a.port),\n            rdap: rdap ? { name: rdap.name ? String(rdap.name) : null, org: rdap.org ? String(rdap.org) : null, land: rdap.land ? String(rdap.land) : null, rechenzentrum: rdap.rechenzentrum ? String(rdap.rechenzentrum) : null } : null,\n            tls: { protokoll: tls.protokoll ? String(tls.protokoll) : null, cipher: tls.cipher ? String(tls.cipher) : null, bits: zahl(tls.bits) },\n            http: { version: http.version ? String(http.version) : null, methode: http.methode ? String(http.methode) : null },\n            kopf: kopf, kopfAnzahl: zahl(a.kopf_anzahl) || Object.keys(kopf).length, cookieNamen: liste(a.cookie_namen).map(String),\n            gpc: !!a.gpc, dnt: a.dnt !== undefined && a.dnt !== null ? String(a.dnt) : null,\n            befunde: befunde, dauer: zahl(a.dauer_ms), limitRest: zahl(a.limit_rest)\n        };\n    }<\/p>\n<p>    \/** Browser gegen Server: rein. Gibt weitere Befunde und Vergleichszeilen zurueck. *\/\n    function vergleichen(b, br) {\n        var zeilen = []; var befunde = [];\n        var serverSprache = b.kopf['accept-language'] ? b.kopf['accept-language'].split(',')[0].split(';')[0].trim() : null;\n        var browserSprache = br.sprachen.length ? br.sprachen[0] : null;\n        if (serverSprache !== null || browserSprache !== null) {\n            var gleichS = serverSprache !== null && browserSprache !== null && serverSprache.toLowerCase() === browserSprache.toLowerCase();\n            zeilen.push({ key: 'sprache', server: serverSprache || '-', browser: browserSprache || '-', gleich: gleichS });\n            if (!gleichS && serverSprache !== null && browserSprache !== null) { befunde.push({ key: 'b_sprache_abweichend', stufe: 'niedrig', daten: { server: serverSprache, browser: browserSprache } }); }\n        }\n        if (br.gpc !== null) {\n            var gleichG = br.gpc === b.gpc;\n            zeilen.push({ key: 'gpc', server: b.gpc ? '1' : '-', browser: br.gpc ? 'true' : 'false', gleich: gleichG });\n            if (!gleichG) { befunde.push({ key: 'b_gpc_abweichend', stufe: 'niedrig', daten: { server: b.gpc ? '1' : '-', browser: String(br.gpc) } }); }\n        }\n        if (br.ua !== null) {\n            var gleichU = b.kopf['user-agent'] === br.ua;\n            zeilen.push({ key: 'ua', server: b.kopf['user-agent'] || '-', browser: br.ua, gleich: gleichU });\n            if (!gleichU && b.kopf['user-agent']) { befunde.push({ key: 'b_ua_abweichend', stufe: 'info', daten: {} }); }\n        }\n        if (br.zeitzone) {\n            var land = b.rdap && b.rdap.land ? b.rdap.land : null;\n            var europa = \/^Europe\\\/\/.test(br.zeitzone);\n            var landEuropa = land ? \/^(AT|BE|BG|CH|CY|CZ|DE|DK|EE|ES|FI|FR|GB|GR|HR|HU|IE|IS|IT|LI|LT|LU|LV|MC|MT|NL|NO|PL|PT|RO|RS|SE|SI|SK|SM|UA|BA|ME|MK|AL|MD|BY|VA|AD|GI|FO)$\/i.test(land) : null;\n            zeilen.push({ key: 'zeitzone', server: land || '-', browser: br.zeitzone, gleich: landEuropa === null ? null : (landEuropa === europa) });\n            if (landEuropa !== null && landEuropa !== europa) { befunde.push({ key: 'b_zeitzone', stufe: 'niedrig', daten: { zeitzone: br.zeitzone, land: land } }); }\n        }\n        if (br.plattform) {\n            var sp = b.kopf['sec-ch-ua-platform'] ? b.kopf['sec-ch-ua-platform'].replace(\/\"\/g, '') : null;\n            zeilen.push({ key: 'plattform', server: sp || '-', browser: br.plattform, gleich: sp === null ? null : sp === br.plattform });\n        }\n        befunde.push({ key: 'b_geraet', stufe: 'info', daten: { bildschirm: br.bildschirm || '-', dpr: br.dpr === null ? '-' : br.dpr, kerne: br.kerne === null ? '-' : br.kerne, speicher: br.speicher === null ? '-' : br.speicher + ' GB', netz: br.netz || '-', cookies: br.cookies === null ? '-' : (br.cookies ? T.ja : T.nein) } });\n        return { zeilen: zeilen, befunde: befunde };\n    }<\/p>\n<p>    function abfragen() {\n        return fetch(ENDPUNKT, { method: 'GET', cache: 'no-store', credentials: 'same-origin' })\n            .then(function (r) { return r.json().then(function (j) { return j; }, function () { return { fehler: 'antwort' }; }); }, function () { return { fehler: 'netz' }; });\n    }<\/p>\n<p>    window.LW_TEST = window.LW_TEST || {};\n    window.LW_TEST.MI = { bewerten: bewerten, sammeln: sammeln, vergleichen: vergleichen, darstellen: null, text: text, ENDPUNKT: ENDPUNKT, STUFEN: STUFEN, T: T };<\/p>\n<p>    var btn = document.getElementById('mi-btn');\n    var out = document.getElementById('mi-ausgabe');\n    if (!btn || !out) { return; }<\/p>\n<p>    function el(tag, stil, txt) { var e = document.createElement(tag); if (stil) { e.setAttribute('style', stil); } if (txt !== undefined && txt !== null) { e.textContent = txt; } return e; }\n    var UEBERSCHRIFT = 'font-family: \"Nunito Sans\", sans-serif; font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.95rem; margin: 22px 0 8px;';\n    var ZELLE = 'padding: 5px 12px 5px 0; color: var(--text-secondary, #a0a0b0); font-size: 0.87rem;';\n    var ZELLE_WERT = 'padding: 5px 12px 5px 0; color: var(--text-primary, #e8e8ee); font-size: 0.87rem; font-family: monospace; word-break: break-all;';\n    var KASTEN = 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 8px; padding: 14px 16px; margin: 0 0 10px;';\n    var GUT = ' color: #7ee787;', WARN = ' color: #ffa94d;', ROT = ' color: #ff7b72;', GRAU = ' color: #8a8a99;';\n    var FARBEN = { hoch: '#ff7b72', mittel: '#ffa94d', niedrig: '#e3b341', info: '#8a8a99', gut: '#7ee787' };\n    function gitter(sp) { return el('div', 'display: grid; grid-template-columns: ' + sp + '; gap: 0 18px; align-items: baseline;'); }\n    function paar(g, n, w, stil) { g.appendChild(el('div', ZELLE, n)); g.appendChild(el('div', ZELLE_WERT + (stil || ''), w)); }<\/p>\n<p>    function darstellen(b, br, ziel) {\n        ziel.innerHTML = '';\n        if (b.fehler) {\n            var txt = T['fehler_' + b.fehler] || T.fehler_unbekannt;\n            if (b.limit !== null) { txt = txt.replace('{limit}', String(b.limit)); }\n            ziel.appendChild(el('p', ZELLE + WARN + ' margin: 0;', txt));\n            return;\n        }\n        var v = vergleichen(b, br);\n        var alle = b.befunde.concat(v.befunde);\n        var gruppen = {};\n        STUFEN.forEach(function (s) { gruppen[s] = alle.filter(function (f) { return f.stufe === s; }); });<\/p>\n<p>        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_verbindung));\n        var g = gitter('auto auto');\n        paar(g, T.zeile_ip, b.ip + (b.familie ? '  (' + T['familie_' + b.familie] + ')' : '') + (b.port !== null ? ', ' + T.zeile_port + ' ' + b.port : ''));\n        paar(g, T.zeile_ptr, b.ptr || T.wert_keiner, b.ptr ? '' : GRAU);\n        if (b.rdap) { paar(g, T.zeile_netz, (b.rdap.name || '-') + (b.rdap.org ? ' \u2013 ' + b.rdap.org : '') + (b.rdap.land ? ' (' + b.rdap.land + ')' : '') + (b.rdap.rechenzentrum ? ' \u2013 ' + b.rdap.rechenzentrum : ''), b.rdap.rechenzentrum ? WARN : GRAU); }\n        paar(g, T.zeile_tls, b.tls.protokoll ? b.tls.protokoll + (b.tls.cipher ? ', ' + b.tls.cipher : '') + (b.tls.bits ? ' (' + b.tls.bits + ' bit)' : '') : T.wert_keiner, b.tls.protokoll && \/1\\.3\/.test(b.tls.protokoll) ? GUT : (b.tls.protokoll ? '' : ROT));\n        paar(g, T.zeile_http, b.http.version || '-', GRAU);\n        paar(g, T.zeile_cookies, b.cookieNamen.length ? b.cookieNamen.join(', ') : T.wert_keiner, GRAU);\n        if (b.dauer !== null) { paar(g, T.zeile_dauer, b.dauer + ' ms', GRAU); }\n        if (b.limitRest !== null) { paar(g, T.zeile_limit, String(b.limitRest), GRAU); }\n        ziel.appendChild(g);<\/p>\n<p>        var kopfKeys = KOPF_REIHE.filter(function (k) { return typeof b.kopf[k] === 'string'; });\n        ziel.appendChild(el('div', UEBERSCHRIFT, text('h_kopf', { n: kopfKeys.length })));\n        var gk = gitter('auto auto');\n        kopfKeys.forEach(function (k) { paar(gk, k, b.kopf[k], (k === 'sec-gpc' || k === 'dnt') ? GUT : (k === 'user-agent' ? '' : GRAU)); });\n        ziel.appendChild(gk);<\/p>\n<p>        if (v.zeilen.length) {\n            ziel.appendChild(el('div', UEBERSCHRIFT, T.h_vergleich));\n            var huelle = el('div', 'overflow-x: auto;');\n            var gv = gitter('auto auto auto auto');\n            [T.spalte_merkmal, T.server_sieht, T.browser_sagt, ''].forEach(function (s) { gv.appendChild(el('div', ZELLE + ' font-weight: 700; color: var(--text-primary, #e8e8ee); white-space: nowrap;', s)); });\n            v.zeilen.forEach(function (z) {\n                gv.appendChild(el('div', ZELLE + ' white-space: nowrap;', T['v_' + z.key]));\n                gv.appendChild(el('div', ZELLE_WERT + GRAU, z.server));\n                gv.appendChild(el('div', ZELLE_WERT + GRAU, z.browser));\n                gv.appendChild(el('div', ZELLE_WERT + (z.gleich === null ? GRAU : (z.gleich ? GUT : WARN)), z.gleich === null ? '\u2013' : (z.gleich ? T.gleich : T.verschieden)));\n            });\n            huelle.appendChild(gv);\n            ziel.appendChild(huelle);\n        }<\/p>\n<p>        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_befunde));\n        var irgendwas = false;\n        STUFEN.forEach(function (s) {\n            var gr = gruppen[s];\n            if (!gr.length) { return; }\n            irgendwas = true;\n            ziel.appendChild(el('div', 'font-weight: 700; font-size: 0.82rem; text-transform: uppercase; letter-spacing: 0.5px; margin: 14px 0 6px; color: ' + FARBEN[s] + ';', T['stufe_' + s] + ' (' + gr.length + ')'));\n            gr.forEach(function (f) {\n                var k = el('div', KASTEN + ' border-left: 3px solid ' + FARBEN[s] + ';');\n                var t = text('befund_' + f.key, f.daten) || f.key;\n                var teile = t.split(' || ');\n                k.appendChild(el('div', 'color: var(--text-primary, #e8e8ee); font-size: 0.9rem; font-weight: 700;', teile[0]));\n                if (teile[1]) { k.appendChild(el('div', ZELLE + ' padding: 6px 0 0; line-height: 1.55;', teile[1])); }\n                ziel.appendChild(k);\n            });\n        });\n        if (!irgendwas) { ziel.appendChild(el('p', ZELLE + ' margin: 0;', T.keine_befunde)); }\n    }\n    window.LW_TEST.MI.darstellen = darstellen;<\/p>\n<p>    var laeuft = false;\n    btn.addEventListener('click', function () {\n        if (laeuft) { return; }\n        laeuft = true; btn.disabled = true;\n        out.innerHTML = '';\n        out.appendChild(el('p', ZELLE + GRAU + ' margin: 0;', T.laeuft));\n        var br = sammeln();\n        abfragen().then(function (a) { darstellen(bewerten(a), br, out); laeuft = false; btn.disabled = false; },\n            function () { darstellen(bewerten({ fehler: 'netz' }), br, out); laeuft = false; btn.disabled = false; });\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Shows what this server learns from a visit before any script runs: the address and its network owner, TLS version and cipher, HTTP version, every request header including Global Privacy Control, Do Not Track and Client Hints, and compares it with what the browser itself reports.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":38,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[91279,91243,91115],"class_list":["post-15561","page","type-page","status-publish","hentry","tag-prywatnosc-danych-pl","tag-networking","tag-web-security"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Connection Mirror: What the Server Sees - Lukas Wojcik - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/connection-mirror-what-the-server-sees\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Connection Mirror: What the Server Sees - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Shows what this server learns from a visit before any script runs: the address and its network owner, TLS version and cipher, HTTP version, every request header including Global Privacy Control, Do Not Track and Client Hints, and compares it with what the browser itself reports.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/connection-mirror-what-the-server-sees\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/connection-mirror-what-the-server-sees\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/connection-mirror-what-the-server-sees\\\/\",\"name\":\"Connection Mirror: What the Server Sees - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-05T12:19:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/connection-mirror-what-the-server-sees\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/connection-mirror-what-the-server-sees\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/connection-mirror-what-the-server-sees\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Connection Mirror: What the Server Sees\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"luky\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"luky\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Connection Mirror: What the Server Sees - Lukas Wojcik - Blog","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:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/connection-mirror-what-the-server-sees\/","og_locale":"en_US","og_type":"article","og_title":"Connection Mirror: What the Server Sees - Lukas Wojcik - Blog","og_description":"Shows what this server learns from a visit before any script runs: the address and its network owner, TLS version and cipher, HTTP version, every request header including Global Privacy Control, Do Not Track and Client Hints, and compares it with what the browser itself reports.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/connection-mirror-what-the-server-sees\/","og_site_name":"Lukas Wojcik - Blog","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/connection-mirror-what-the-server-sees\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/connection-mirror-what-the-server-sees\/","name":"Connection Mirror: What the Server Sees - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-09-05T12:19:41+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/connection-mirror-what-the-server-sees\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/connection-mirror-what-the-server-sees\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/connection-mirror-what-the-server-sees\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/"},{"@type":"ListItem","position":3,"name":"Connection Mirror: What the Server Sees"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"luky","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"luky"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/15561","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=15561"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/15561\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/38"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=15561"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=15561"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}