<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[System Design, Made Simple]]></title><description><![CDATA[System Design, Made Simple]]></description><link>https://systemdesignmadesimple.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Sun, 25 Oct 2026 14:21:21 GMT</lastBuildDate><atom:link href="https://systemdesignmadesimple.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Behind Video Calls: WebRTC, SFU, and MCU Explained with Real-World System Design]]></title><description><![CDATA[Discover how video calls work behind the scenes with WebRTC, SFU, and MCU, explained using real-world system design examples and trade-offs.]]></description><link>https://systemdesignmadesimple.hashnode.dev/behind-video-calls-webrtc-sfu-and-mcu-explained-with-real-world-system-design</link><guid isPermaLink="true">https://systemdesignmadesimple.hashnode.dev/behind-video-calls-webrtc-sfu-and-mcu-explained-with-real-world-system-design</guid><category><![CDATA[System Design]]></category><category><![CDATA[System Architecture]]></category><category><![CDATA[WebRTC technology]]></category><category><![CDATA[webrtc video conferencing]]></category><category><![CDATA[Programming Blogs]]></category><category><![CDATA[SFU]]></category><dc:creator><![CDATA[Subransu Sekhar Maharana]]></dc:creator><pubDate>Tue, 06 Jan 2026 15:32:46 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1767592876161/1bb7464f-e217-4788-b617-4772e14a94bc.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-why-video-conferencing-is-a-hard-problem">Why Video Conferencing Is a Hard Problem</h3>
<p>Explain:</p>
<ul>
<li><p>Real-time audio/video</p>
</li>
<li><p>Low latency (&lt;200ms)</p>
</li>
<li><p>Packet loss, NAT, firewalls</p>
</li>
<li><p>Scaling from 2 → 10,000 users</p>
</li>
</ul>
<p><strong>Key insight:</strong></p>
<blockquote>
<p>Video calls are not just “streaming” — they’re <strong>distributed real-time systems</strong>.</p>
</blockquote>
<h3 id="heading-what-is-webrtc-foundation-layer">What Is WebRTC? (Foundation Layer)</h3>
<p><strong>WebRTC = real-time communication protocol</strong></p>
<p>Handles:</p>
<ul>
<li><p>Media capture (camera/mic)</p>
</li>
<li><p>Encoding (VP8, H.264, Opus)</p>
</li>
<li><p>NAT traversal (STUN / TURN)</p>
</li>
<li><p>Secure transport (DTLS, SRTP)</p>
</li>
</ul>
<p>⚠️ <strong>Important:</strong><br />WebRTC <strong>does NOT define architecture</strong> (P2P / SFU / MCU).<br />It only provides the <strong>pipes</strong>.</p>
<h3 id="heading-architecture-1-peer-to-peer-mesh">Architecture #1 — Peer-to-Peer (Mesh)</h3>
<h4 id="heading-how-it-works">How it works</h4>
<p>Each participant sends streams to <strong>every other participant</strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1767587881616/55bbb50c-ec6b-4e08-963d-faefc0ac2654.png" alt class="image--center mx-auto" /></p>
<h4 id="heading-pros">Pros</h4>
<ul>
<li><p>Lowest latency</p>
</li>
<li><p>No media server cost</p>
</li>
<li><p>Simple to implement</p>
</li>
</ul>
<h4 id="heading-cons">Cons</h4>
<ul>
<li><p>Bandwidth explodes (O(n²))</p>
</li>
<li><p>CPU overload on clients</p>
</li>
<li><p>Breaks beyond 3–4 users</p>
</li>
</ul>
<h4 id="heading-real-world-use">Real-world use</h4>
<ul>
<li><p>1-to-1 calls (WhatsApp, FaceTime)</p>
</li>
<li><p>Small internal tools</p>
</li>
</ul>
<blockquote>
<p>❌ Not suitable for meetings</p>
</blockquote>
<h3 id="heading-architecture-2-mcu-multipoint-control-unit">Architecture #2 — MCU (Multipoint Control Unit)</h3>
<h4 id="heading-how-it-works-1">How it works</h4>
<ul>
<li><p>All streams go to a <strong>central server</strong></p>
</li>
<li><p>Server decodes, mixes, re-encodes</p>
</li>
<li><p>Sends <strong>one combined stream</strong> back</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1767589372946/947d0df1-fb34-4ec5-849a-fda95661aeec.png" alt class="image--center mx-auto" /></p>
</li>
</ul>
<h4 id="heading-pros-1">Pros</h4>
<ul>
<li><p>Very low client bandwidth</p>
</li>
<li><p>Simple clients (mobile friendly)</p>
</li>
<li><p>Easy recording</p>
</li>
</ul>
<h4 id="heading-cons-1">Cons</h4>
<ul>
<li><p>Extremely CPU expensive</p>
</li>
<li><p>High server cost</p>
</li>
<li><p>Added latency</p>
</li>
<li><p>Poor scalability</p>
</li>
</ul>
<h4 id="heading-real-world-use-1">Real-world use</h4>
<ul>
<li><p>Legacy enterprise systems</p>
</li>
<li><p>Hardware conference rooms</p>
</li>
<li><p>PSTN bridges</p>
</li>
</ul>
<blockquote>
<p>❌ Rarely used today for large-scale apps</p>
</blockquote>
<h3 id="heading-architecture-3-sfu-selective-forwarding-unit">Architecture #3 — SFU (Selective Forwarding Unit) ⭐</h3>
<h4 id="heading-how-it-works-2">How it works</h4>
<ul>
<li><p>Clients send streams to SFU</p>
</li>
<li><p>SFU <strong>does not decode</strong></p>
</li>
<li><p>Forwards streams selectively</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1767590491434/6e120cd9-7824-4082-8748-0f18200a182e.png" alt class="image--center mx-auto" /></p>
</li>
</ul>
<p>Clients decide:</p>
<ul>
<li><p>Which streams to render</p>
</li>
<li><p>Which resolution to request</p>
</li>
</ul>
<h4 id="heading-pros-2">Pros</h4>
<ul>
<li><p>Scales to thousands</p>
</li>
<li><p>Low server CPU</p>
</li>
<li><p>Flexible layouts</p>
</li>
<li><p>Adaptive quality</p>
</li>
</ul>
<h4 id="heading-cons-2">Cons</h4>
<ul>
<li><p>Higher client complexity</p>
</li>
<li><p>More client bandwidth than MCU</p>
</li>
</ul>
<h4 id="heading-real-world-use-2">Real-world use</h4>
<p>✅ Zoom<br />✅ Google Meet<br />✅ Discord<br />✅ Microsoft Teams<br />✅ Webinars &amp; live classrooms</p>
<blockquote>
<p>⭐ <strong>SFU is the industry standard</strong></p>
</blockquote>
<h2 id="heading-why-sfu-wins-in-the-real-world">Why SFU Wins in the Real World</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Feature</td><td>P2P</td><td>MCU</td><td>SFU</td></tr>
</thead>
<tbody>
<tr>
<td>Scalability</td><td>❌</td><td>⚠️</td><td>✅</td></tr>
<tr>
<td>Latency</td><td>✅</td><td>❌</td><td>✅</td></tr>
<tr>
<td>Server Cost</td><td>✅</td><td>❌</td><td>✅</td></tr>
<tr>
<td>Client Load</td><td>❌</td><td>✅</td><td>⚠️</td></tr>
<tr>
<td>Recording</td><td>❌</td><td>✅</td><td>⚠️</td></tr>
<tr>
<td>Modern Usage</td><td>❌</td><td>❌</td><td>✅</td></tr>
</tbody>
</table>
</div><h3 id="heading-real-world-system-design-zoom-meet-style">Real-World System Design (Zoom / Meet-Style)</h3>
<h4 id="heading-components">Components:</h4>
<ul>
<li><p>Signaling Server (WebSocket)</p>
</li>
<li><p>SFU Media Server</p>
</li>
<li><p>TURN servers (fallback)</p>
</li>
<li><p>Load balancer</p>
</li>
<li><p>Region-aware routing</p>
</li>
</ul>
<h4 id="heading-flow">Flow:</h4>
<ol>
<li><p>User joins meeting</p>
</li>
<li><p>Signaling server exchanges SDP</p>
</li>
<li><p>Media flows to SFU</p>
</li>
<li><p>SFU forwards streams</p>
</li>
<li><p>Active speaker detection</p>
</li>
<li><p>Dynamic bitrate adaptation</p>
</li>
</ol>
<h2 id="heading-references-amp-further-reading">References &amp; Further Reading</h2>
<h3 id="heading-core-webrtc-amp-architecture-references">📚 Core WebRTC &amp; Architecture References</h3>
<ol>
<li><p><a target="_blank" href="https://webrtc.org/"><strong>WebRTC Official Documentation</strong></a><br /> <em>Best for fundamentals, APIs, codecs, and transport details</em><br /> → Covers ICE, STUN/TURN, DTLS, SRTP, media pipelines</p>
</li>
<li><p><strong>IETF RFCs (WebRTC Standards)</strong></p>
<ul>
<li><p><a target="_blank" href="https://www.rfc-editor.org/info/rfc8825">RFC 8825</a> – WebRTC Overview</p>
</li>
<li><p><a target="_blank" href="https://www.rfc-editor.org/info/rfc8834">RFC 8834</a> – Media Transport and Security<br />  <em>Best for protocol-level accuracy</em></p>
</li>
</ul>
</li>
</ol>
<h3 id="heading-sfu-mcu-conceptual-deep-dives">🏗️ SFU / MCU Conceptual Deep Dives</h3>
<ol start="3">
<li><p><a target="_blank" href="https://jitsi.support/how-to/jitsi-architecture-explained/"><strong>Jitsi Architecture Docs</strong></a><br /> <em>Excellent real-world SFU explanation (Jitsi Videobridge)</em><br /> → Explains selective forwarding, bandwidth adaptation, scaling</p>
</li>
<li><p><a target="_blank" href="https://janus.conf.meetecho.com/docs/"><strong>Janus WebRTC Server Documentation</strong></a><br /> <em>Great for understanding SFU internals and plugin-based design</em></p>
</li>
<li><p><a target="_blank" href="https://mediasoup.org/documentation/v3/mediasoup/design/"><strong>mediasoup Design Docs</strong></a><br /> <em>Modern SFU used in production systems</em><br /> → Clear explanations of producers, consumers, routers</p>
</li>
</ol>
<h3 id="heading-real-world-product-engineering-blogs">🎥 Real-World Product Engineering Blogs</h3>
<ol start="8">
<li><p><a target="_blank" href="https://developers.zoom.us/blog/"><strong>Zoom Engineering Blog</strong></a><br /> <em>Explains why SFU-like architectures scale better than MCU</em></p>
</li>
<li><p><a target="_blank" href="https://developers.google.com/workspace/meet/media-api/guides/concepts"><strong>Google Meet / WebRTC Engineering Talks</strong></a><br /> <em>Covers simulcast, congestion control, and adaptive streaming</em></p>
</li>
</ol>
]]></content:encoded></item></channel></rss>