# 200 Milliseconds An interactive page at 200ms.thenodebook.com answering "what happens when you type a URL and press Enter" / "what happens when you click Buy" with a fixed, honest scenario: one HTTP POST from a laptop on coffee-shop Wi-Fi in San Francisco to a Node.js API server on EC2 in Ashburn, Virginia, and back. Scroll distance equals time elapsed; the journey ends at t = 211.4 ms. The page assumes readers know JavaScript but not networking: every term of art (packet, port, socket, handshake, certificate, interrupt) is explained in plain language on first use, with a tooltip glossary behind each one. A plain-article rendering with the full glossary and numbers appendix lives at 200ms.thenodebook.com?article=1. The timeline, act by act: 0. Prologue (before t=0). The cast: laptop, coffee-shop access point, ISP, ~4,700 km of fiber, a network load balancer in Ashburn, EC2 instance running node (PID 1447, one of 4), Postgres one availability zone away. Cold connection: no keep-alive socket, no TLS session ticket. 1. The Click (0-5 ms). Touchpad interrupt, HID driver, Chrome hit-testing the layout tree, click listener, fetch('/api/checkout'). HSTS forces HTTPS. Cache cascade misses (POST is uncacheable). No warm socket in the connection pool. The raw HTTP request is drafted: 203 bytes, 9 lines, body {"sku":"NB-1","qty":1} (22 bytes), including the header X-Powered-By-Curiosity: nodebook. 2. The Address (5-7 ms). Browser and OS DNS caches miss; UDP query (~48 bytes, QNAME 3api11thenodebook3com0) to an anycast resolver reached in San Jose in 2 ms; resolver cache hit (TTL 300, 212 s remaining): 3.213.44.7. The cold path (root, .com, authoritative) happened 88 seconds ago for someone else. 3. The Handshakes (7-134 ms). socket(), connect(), ephemeral port 49732. The SYN wrapped in TCP/IP/802.11 (MSS 1460, SACK, window scaling, TTL 64). CSMA/CA Wi-Fi contention costs +1.2 ms. NAT at the router. BGP: local ISP -> Lumen -> AS16509. The long haul: SF-Sacramento-Salt Lake-Denver-Chicago-Ashburn at 2/3 c, EDFA amplifiers every ~80 km, ~31 ms one way. NLB (L4) forwards to the instance. SYN queue, SYN-ACK west, ACK east (backlog 511). TLS 1.3: ClientHello (SNI plaintext, X25519 key_share guess) rides with the ACK; ServerHello + certificate chain + Finished return; HKDF derives session keys. Four crossings total in this act. 4. The Request Travels (134-165 ms). Client Finished + encrypted POST ride together (AES-256-GCM). The sealed POST is a 225-byte TLS record (203 bytes of plaintext + 22 bytes of TLS overhead), under 300 bytes on the wire with TCP and IP headers: one segment, well inside initcwnd 10. Fifth crossing, eastbound. 5. Arrival: The Kernel (165-165.05 ms; 50 microseconds). NIC checksum in silicon, DMA into a ring buffer, IRQ, NAPI polling, softirq TCP/IP processing, four-tuple hash lookup among 12,408 sockets, payload queued in the receive buffer, epoll ready list gains one entry, a thread sleeping in epoll_wait inside node wakes. 6. Inside Node.js (165.05-165.4 ms). libuv poll phase, read() into a slab, TLSWrap/OpenSSL decrypt, llhttp parses byte by byte, IncomingMessage/ServerResponse created, 'request' emitted, route matched. The handler: 11 lines. This is request #1,203,001, on event-loop iteration #48,113,207, in a process deployed 23 days ago. await db.query parks it on the microtask queue; the loop serves ~30 other requests during the wait. V8 JIT-compiled this path long ago. 7. The Database (165.4-167.5 ms). Warm connection from a pool of 10 opened at deploy, Postgres extended protocol (Parse/Bind/Execute), 0.35 ms same-AZ RTT, index scan on orders_pkey (~1.2M rows, B-tree depth 3), INSERT hits the WAL, group commit, fsync. Rows return. 8. The Response Rises (167.5-168 ms). Handler resumes, JSON.stringify produces {"ok":true,"id":1203982} (24 bytes; with 132 bytes of headers it seals into one 178-byte TLS record), res.end(), cork/uncork, TCP_NODELAY (no Nagle: saves ~40 ms), writev, out the NIC. 9. The Return and the Paint (168-211.4 ms). Sixth crossing west. Client kernel intake, Chrome socket thread, TLS decrypt, fetch promise resolves, DOM updates, style/layout/paint/composite, then up to 16.7 ms waiting for vsync. The pixel flips at t = 211.4 ms. 10. Epilogue. Totals: 211 ms, ~28,000 km, 6 crossings, ~40 machines, 3 protocol handshakes, 1 Wi-Fi retransmission, 11 lines of your code. A warm second request costs ~95 ms. Where the time went: handshakes 127 ms (60%), request+response flight 74 ms (35%), everything on the server including the kernel and database under 3 ms (1.4%). Latency lives in the speed of light, not in your code. Every number on the page carries a footnote with its derivation. The page is a companion to nodebook (thenodebook.com), a book series on backend engineering with Node.js.