<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-15 -->
<p>Geode documentation tagged with <strong>QUIC Protocol</strong>. QUIC (Quick UDP Internet Connections) is a modern transport protocol that provides the reliability of TCP with the performance of UDP, featuring built-in encryption, multiplexing, and connection migration.</p>
<h3 id="introduction-to-quic" class="position-relative d-flex align-items-center group">
<span>Introduction to QUIC</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="introduction-to-quic"
aria-haspopup="dialog"
aria-label="Share link: Introduction to QUIC">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><div id="headingShareModal" class="heading-share-modal" role="dialog" aria-modal="true" aria-labelledby="headingShareTitle" hidden>
<div class="hsm-dialog" role="document">
<div class="hsm-header">
<h2 id="headingShareTitle" class="h6 mb-0 fw-bold">Share this section</h2>
<button type="button" class="hsm-close" aria-label="Close">
<i class="fa-solid fa-xmark"></i>
</button>
</div>
<div class="hsm-body">
<label for="headingShareInput" class="form-label small text-muted mb-1 text-uppercase fw-bold" style="font-size: 0.7rem; letter-spacing: 0.5px;">Permalink</label>
<div class="input-group mb-4 hsm-url-group">
<input id="headingShareInput" type="text" class="form-control font-monospace" readonly aria-readonly="true" style="font-size: 0.85rem;" />
<button class="btn btn-primary hsm-copy" type="button" aria-label="Copy" title="Copy">
<i class="fa-duotone fa-clipboard" aria-hidden="true"></i>
</button>
</div>
<div class="small fw-bold mb-2 text-muted text-uppercase" style="font-size: 0.7rem; letter-spacing: 0.5px;">Share via</div>
<div class="hsm-share-grid">
<a id="share-twitter" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-twitter me-2"></i>Twitter
</a>
<a id="share-linkedin" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-linkedin me-2"></i>LinkedIn
</a>
<a id="share-facebook" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-facebook me-2"></i>Facebook
</a>
</div>
</div>
</div>
</div>
<style>
.heading-share-modal {
position: fixed;
inset: 0;
display: flex;
justify-content: center;
align-items: center;
background: rgba(0, 0, 0, 0.6);
z-index: 1050;
padding: 1rem;
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
}
.heading-share-modal[hidden] { display: none !important; }
.hsm-dialog {
max-width: 420px;
width: 100%;
background: var(--bs-body-bg, #fff);
color: var(--bs-body-color, #212529);
border: 1px solid var(--bs-border-color, rgba(0,0,0,0.1));
border-radius: 1rem;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
overflow: hidden;
animation: hsm-fade-in 0.2s ease-out;
}
@keyframes hsm-fade-in {
from { opacity: 0; transform: scale(0.95); }
to { opacity: 1; transform: scale(1); }
}
[data-bs-theme="dark"] .hsm-dialog {
background: #1e293b;
border-color: rgba(255,255,255,0.1);
color: #f8f9fa;
}
.hsm-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 1.5rem;
border-bottom: 1px solid var(--bs-border-color, rgba(0,0,0,0.1));
background: rgba(0,0,0,0.02);
}
[data-bs-theme="dark"] .hsm-header {
background: rgba(255,255,255,0.02);
border-color: rgba(255,255,255,0.1);
}
.hsm-close {
background: transparent;
border: none;
color: inherit;
opacity: 0.5;
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
font-size: 1.2rem;
line-height: 1;
transition: opacity 0.2s;
}
.hsm-close:hover {
opacity: 1;
}
.hsm-body {
padding: 1.5rem;
}
.hsm-url-group {
display: flex !important;
align-items: stretch;
}
.hsm-url-group .form-control {
flex: 1;
min-width: 0;
margin: 0;
background: var(--bs-secondary-bg, #f8f9fa);
border-color: var(--bs-border-color, #dee2e6);
border-top-right-radius: 0;
border-bottom-right-radius: 0;
height: 42px;
}
.hsm-url-group .btn {
flex: 0 0 auto;
margin: 0;
margin-left: -1px;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
height: 42px;
display: flex;
align-items: center;
justify-content: center;
padding: 0 1.25rem;
z-index: 2;
}
[data-bs-theme="dark"] .hsm-url-group .form-control {
background: #0f172a;
border-color: #334155;
color: #e2e8f0;
}
.hsm-share-grid {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.hsm-share-grid .btn {
display: flex;
align-items: center;
justify-content: center;
font-size: 0.9rem;
padding: 0.6rem;
border-color: var(--bs-border-color);
width: 100%;
}
[data-bs-theme="dark"] .hsm-share-grid .btn {
color: #e2e8f0;
border-color: #475569;
}
[data-bs-theme="dark"] .hsm-share-grid .btn:hover {
background: #334155;
border-color: #cbd5e1;
}
</style>
<script>
(function(){
const modal = document.getElementById('headingShareModal');
if(!modal) return;
const input = modal.querySelector('#headingShareInput');
const copyBtn = modal.querySelector('.hsm-copy');
const twitter = modal.querySelector('#share-twitter');
const linkedin = modal.querySelector('#share-linkedin');
const facebook = modal.querySelector('#share-facebook');
const closeBtn = modal.querySelector('.hsm-close');
let lastFocus=null;
let trapBound=false;
function buildUrl(id){ return window.location.origin + window.location.pathname + '#' + id; }
function isOpen(){ return !modal.hasAttribute('hidden'); }
function hydrate(id){
const url=buildUrl(id);
input.value=url;
const enc=encodeURIComponent(url);
const text=encodeURIComponent(document.title);
if(twitter) twitter.href=`https://twitter.com/intent/tweet?url=${enc}&text=${text}`;
if(linkedin) linkedin.href=`https://www.linkedin.com/sharing/share-offsite/?url=${enc}`;
if(facebook) facebook.href=`https://www.facebook.com/sharer/sharer.php?u=${enc}`;
}
function openModal(id){
lastFocus=document.activeElement;
hydrate(id);
if(!isOpen()){
modal.removeAttribute('hidden');
}
requestAnimationFrame(()=>{ input.focus(); });
trapFocus();
}
function closeModal(){
if(!isOpen()) return;
modal.setAttribute('hidden','');
if(lastFocus && typeof lastFocus.focus==='function') lastFocus.focus();
}
function copyCurrent(){
try{ navigator.clipboard.writeText(input.value).then(()=>feedback(true),()=>fallback()); }
catch(e){ fallback(); }
}
function fallback(){ input.select(); try{ document.execCommand('copy'); feedback(true);}catch(e){ feedback(false);} }
function feedback(ok){ if(!copyBtn) return; const icon=copyBtn.querySelector('i'); if(!icon) return; const prev=copyBtn.getAttribute('data-prev')||icon.className; if(!copyBtn.getAttribute('data-prev')) copyBtn.setAttribute('data-prev',prev); icon.className= ok ? 'fa-duotone fa-clipboard-check':'fa-duotone fa-circle-exclamation'; setTimeout(()=>{ icon.className=prev; },1800); }
function handleShareClick(e){ e.preventDefault(); const btn=e.currentTarget; const id=btn.getAttribute('data-share-target'); if(id) openModal(id); }
function bindShareButtons(){
document.querySelectorAll('.h-share').forEach(btn=>{
if(!btn.dataset.hShareBound){ btn.addEventListener('click', handleShareClick); btn.dataset.hShareBound='1'; }
});
}
bindShareButtons();
if(document.readyState==='loading'){
document.addEventListener('DOMContentLoaded', bindShareButtons);
} else {
requestAnimationFrame(bindShareButtons);
}
document.addEventListener('click', function(e){
const shareBtn=e.target.closest && e.target.closest('.h-share');
if(shareBtn && !shareBtn.dataset.hShareBound){ handleShareClick.call(shareBtn, e); }
}, true);
document.addEventListener('click', e=>{
if(e.target===modal) closeModal();
if(e.target.closest && e.target.closest('.hsm-close')){ e.preventDefault(); closeModal(); }
if(copyBtn && (e.target===copyBtn || (e.target.closest && e.target.closest('.hsm-copy')))) { e.preventDefault(); copyCurrent(); }
});
document.addEventListener('keydown', e=>{ if(e.key==='Escape' && isOpen()) closeModal(); });
function trapFocus(){
if(trapBound) return;
trapBound=true;
modal.addEventListener('keydown', f=>{ if(f.key==='Tab' && isOpen()){ const focusable=[...modal.querySelectorAll('a[href],button,input,textarea,select,[tabindex]:not([tabindex="-1"])')].filter(el=>!el.hasAttribute('disabled')); if(!focusable.length) return; const first=focusable[0]; const last=focusable[focusable.length-1]; if(f.shiftKey && document.activeElement===first){ f.preventDefault(); last.focus(); } else if(!f.shiftKey && document.activeElement===last){ f.preventDefault(); first.focus(); } } });
}
if(closeBtn) closeBtn.addEventListener('click', e=>{ e.preventDefault(); closeModal(); });
})();
</script><p>QUIC is a transport layer protocol initially developed by Google and subsequently standardized by the IETF in RFC 9000 (2021). Unlike TCP, which operates over raw IP and requires a separate TLS handshake for encryption, QUIC runs over UDP and integrates encryption directly into the protocol using TLS 1.3. This design eliminates head-of-line blocking, reduces connection establishment latency, and provides robust connection migration for mobile and multi-homed devices.</p>
<p>For database connections, QUIC offers significant advantages over traditional TCP/TLS stacks. The protocol’s stream multiplexing allows multiple concurrent queries over a single connection without one slow query blocking others. Connection migration means mobile applications maintain database connections when switching between WiFi and cellular networks. The 0-RTT resumption feature enables reconnecting clients to send application data immediately without waiting for handshake completion, critical for latency-sensitive applications.</p>
<p>Geode exclusively uses QUIC for client-server communication, running on the standard port 3141. There is no TCP fallback—all connections require QUIC support. This bold design choice reflects confidence in QUIC’s maturity and recognition that modern networks and client libraries have excellent QUIC support. By eliminating TCP compatibility layers, Geode achieves a simpler, more efficient wire protocol with guaranteed encryption and superior performance characteristics.</p>
<h3 id="key-concepts" class="position-relative d-flex align-items-center group">
<span>Key Concepts</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="key-concepts"
aria-haspopup="dialog"
aria-label="Share link: Key Concepts">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="udp-based-transport" class="position-relative d-flex align-items-center group">
<span>UDP-Based Transport</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="udp-based-transport"
aria-haspopup="dialog"
aria-label="Share link: UDP-Based Transport">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>QUIC runs over UDP rather than TCP:</p>
<ul>
<li><strong>User Datagram Protocol</strong>: Connectionless, unreliable packet delivery</li>
<li><strong>QUIC Reliability Layer</strong>: Implements reliable, ordered delivery on top of UDP</li>
<li><strong>Congestion Control</strong>: Advanced congestion algorithms (Cubic, BBR)</li>
<li><strong>Packet Loss Recovery</strong>: Fast retransmission and forward error correction</li>
</ul>
<h4 id="stream-multiplexing" class="position-relative d-flex align-items-center group">
<span>Stream Multiplexing</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="stream-multiplexing"
aria-haspopup="dialog"
aria-label="Share link: Stream Multiplexing">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>QUIC supports multiple independent streams per connection:</p>
<ul>
<li><strong>Bidirectional Streams</strong>: Both endpoints can send and receive</li>
<li><strong>Unidirectional Streams</strong>: Data flows in only one direction</li>
<li><strong>Stream IDs</strong>: Unique identifier for each stream</li>
<li><strong>No Head-of-Line Blocking</strong>: Packet loss on one stream doesn’t affect others</li>
</ul>
<h4 id="integrated-encryption" class="position-relative d-flex align-items-center group">
<span>Integrated Encryption</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="integrated-encryption"
aria-haspopup="dialog"
aria-label="Share link: Integrated Encryption">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>TLS 1.3 is built into QUIC from the ground up:</p>
<ul>
<li><strong>Mandatory Encryption</strong>: All QUIC packets are encrypted</li>
<li><strong>TLS 1.3 Handshake</strong>: Modern, efficient cryptographic handshake</li>
<li><strong>0-RTT Resumption</strong>: Resume previous connection without handshake latency</li>
<li><strong>Forward Secrecy</strong>: Perfect forward secrecy for all connections</li>
</ul>
<h4 id="connection-migration" class="position-relative d-flex align-items-center group">
<span>Connection Migration</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="connection-migration"
aria-haspopup="dialog"
aria-label="Share link: Connection Migration">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>QUIC connections can migrate across network paths:</p>
<ul>
<li><strong>Connection IDs</strong>: Persistent identifier independent of IP address/port</li>
<li><strong>Path Validation</strong>: Verify new paths before migration</li>
<li><strong>Mobile Scenarios</strong>: Seamless WiFi to cellular transitions</li>
<li><strong>Multi-homed Hosts</strong>: Failover between network interfaces</li>
</ul>
<h4 id="1-rtt-connection-establishment" class="position-relative d-flex align-items-center group">
<span>1-RTT Connection Establishment</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="1-rtt-connection-establishment"
aria-haspopup="dialog"
aria-label="Share link: 1-RTT Connection Establishment">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>QUIC combines transport and encryption handshakes:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Client Server
</span></span><span class="line"><span class="cl"> | |
</span></span><span class="line"><span class="cl"> | Initial (ClientHello) |
</span></span><span class="line"><span class="cl"> |------------------------------------>|
</span></span><span class="line"><span class="cl"> | |
</span></span><span class="line"><span class="cl"> | <- Initial (ServerHello, Certificate, Finished)
</span></span><span class="line"><span class="cl"> | <- Handshake (CRYPTO) |
</span></span><span class="line"><span class="cl"> |<------------------------------------|
</span></span><span class="line"><span class="cl"> | |
</span></span><span class="line"><span class="cl"> | Handshake (Finished) |
</span></span><span class="line"><span class="cl"> | 1-RTT (Application Data) |
</span></span><span class="line"><span class="cl"> |------------------------------------>|
</span></span></code></pre></div><p>Compared to TCP + TLS (2-RTT minimum), QUIC achieves 1-RTT connection establishment, and 0-RTT for resumed connections.</p>
<h3 id="how-quic-works-in-geode" class="position-relative d-flex align-items-center group">
<span>How QUIC Works in Geode</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="how-quic-works-in-geode"
aria-haspopup="dialog"
aria-label="Share link: How QUIC Works in Geode">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="wire-protocol-architecture" class="position-relative d-flex align-items-center group">
<span>Wire Protocol Architecture</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="wire-protocol-architecture"
aria-haspopup="dialog"
aria-label="Share link: Wire Protocol Architecture">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Geode’s wire protocol leverages QUIC streams:</p>
<ol>
<li><strong>Connection Establishment</strong>: Client initiates QUIC connection to port 3141</li>
<li><strong>Stream Allocation</strong>: Each query executes on a dedicated bidirectional stream</li>
<li><strong>Request/Response</strong>: Protobuf wire protocol messages flow over streams</li>
<li><strong>Concurrent Queries</strong>: Multiple queries execute in parallel using different streams</li>
<li><strong>Connection Pooling</strong>: Clients maintain persistent QUIC connections</li>
</ol>
<h4 id="protobuf-messages-over-quic" class="position-relative d-flex align-items-center group">
<span>Protobuf Messages Over QUIC</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="protobuf-messages-over-quic"
aria-haspopup="dialog"
aria-label="Share link: Protobuf Messages Over QUIC">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Each QUIC stream carries a request-response conversation using Protobuf messages:</p>
<ul>
<li><code>ExecuteRequest</code> → <code>ExecutionResponse</code> (schema + first page)</li>
<li><code>PullRequest</code> → <code>ExecutionResponse</code> (subsequent pages)</li>
</ul>
<h4 id="stream-management" class="position-relative d-flex align-items-center group">
<span>Stream Management</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="stream-management"
aria-haspopup="dialog"
aria-label="Share link: Stream Management">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Geode uses QUIC streams efficiently:</p>
<ul>
<li><strong>Query Streams</strong>: One bidirectional stream per query</li>
<li><strong>Control Stream</strong>: Stream 0 reserved for connection control messages</li>
<li><strong>CDC Streams</strong>: Unidirectional server-to-client streams for change events</li>
<li><strong>Multiplexing</strong>: Up to 100 concurrent streams per connection by default</li>
</ul>
<h4 id="connection-migration-support" class="position-relative d-flex align-items-center group">
<span>Connection Migration Support</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="connection-migration-support"
aria-haspopup="dialog"
aria-label="Share link: Connection Migration Support">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Geode fully supports QUIC connection migration:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">geode_client</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Client maintains connection during network changes</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span> <span class="o">=</span> <span class="n">geode_client</span><span class="o">.</span><span class="n">open_database</span><span class="p">(</span><span class="s1">'quic://db.example.com:3141'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Execute query on WiFi</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">"MATCH (n:Person) RETURN count(n)"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># User moves from WiFi to cellular - connection migrates automatically</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Network stack detects new path, validates it, and migrates connection</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Subsequent query uses migrated connection without interruption</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">"MATCH (n:Product) RETURN count(n)"</span><span class="p">)</span>
</span></span></code></pre></div>
<h4 id="0-rtt-resumption" class="position-relative d-flex align-items-center group">
<span>0-RTT Resumption</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="0-rtt-resumption"
aria-haspopup="dialog"
aria-label="Share link: 0-RTT Resumption">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Geode supports 0-RTT for repeat connections:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># First connection: 1-RTT handshake</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span> <span class="o">=</span> <span class="n">geode_client</span><span class="o">.</span><span class="n">open_database</span><span class="p">(</span><span class="s1">'quic://db.example.com:3141'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">"MATCH (n) RETURN count(n)"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Server sends session ticket for resumption</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Second connection within ticket lifetime: 0-RTT</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span> <span class="o">=</span> <span class="n">geode_client</span><span class="o">.</span><span class="n">open_database</span><span class="p">(</span><span class="s1">'quic://db.example.com:3141'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Query sent in first packet, no handshake wait</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">"MATCH (n) RETURN count(n)"</span><span class="p">)</span>
</span></span></code></pre></div>
<h3 id="use-cases" class="position-relative d-flex align-items-center group">
<span>Use Cases</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="use-cases"
aria-haspopup="dialog"
aria-label="Share link: Use Cases">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="low-latency-query-execution" class="position-relative d-flex align-items-center group">
<span>Low-Latency Query Execution</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="low-latency-query-execution"
aria-haspopup="dialog"
aria-label="Share link: Low-Latency Query Execution">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">geode_client</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">asyncio</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">measure_query_latency</span><span class="p">():</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Measure end-to-end query latency with QUIC."""</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">geode_client</span><span class="o">.</span><span class="n">open_database</span><span class="p">(</span><span class="s1">'quic://localhost:3141'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">100</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="n">start</span> <span class="o">=</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">get_event_loop</span><span class="p">()</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"MATCH (n:Person {id: $id}) RETURN n.name"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span><span class="s2">"id"</span><span class="p">:</span> <span class="n">i</span><span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">row</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span> <span class="k">else</span> <span class="kc">None</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">latency</span> <span class="o">=</span> <span class="p">(</span><span class="n">asyncio</span><span class="o">.</span><span class="n">get_event_loop</span><span class="p">()</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="n">start</span><span class="p">)</span> <span class="o">*</span> <span class="mi">1000</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Query </span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">latency</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2">ms"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Typical latencies with QUIC:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Local: 0.5-2ms</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Same datacenter: 2-5ms</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Cross-region: 50-150ms</span>
</span></span></code></pre></div>
<h4 id="concurrent-query-execution" class="position-relative d-flex align-items-center group">
<span>Concurrent Query Execution</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="concurrent-query-execution"
aria-haspopup="dialog"
aria-label="Share link: Concurrent Query Execution">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">concurrent_queries</span><span class="p">():</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Execute multiple queries in parallel over QUIC streams."""</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">geode_client</span><span class="o">.</span><span class="n">open_database</span><span class="p">(</span><span class="s1">'quic://localhost:3141'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># All queries use the same QUIC connection but different streams</span>
</span></span><span class="line"><span class="cl"> <span class="n">results</span> <span class="o">=</span> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">gather</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"MATCH (p:Person) RETURN count(p)"</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"MATCH (c:Company) RETURN count(c)"</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"MATCH (p:Product) RETURN count(p)"</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"MATCH ()-[r]->() RETURN count(r)"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">result</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">results</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="n">row</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span> <span class="k">else</span> <span class="kc">None</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Query </span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">row</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="s2"> entities"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># QUIC multiplexing allows all queries to execute concurrently</span>
</span></span><span class="line"><span class="cl"><span class="c1"># without head-of-line blocking</span>
</span></span></code></pre></div>
<h4 id="mobile-application-resilience" class="position-relative d-flex align-items-center group">
<span>Mobile Application Resilience</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="mobile-application-resilience"
aria-haspopup="dialog"
aria-label="Share link: Mobile Application Resilience">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">asyncio</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">geode_client</span> <span class="kn">import</span> <span class="n">GeodeConnectionError</span><span class="p">,</span> <span class="n">open_database</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">MobileClient</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Database client that retries on transient network loss."""</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="bp">self</span><span class="o">.</span><span class="n">client</span> <span class="o">=</span> <span class="n">open_database</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">def</span> <span class="nf">query</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gql</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Execute query with a simple reconnect loop."""</span>
</span></span><span class="line"><span class="cl"> <span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">gql</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span>
</span></span><span class="line"><span class="cl"> <span class="k">except</span> <span class="n">GeodeConnectionError</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.5</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Usage in mobile app</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span> <span class="o">=</span> <span class="n">MobileClient</span><span class="p">(</span><span class="s1">'quic://db.example.com:3141'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Works seamlessly across WiFi/cellular transitions</span>
</span></span><span class="line"><span class="cl"><span class="n">results</span> <span class="o">=</span> <span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">"MATCH (n:Person) RETURN n.name LIMIT 10"</span><span class="p">)</span>
</span></span></code></pre></div>
<h4 id="wan-optimization" class="position-relative d-flex align-items-center group">
<span>WAN Optimization</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="wan-optimization"
aria-haspopup="dialog"
aria-label="Share link: WAN Optimization">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">geode_client</span> <span class="kn">import</span> <span class="n">ConnectionPool</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">wan_optimized_queries</span><span class="p">():</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Optimize queries over high-latency WAN links."""</span>
</span></span><span class="line"><span class="cl"> <span class="n">pool</span> <span class="o">=</span> <span class="n">ConnectionPool</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="s2">"remote-db.example.com"</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">3141</span><span class="p">,</span> <span class="n">max_size</span><span class="o">=</span><span class="mi">20</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">pool</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">def</span> <span class="nf">run_query</span><span class="p">(</span><span class="n">i</span><span class="p">:</span> <span class="nb">int</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">pool</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"MATCH (n:Person {id: $id}) RETURN n"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span><span class="s2">"id"</span><span class="p">:</span> <span class="n">i</span><span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">results</span> <span class="o">=</span> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">gather</span><span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">run_query</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">50</span><span class="p">)))</span>
</span></span></code></pre></div>
<h3 id="best-practices" class="position-relative d-flex align-items-center group">
<span>Best Practices</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="best-practices"
aria-haspopup="dialog"
aria-label="Share link: Best Practices">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="connection-management" class="position-relative d-flex align-items-center group">
<span>Connection Management</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="connection-management"
aria-haspopup="dialog"
aria-label="Share link: Connection Management">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ol>
<li><strong>Connection Pooling</strong>: Reuse QUIC connections for multiple queries</li>
<li><strong>Connection Limits</strong>: Configure appropriate max streams per connection</li>
<li><strong>Idle Timeout</strong>: Set reasonable idle timeout for connection reuse</li>
<li><strong>Graceful Shutdown</strong>: Close streams and connections cleanly</li>
</ol>
<h4 id="performance-tuning" class="position-relative d-flex align-items-center group">
<span>Performance Tuning</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="performance-tuning"
aria-haspopup="dialog"
aria-label="Share link: Performance Tuning">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ol>
<li><strong>Stream Concurrency</strong>: Adjust max concurrent streams for workload</li>
<li><strong>Congestion Control</strong>: Choose appropriate algorithm (Cubic vs BBR)</li>
<li><strong>0-RTT Enablement</strong>: Enable for repeat connections to reduce latency</li>
<li><strong>Buffer Sizes</strong>: Tune send/receive buffers for throughput</li>
</ol>
<h4 id="security-configuration" class="position-relative d-flex align-items-center group">
<span>Security Configuration</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="security-configuration"
aria-haspopup="dialog"
aria-label="Share link: Security Configuration">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ol>
<li><strong>Certificate Validation</strong>: Always validate server certificates</li>
<li><strong>TLS 1.3 Only</strong>: Ensure only TLS 1.3 is enabled</li>
<li><strong>Cipher Suites</strong>: Use strong, modern cipher suites</li>
<li><strong>Session Tickets</strong>: Manage session ticket security appropriately</li>
</ol>
<h4 id="network-considerations" class="position-relative d-flex align-items-center group">
<span>Network Considerations</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="network-considerations"
aria-haspopup="dialog"
aria-label="Share link: Network Considerations">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ol>
<li><strong>Firewall Rules</strong>: Ensure UDP port 3141 is open</li>
<li><strong>NAT Traversal</strong>: QUIC handles NAT better than TCP</li>
<li><strong>Path MTU</strong>: QUIC performs automatic path MTU discovery</li>
<li><strong>QoS</strong>: Configure appropriate QoS for UDP traffic</li>
</ol>
<h3 id="performance-considerations" class="position-relative d-flex align-items-center group">
<span>Performance Considerations</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="performance-considerations"
aria-haspopup="dialog"
aria-label="Share link: Performance Considerations">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="latency-improvements" class="position-relative d-flex align-items-center group">
<span>Latency Improvements</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="latency-improvements"
aria-haspopup="dialog"
aria-label="Share link: Latency Improvements">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>QUIC reduces latency through:</p>
<ul>
<li><strong>1-RTT Handshake</strong>: 50% faster than TCP+TLS</li>
<li><strong>0-RTT Resumption</strong>: Eliminates handshake for repeat connections</li>
<li><strong>No Head-of-Line Blocking</strong>: Packet loss doesn’t block other streams</li>
<li><strong>Fast Retransmission</strong>: Rapid packet loss recovery</li>
</ul>
<p>Typical improvements over TCP+TLS:</p>
<ul>
<li>First connection: 20-30% faster</li>
<li>Resumed connection: 50-70% faster</li>
<li>Lossy networks: 2-5x faster query execution</li>
</ul>
<h4 id="throughput-characteristics" class="position-relative d-flex align-items-center group">
<span>Throughput Characteristics</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="throughput-characteristics"
aria-haspopup="dialog"
aria-label="Share link: Throughput Characteristics">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>QUIC throughput is excellent:</p>
<ul>
<li><strong>Single Stream</strong>: Comparable to TCP (within 5%)</li>
<li><strong>Multiple Streams</strong>: 50-200% better than TCP due to multiplexing</li>
<li><strong>Lossy Links</strong>: 100-300% better than TCP</li>
<li><strong>High-Latency Links</strong>: BBR congestion control excels</li>
</ul>
<h4 id="resource-usage" class="position-relative d-flex align-items-center group">
<span>Resource Usage</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="resource-usage"
aria-haspopup="dialog"
aria-label="Share link: Resource Usage">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>QUIC resource consumption is modest:</p>
<ul>
<li><strong>Memory</strong>: ~100KB per connection (vs ~50KB for TCP+TLS)</li>
<li><strong>CPU</strong>: ~10% higher than TCP+TLS for encryption/decryption</li>
<li><strong>Bandwidth</strong>: 1-2% overhead from QUIC headers</li>
<li><strong>Ports</strong>: Single UDP port vs separate TCP ports</li>
</ul>
<h3 id="troubleshooting" class="position-relative d-flex align-items-center group">
<span>Troubleshooting</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="troubleshooting"
aria-haspopup="dialog"
aria-label="Share link: Troubleshooting">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="connection-failures" class="position-relative d-flex align-items-center group">
<span>Connection Failures</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="connection-failures"
aria-haspopup="dialog"
aria-label="Share link: Connection Failures">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Symptom</strong>: Unable to establish QUIC connection</p>
<p><strong>Solutions</strong>:</p>
<ul>
<li>Verify UDP port 3141 is reachable</li>
<li>Check firewall rules allow UDP traffic</li>
<li>Ensure client supports QUIC (all official clients do)</li>
<li>Verify server certificate is valid</li>
<li>Check for NAT or middlebox interference</li>
</ul>
<h4 id="high-latency" class="position-relative d-flex align-items-center group">
<span>High Latency</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="high-latency"
aria-haspopup="dialog"
aria-label="Share link: High Latency">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Symptom</strong>: Queries slower than expected</p>
<p><strong>Solutions</strong>:</p>
<ul>
<li>Check network latency with ping/traceroute</li>
<li>Verify no packet loss on link</li>
<li>Tune congestion control algorithm</li>
<li>Increase max concurrent streams</li>
<li>Enable 0-RTT for repeat connections</li>
</ul>
<h4 id="stream-errors" class="position-relative d-flex align-items-center group">
<span>Stream Errors</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="stream-errors"
aria-haspopup="dialog"
aria-label="Share link: Stream Errors">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Symptom</strong>: Stream reset or connection closed unexpectedly</p>
<p><strong>Solutions</strong>:</p>
<ul>
<li>Check for max streams exceeded</li>
<li>Verify proper stream lifecycle management</li>
<li>Review server logs for errors</li>
<li>Ensure queries complete before closing streams</li>
<li>Monitor connection idle timeout</li>
</ul>
<h4 id="connection-migration-issues" class="position-relative d-flex align-items-center group">
<span>Connection Migration Issues</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="connection-migration-issues"
aria-haspopup="dialog"
aria-label="Share link: Connection Migration Issues">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Symptom</strong>: Connection fails during network transition</p>
<p><strong>Solutions</strong>:</p>
<ul>
<li>Verify connection migration is enabled</li>
<li>Check path validation succeeds</li>
<li>Review NAT rebinding behavior</li>
<li>Ensure sufficient timeout for migration</li>
<li>Monitor connection ID management</li>
</ul>
<h3 id="related-topics" class="position-relative d-flex align-items-center group">
<span>Related Topics</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="related-topics"
aria-haspopup="dialog"
aria-label="Share link: Related Topics">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><ul>
<li><a
href="/tags/protocol/"
>Protocol</a>
- Wire protocol specification</li>
<li><a
href="/tags/networking/"
>Networking</a>
- Network architecture and design</li>
<li><a
href="/tags/encryption/"
>TLS/Encryption</a>
- Transport security</li>
<li><a
href="/tags/performance/"
>Performance</a>
- Performance optimization</li>
<li><a
href="/tags/client-library/"
>Client Libraries</a>
- Client implementation details</li>
<li><a
href="/tags/connections/"
>Connections</a>
- Connection management</li>
</ul>
<h3 id="further-reading" class="position-relative d-flex align-items-center group">
<span>Further Reading</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="further-reading"
aria-haspopup="dialog"
aria-label="Share link: Further Reading">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><ul>
<li><a
href="https://datatracker.ietf.org/doc/html/rfc9000"
aria-label="QUIC Specification (RFC 9000) – opens in new window"
target="_blank" rel="noopener noreferrer"
>QUIC Specification (RFC 9000)
<span aria-hidden="true" class="external-icon">↗</span>
</a>
- Official IETF specification</li>
<li><a
href="/docs/architecture/wire-protocol/"
>Wire Protocol</a>
- Protobuf wire protocol over QUIC</li>
<li><a
href="/docs/configuration/server-configuration/"
>Server Configuration</a>
- Server and connection configuration options</li>
<li><a
href="/docs/query/performance-tuning/"
>Performance Tuning</a>
- Optimizing connections and queries</li>
<li><a
href="/docs/protocol/"
>Protocol Documentation</a>
- Geode protocol design</li>
</ul>
Related Articles
Go Client
Official Go database/sql driver for Geode graph database over QUIC + TLS 1.3
Python Client
Official async Python client for Geode graph database with QUIC + TLS 1.3
Rust Client
Official Rust client for Geode graph database with Quinn QUIC transport and async tokio support
Zig Client
Official Zig client for Geode graph database with low-level QUIC access
Node.js Client
Official Node.js and TypeScript client for Geode graph database