Your technical library
Computer Networking
26 modules · 159 topics
About this book
Computer Networking
How does a packet get from a process on one machine to a process on another, reliably and at scale, despite noise, contention, congestion, failure and attackers? This course builds the answer from the wire up, so that you can debug a slow connection, read a packet capture and argue a protocol choice with mechanisms rather than folklore. Each layer inherits a concrete failure from the layer below it — corrupted bits, collisions, a flat address space, unknown paths, loss and reordering, congestion, untrusted parties — and each module says which failure it takes on and which it leaves for the next. It builds on Mathematics, Data Structures, Algorithms, Operating Systems and System Design.
Foundations draws the map. The physical layer, framing and error control, multiple access and Ethernet and wireless links move bits across one link. Internetworking with IP, routing within a network, routing between networks and engineering paths carry packets across many links. Reliable delivery, TCP and congestion control turn lost and reordered packets into a fair, reliable byte stream, and naming and host configuration and address sharing let hosts find one another.
The web comes next: the web over TCP, cryptographic building blocks, TLS, QUIC and HTTP/3 and content delivery. Specialised modules branch from there — mobile networks, securing routing and naming, attacks on hosts and their defences, datacenter networks, software and programmable data paths and real-time media — and measurement and synthesis closes the course.
159 topics across 26 modules, in dependency order.
159 of 159 topics are authored. Read in dependency order: each topic opens with the problem earlier topics left open and closes with what it still leaves open. Planned lessons are labelled and excluded from progress; references cover authored material.
Read at your own pace. Each topic is one continuous page; mark it done as you finish.
Start with 01.1 · What a network is: hosts, links, routers and the network of networksReview what you have finished↷ 0 skipped topics- 01.1What a network is: hosts, links, routers and the network of networks
- 01.2Packet switching: why the Internet is not a telephone network
- 01.3Delay components: transmission, propagation and processing
- 01.4Queueing delay and loss: what a full buffer does
- 01.5Throughput: the bottleneck link sets the rate
- 01.6The bandwidth–delay product: bits in flight
- 01.7What a protocol is: message formats, order and actions
- 01.8Layering and encapsulation: the stack as a design decision
- 01.9Header encoding: fixed fields, byte order and extensibility
- 01.10The end-to-end argument: where functions belong
- 02.1Signals and bandwidth: bits are waveforms in a medium
- 02.2Line coding: sending bits a receiver can clock
- 02.3Nyquist's limit: symbols per second in a finite band
- 02.4Modulation: placing symbols on a carrier
- 02.5Noise and bit errors: SNR and error probability
- 02.6Shannon capacity: the rate no coding can beat
- 02.7Channel multiplexing: FDM, TDM and OFDM
- 04.1ALOHA: random access and its efficiency limit
- 04.2CSMA/CD: listen first, stop when colliding
- 04.3Binary exponential backoff: adapting to unknown load
- 04.4Ethernet frames and MAC addresses
- 04.5Learning switches: forwarding without configuration
- 04.6Spanning tree: loop-free forwarding over a redundant LAN
- 04.7VLANs: several LANs on one set of switches
- 06.1IPv4: a best-effort datagram across any link
- 06.2IP addresses and CIDR: prefixes that aggregate
- 06.3Longest-prefix match: the forwarding lookup
- 06.4ARP: from IP address to MAC address
- 06.5Forwarding versus routing: data plane and control plane
- 06.6Router architecture: ports, fabric and where queues form
- 06.7Fragmentation and MTU: packets larger than a link
- 06.8ICMP: the network's error and diagnostic channel
- 06.9Traceroute: revealing the path with expiring TTLs
- 06.10Path MTU discovery: avoiding fragmentation
- 06.11IPv6: a larger address and a simpler header
- 06.12IPv6 neighbour discovery: ARP and router discovery over ICMPv6
- 06.13IP tunnelling: packets inside packets
- 08.1Autonomous systems: customers, providers and peers
- 08.2BGP: path vectors between autonomous systems
- 08.3BGP route selection: policy first, distance last
- 08.4iBGP and route reflectors: carrying external routes inside an AS
- 08.5Valley-free routing: when policy routing is stable
- 08.6Anycast: one prefix announced from many sites
- 10.1Ports and demultiplexing: from host to process
- 10.2UDP: the minimal transport
- 10.3Stop-and-wait ARQ: acknowledgements, timeouts and sequence numbers
- 10.4Pipelining and sliding windows
- 10.5Go-back-N: cumulative acknowledgements and one timer
- 10.6Selective repeat: buffer out of order, retransmit only losses
- 11.1TCP's byte stream: segments, sequence numbers and cumulative ACKs
- 11.2TCP connection establishment: the three-way handshake
- 11.3TCP teardown: FIN, half-close and TIME_WAIT
- 11.4RTT estimation and the retransmission timeout
- 11.5Fast retransmit and SACK: repairing loss before the timer fires
- 11.6TCP flow control: the receive window
- 11.7TCP window scaling: windows larger than 64 KB
- 11.8Nagle's algorithm and delayed ACKs: two good ideas that collide
- 12.1Congestion collapse: when retransmission makes overload worse
- 12.2Max-min fairness: what a fair allocation is
- 12.3AIMD: why additive increase, multiplicative decrease converges
- 12.4Slow start and Reno: the congestion window
- 12.5The TCP throughput model: rate falls as one over root loss
- 12.6CUBIC: window growth as a function of time
- 12.7Router buffer sizing: how much queue a link needs
- 12.8Bufferbloat and active queue management
- 12.9Fair queueing: isolating flows at the router
- 12.10ECN: marking instead of dropping
- 12.11BBR: congestion control from a path model
- 12.12Choosing congestion control: loss, delay, marks and models
- 16.1The network threat model: what an attacker on the path can do
- 16.2Symmetric encryption: block ciphers, modes and nonces
- 16.3Cryptographic hash functions: fingerprints an attacker cannot forge
- 16.4MACs: integrity with a shared key
- 16.5Authenticated encryption: AEAD
- 16.6Diffie–Hellman: agreeing on a key in public
- 16.7Digital signatures: authentication anyone can verify
- 16.8Certificates and chains: binding a key to a name
- 16.9PKI's weak links: revocation and Certificate Transparency
- 18.1Transport ossification: why TCP cannot change
- 18.2QUIC packets and streams: a transport in user space
- 18.3The QUIC handshake: TLS 1.3 inside the transport
- 18.4QUIC loss recovery: packet numbers that never repeat
- 18.5QUIC connection migration: surviving an address change
- 18.6HTTP/3 and QPACK: HTTP semantics on QUIC streams
- 23.1Clos fabrics: full bisection from commodity switches
- 23.2Fabric load balancing: flowlets and packet spraying
- 23.3Incast: many-to-one bursts
- 23.4DCTCP: reacting to the extent of congestion
- 23.5Delay-based datacenter congestion control: TIMELY and Swift
- 23.6Lossless Ethernet: priority flow control and its hazards
- 23.7RDMA: memory access across the network without the kernel
- 23.8DCQCN: congestion control for RoCE
- 23.9AI training fabrics: synchronised elephant flows
01.2Packet switching: why the Internet is not a telephone network
01.3Delay components: transmission, propagation and processing
01.4Queueing delay and loss: what a full buffer does
01.5Throughput: the bottleneck link sets the rate
01.6The bandwidth–delay product: bits in flight
01.7What a protocol is: message formats, order and actions
01.8Layering and encapsulation: the stack as a design decision
01.9Header encoding: fixed fields, byte order and extensibility
01.10The end-to-end argument: where functions belong
02.1Signals and bandwidth: bits are waveforms in a medium
02.2Line coding: sending bits a receiver can clock
02.3Nyquist's limit: symbols per second in a finite band
02.4Modulation: placing symbols on a carrier
02.5Noise and bit errors: SNR and error probability
02.6Shannon capacity: the rate no coding can beat
02.7Channel multiplexing: FDM, TDM and OFDM
03.1Framing: where a message starts and ends
03.2Hamming distance: what redundancy can detect and correct
03.3The internet checksum: cheap, incremental and weak
03.4CRCs: polynomial division over GF(2)
03.5Forward error correction: repair without retransmission
04.1ALOHA: random access and its efficiency limit
04.2CSMA/CD: listen first, stop when colliding
04.3Binary exponential backoff: adapting to unknown load
04.4Ethernet frames and MAC addresses
04.5Learning switches: forwarding without configuration
04.6Spanning tree: loop-free forwarding over a redundant LAN
04.7VLANs: several LANs on one set of switches
05.1Wireless links: fading, interference and rate adaptation
05.2CSMA/CA: avoiding collisions you cannot hear
05.3Wi-Fi association and roaming
06.1IPv4: a best-effort datagram across any link
06.2IP addresses and CIDR: prefixes that aggregate
06.3Longest-prefix match: the forwarding lookup
06.4ARP: from IP address to MAC address
06.5Forwarding versus routing: data plane and control plane
06.6Router architecture: ports, fabric and where queues form
06.7Fragmentation and MTU: packets larger than a link
06.8ICMP: the network's error and diagnostic channel
06.9Traceroute: revealing the path with expiring TTLs
06.10Path MTU discovery: avoiding fragmentation
06.11IPv6: a larger address and a simpler header
06.12IPv6 neighbour discovery: ARP and router discovery over ICMPv6
06.13IP tunnelling: packets inside packets
07.1Link-state routing: flood the topology, compute locally
07.2OSPF areas: hierarchy that limits flooding
07.3Distance-vector routing: distributed Bellman–Ford
07.4Count to infinity: why distance vectors learn bad news slowly
07.5Equal-cost multipath: spreading flows over several best paths
08.1Autonomous systems: customers, providers and peers
08.2BGP: path vectors between autonomous systems
08.3BGP route selection: policy first, distance last
08.4iBGP and route reflectors: carrying external routes inside an AS
08.5Valley-free routing: when policy routing is stable
08.6Anycast: one prefix announced from many sites
09.1Traffic engineering: routing to balance load
09.2MPLS: forwarding on labels along explicit paths
09.3Segment routing: the path carried in the packet
09.4Software-defined networking: centralising the control plane
10.1Ports and demultiplexing: from host to process
10.2UDP: the minimal transport
10.3Stop-and-wait ARQ: acknowledgements, timeouts and sequence numbers
10.4Pipelining and sliding windows
10.5Go-back-N: cumulative acknowledgements and one timer
10.6Selective repeat: buffer out of order, retransmit only losses
11.1TCP's byte stream: segments, sequence numbers and cumulative ACKs
11.2TCP connection establishment: the three-way handshake
11.3TCP teardown: FIN, half-close and TIME_WAIT
11.4RTT estimation and the retransmission timeout
11.5Fast retransmit and SACK: repairing loss before the timer fires
11.6TCP flow control: the receive window
11.7TCP window scaling: windows larger than 64 KB
11.8Nagle's algorithm and delayed ACKs: two good ideas that collide
12.1Congestion collapse: when retransmission makes overload worse
12.2Max-min fairness: what a fair allocation is
12.3AIMD: why additive increase, multiplicative decrease converges
12.4Slow start and Reno: the congestion window
12.5The TCP throughput model: rate falls as one over root loss
12.6CUBIC: window growth as a function of time
12.7Router buffer sizing: how much queue a link needs
12.8Bufferbloat and active queue management
12.9Fair queueing: isolating flows at the router
12.10ECN: marking instead of dropping
12.11BBR: congestion control from a path model
12.12Choosing congestion control: loss, delay, marks and models
13.1The DNS namespace: names, zones and delegation
13.2DNS resolution: stub, recursive and authoritative servers
13.3DNS caching and TTLs: how DNS scales
14.1DHCP: configuring a host that has no address
14.2SLAAC and DHCPv6: IPv6 address configuration
14.3NAT: many hosts behind one address
14.4NAT traversal: STUN, TURN and ICE
14.5IPv6 transition: dual stack, tunnels and NAT64
15.1HTTP semantics: methods, status codes and headers
15.2HTTP connection management: persistence, pipelining and head-of-line blocking
15.3HTTP caching: freshness and validation
15.4HTTP/2: binary frames and multiplexed streams
15.5HPACK: compressing headers without leaking secrets
16.1The network threat model: what an attacker on the path can do
16.2Symmetric encryption: block ciphers, modes and nonces
16.3Cryptographic hash functions: fingerprints an attacker cannot forge
16.4MACs: integrity with a shared key
16.5Authenticated encryption: AEAD
16.6Diffie–Hellman: agreeing on a key in public
16.7Digital signatures: authentication anyone can verify
16.8Certificates and chains: binding a key to a name
16.9PKI's weak links: revocation and Certificate Transparency
17.1The TLS record protocol: protecting a byte stream
17.2The TLS 1.3 handshake: one round trip to an authenticated key
17.3The TLS key schedule: deriving every key from one secret
17.4TLS resumption and 0-RTT: faster, but replayable
17.5HTTPS: SNI, ALPN and hostname validation
18.1Transport ossification: why TCP cannot change
18.2QUIC packets and streams: a transport in user space
18.3The QUIC handshake: TLS 1.3 inside the transport
18.4QUIC loss recovery: packet numbers that never repeat
18.5QUIC connection migration: surviving an address change
18.6HTTP/3 and QPACK: HTTP semantics on QUIC streams
19.1CDN request routing: DNS redirection and anycast
19.2Adaptive bitrate streaming: choosing quality from the buffer
20.1Cellular networks: radio access, core and bearers
20.2Mobility: keeping a connection when the attachment point moves
21.1IP spoofing and ingress filtering
21.2BGP hijacks and route leaks
21.3RPKI: validating route origins
21.4DNS cache poisoning: forging answers off-path
21.5DNSSEC: a chain of signatures from the root
21.6Encrypted DNS: DoT and DoH
22.1SYN floods and SYN cookies
22.2Off-path TCP injection: resets and data in someone else's connection
22.3Reflection and amplification attacks
22.4DDoS mitigation: absorb, filter and rate-limit
22.5Firewalls: packet filters and connection tracking
22.6VPNs: IPsec and WireGuard
23.1Clos fabrics: full bisection from commodity switches
23.2Fabric load balancing: flowlets and packet spraying
23.3Incast: many-to-one bursts
23.4DCTCP: reacting to the extent of congestion
23.5Delay-based datacenter congestion control: TIMELY and Swift
23.6Lossless Ethernet: priority flow control and its hazards
23.7RDMA: memory access across the network without the kernel
23.8DCQCN: congestion control for RoCE
23.9AI training fabrics: synchronised elephant flows
24.1Segmentation and receive offloads: TSO, GSO, GRO and checksum offload
24.2XDP: programs at the driver's receive hook
24.3P4: programmable switch pipelines
24.4Overlay networks: VXLAN and Geneve
24.5Container networking: namespaces, veth pairs and bridges
24.6Maglev: a software layer-4 load balancer
25.1Jitter buffers: trading delay for smooth playout
25.2RTP and RTCP: timing and feedback for media
25.3Media loss recovery: FEC, NACK and concealment
25.4Media congestion control: delay-based rate adaptation
25.5Case study: a video call over a congested cellular path
26.1Packet capture: what tcpdump and Wireshark actually show
26.2Active path measurement: RTT, loss and capacity
26.3Case study: the life of an HTTPS request
26.4Case study: debugging a slow transfer
Skipped topics
Moved past without finishing. A skipped topic still closes its module, and Continue goes on without it — open one to read it or mark it understood.
Glossary
The vocabulary of the authored lessons, grouped by subject and linked to the topic that derives each idea.
Packet
A payload of user bytes plus a header carrying the addresses and control fields each switch needs to forward it.
More detail
Hosts chop data into discrete, individually forwarded chunks rather than pouring a stream onto the wire. The header is pure overhead — tens of bytes against payloads of hundreds to thousands — and every sharing, queueing and layering mechanism in the module exists because of this chunking.
Circuit switching
Reserving a private slice of link rate per call before any data flows: perfect isolation, paid for with idle capacity.
More detail
Each conversation holds a fixed share for its whole duration, so an admitted call always has its rate — and the eleventh caller on a ten-circuit link is refused even when circuits sit silent. Circuit switching converts sharing into admission control.
Statistical multiplexing
Serving whoever is actually active instead of reserving per user, priced by the binomial tail past capacity.
More detail
With bursty users active a fraction p of the time, a link serves many more users than its circuit count at a small overload probability P(X > k). The gain holds only while the mean load leaves headroom; it collapses once the average alone saturates the link, and it assumes independent activity.
Store-and-forward
Receiving each packet in full before transmitting it onto the next link, paying L/R at every hop.
More detail
A switch must see the whole packet — to read the header and check integrity — before spending downstream capacity on it. The per-hop transmission toll H × L/R is the floor on which waiting and travel time pile.
Transmission delay
Time spent clocking a packet onto the link: d_trans = L/R, set by the packet and the rate only.
More detail
Distance is irrelevant: a 1500-byte packet costs 1.2 µs on 10 Gb/s and 1.2 ms on 10 Mb/s. Upgrading a link buys down exactly this component and nothing else.
Propagation delay
Time one bit spends travelling the link length: d_prop = d/s with s ≈ 2×10⁸ m/s in fibre.
More detail
Set by geography alone — 40 ms across 8000 km of fibre at any rate, any packet size. No upgrade except a shorter path moves it, which is why long links are propagation-dominated and only grow more so as rates rise.
Traffic intensity
The dimensionless fraction of link capacity claimed on average: ρ = La/R.
More detail
L is bits per packet, a arrivals per second, R bits per second. Below one the link is sustainable on average but still queues, because randomness clusters arrivals; at or above one the backlog grows without bound until arrivals ease or the buffer drops the excess.
Queueing delay and loss
The wait behind earlier arrivals at a busy link, and the finite buffer discarding what does not fit — the normal answer to overload, not a fault.
More detail
Mean time in system follows W = E[S]/(1−ρ), quoted from the queueing topic: delay explodes as ρ → 1, so doubling load from 0.48 to 0.96 multiplies waiting ~26×. Loss is the signal well-behaved senders use to slow down; bigger buffers trade drops for standing delay.
Bottleneck throughput
End-to-end rate bounded by the path minimum: R_path = min_i R_i, split per flow when shared.
More detail
Flow conservation forces R ≤ every link rate, and sending at the minimum achieves it. Upgrading any link except the bottleneck changes nothing; the bottleneck moves to whichever link — or per-flow share — is now smallest. File time is T = F/R in bits.
Bandwidth–delay product
The path capacity in bits: BDP = R × RTT, the data the network itself stores under full utilisation.
More detail
A sender keeping fewer than BDP bits outstanding leaves capacity idle; more only queues. Throughput obeys min(R, W/RTT), so a 64-KByte window caps a 1 Gb/s continental path at ~6.6 Mb/s — the long-fat-network problem that window scaling answers.
Protocol
Message format plus message order plus the actions each end takes on send, receive and timeout.
More detail
All three are needed: without format bits are ambiguous, without order each end waits for what the other never sends, without the timeout action one lost packet stalls the exchange forever. Each party is modelled as a finite-state machine.
Timeout as event
Converting silent loss into a state-machine event: on expiry, retransmit and wait again.
More detail
Loss raises no signal, so the timer turns "nothing arrived in time" into a retransmission. Duplicates are the normal price — a timer firing on a delayed reply creates two live copies — so receivers answer idempotently and senders absorb stale replies by state.
Layering and encapsulation
Each layer offers a service upward, prepends its header going down, and demultiplexes by its own selector going up.
More detail
No layer parses another: EtherType, the IP protocol field and port numbers each deliver upward exactly once. Applications and link technologies evolve without meeting, at a constant per-layer header cost that small payloads feel (59% on a voice sample) and large ones amortise (~4%).
Hourglass waist
Many applications above, many link technologies below, one thin protocol — IP — between them.
More detail
The waist is deliberately minimal (best-effort delivery, nothing more): everything a layer guarantees, every layer above must wait for. Keeping IP thin keeps every path usable, which is why the Internet kept scope layers and folded presentation and session into the application.
Network byte order
Multi-byte header fields travel most-significant-byte first; each host converts on send and receive.
More detail
The bytes 12 34 always mean 0x1234 = 4660 regardless of host endianness. The convention is load-bearing, not cosmetic: misreading length bytes little-endian turns a 60-byte datagram into 15360. Single-byte and bit fields need no rule.
Fixed fields versus TLV
Fixed-offset headers parse in constant time but spend budgeted room; type–length–value chains parse by loop and extend without limit.
More detail
IPv4 took the fixed route (total length always bytes 2–3, protocol byte 9) with reserved bits and a small option area; IPv6 moved to chained extension headers. Reserved means zero-on-send plus ignore-on-receive — a contract middleboxes break when they clear or punish unknown bits.
End-to-end argument
A check inside the network cannot replace a check at the ends: correctness factors as q^H(1−h), and no hop upgrade removes the ends factor.
More detail
Hop checks observe wire between boxes; transfer correctness spans endpoint memories the hops never see. Hence a best-effort core with intelligence at the hosts. Hop help (wireless retransmission) survives as a performance exception beneath the ends check — never instead of it.
Bandwidth in hertz
The width of the frequency band the medium passes — the single medium number the rate limits convert into bits per second.
More detail
A signal reads as a sum of sinusoids; the medium removes some frequencies and keeps others. The surviving width B in hertz bounds symbols per second (Nyquist) and multiplies capacity (Shannon). Data rate in bits per second is a different quantity in different units.
Decibel addition
Loss in dB sums along a path because power ratios multiply: 20 dB/km coax keeps 1% over 1 km; 0.2 dB/km fibre keeps 39.8% over 20 km.
More detail
L_dB = 10 log10(P_in/P_out); end-to-end loss is alpha × d. Quoting per-kilometre loss turns a chain of multiplications into one addition down the budget column.
Line code
The waveform choice that guarantees clock transitions and DC balance: Manchester at double baud, block codes at a quarter tax.
More detail
NRZ guarantees nothing; Manchester puts a transition in every bit at 2x baud; 4B/5B and 8b/10b spend codebook surplus for bounded runs (and disparity control) at 25% overhead. Leftover codewords become control symbols.
Nyquist rate
Noiseless ceiling R = 2B log2 M: the band sets the baud, the level count sets bits per symbol.
More detail
A band of width B offers 2B degrees of freedom per second; each symbol choosing among M levels conveys log2 M bits. Density is logarithmic in hardware — each extra bit per symbol doubles the levels and halves neighbour spacing.
Constellation distance
Minimum distance between carrier-plane points at equal average power: 2√P, √2P, √(2P/5) for BPSK, QPSK, 16-QAM.
More detail
Average power is the budget; geometry is the spending plan. Packing more points subdivides the fixed-power plane and shrinks the gap noise must bridge — real links retreat down this ladder as the channel degrades.
Gaussian tail errors
Binary error probability Pe = Q(dmin/2σ): BPSK falls from 7.87% at 0 dB to 0.0034% at 9 dB.
More detail
An error needs noise alone to bridge half the slicer gap; standardising gives the Gaussian tail. Tails decay faster than exponentially, so equal decibel steps buy accelerating returns near the cliff.
Shannon capacity
C = B log2(1+S/N): the supremum of reliable rates — bandwidth pays linearly, power logarithmically.
More detail
Derived in outline from maximising mutual information with Gaussian input. Worked ceilings: 30.9 kb/s phone, 133.2 Mb/s Wi-Fi, 50.3 Gb/s fibre. Uncoded 64-QAM at 240 Mb/s in the Wi-Fi band overshoots capacity and cannot run error-free.
OFDM orthogonality
Subcarriers spaced 1/T overlap in frequency yet integrate to zero over a symbol period — 802.11a packs 64 of them into 20 MHz.
More detail
FDM pays guard bands in hertz, TDM pays idle slots in time; OFDM pays a cyclic-prefix time tax (20%) and separates channels by inner-product geometry. Spacing exactly 1/T is load-bearing.
Framing
Delimiting a stream of bits into packets so a receiver knows where one ends and the next begins.
More detail
Sentinel bytes pay stuffing (HDLC escapes every 011111 in the body), length fields pay corruption at the worst place (a bad count resynchronises nothing), and clock encoding pays bandwidth (SONET resynchronises by repetition). Every link layer picks one of these trades; the choices collide again in Ethernet's preamble and VLAN tags.
Bit stuffing
Inserting a 0 after every five 1s so the flag 01111110 can never appear inside a frame.
More detail
Worst-case overhead is a fifth of the bit stream — bounded, unlike the byte-stuffed PPP tax, which can double on adversarial data. The receiver applies the same rule in reverse, so one un-escaped 01111110 means flag and anything else is an error.
Hamming distance
The number of positions where two codewords differ; the code's minimum distance decides what it can detect and correct.
More detail
A code detects up to d−1 errors and corrects up to floor((d−1)/2) — split the budget between the two however you like, since detected-and-uncorrected costs d−1 too. Single parity buys d=2; Hamming codes buy d=3 with the fewest possible check bits (n+1 ≤ 2^(n−k)).
Code rate
k/n — the fraction of transmitted bits that carry data, the rest being check bits.
More detail
Every error-control scheme is a point on this trade: repetition codes correct anything at rate 1/n, Hamming codes correct one error at rate approaching 1, and the bound n+1 ≤ 2^(n−k) says what single-error correction must cost. A code that saturates the bound is perfect.
Ones'-complement checksum
Summing 16-bit words where the carry out of the top bit wraps back into the sum, then complementing.
More detail
Verify by inclusion: summing the segment including the checksum must give all 1s. The carry-around makes the sum byte-order independent — swap the bytes and the swapped sum is the same — which is why it was chosen for IP where hosts disagree on endianness.
Incremental checksum update
Adjusting a checksum when a single word changes, without rescanning the message (RFC 1624).
More detail
HC' = ~(~HC + ~m + m') — subtract the old word, add the new, done in one pass. Routers use it on TTL so the checksum costs the same per hop as the decrement does. The edge case is real: when ~HC + ~m + m' sums to 0xffff the result must stay 0xffff, not fold to 0 — RFC 1141 got that wrong.
CRC
Treating the message as a polynomial over GF(2) and appending the remainder of division by a fixed generator.
More detail
Hardware is a shift register and a few XORs; the payoff is a designed guarantee, not a statistical one — a degree-32 CRC detects every burst up to 32 bits and every odd-bit error. Koopman's evaluations show which polynomials actually deliver the promised Hamming distance at each length.
Syndrome decoding
Multiplying the received word by the parity-check matrix; the nonzero result names the error pattern.
More detail
For a linear code the syndrome depends only on the error, not the codeword, so the table maps syndromes to most-likely errors. Hamming (7,4) does it with three equations — the syndrome index is the bit to flip.
Reed–Solomon
An (n,k) code over GF(2^m) that corrects t = (n−k)/2 symbol errors whatever the bit-pattern inside them.
More detail
Errors are paid per symbol, so a burst hitting b consecutive bits costs at most b/m symbols — the code eats bursts that defeat bit-oriented codes. CDs, DVDs, QR codes and deep-space links all use it; the storage world met it as erasure coding.
Interleaving
Writing codewords down the columns and transmitting across the rows, so a burst hits many codes once each.
More detail
Converts one long burst — which any single code cannot correct — into one-symbol errors spread across the depth of the block. Pays delay for burst tolerance with no extra redundancy; the burst length it survives is set by the interleaver depth.
Pure versus slotted ALOHA
Two ways to share a channel with no coordination: send whenever you like, or send only on slot boundaries.
More detail
A pure-ALOHA frame is destroyed by any overlap inside a two-frame window, giving S = G·e^(−2G) and an 18.4% ceiling; slotting halves the window for S = G·e^(−G) and 36.8%. Both curves sag after their peak — the protocol is unstable once offered load passes it, which is what backoff exists to fix.
Collision slot
The time a sender must keep transmitting to be sure a collision reaches it: twice the network’s propagation delay.
More detail
Detection works only while the sender is still talking, so a frame must occupy the wire for 2τ. Classic 10 Mb/s Ethernet fixed 512 bit-times — which set the 64-byte minimum frame on one side and, with the 2.5 km, 4-repeater diameter, the maximum network size on the other.
Truncated binary exponential backoff
After the n-th collision, wait a uniform multiple of the slot drawn from {0,…,2^min(n,10)−1}.
More detail
Each collision is evidence of roughly one more contender, so the range doubles as though the estimate did — exponential response to linear evidence. The cap at n=10 bounds the wait; the capture effect is the price: whoever wins keeps winning while the loser’s range keeps growing.
MAC address
A globally unique 48-bit identifier burned into each adaptor, filtered by hardware before the host is interrupted.
More detail
The OUI half names the vendor; the group bit distinguishes unicast from multicast; the local bit makes room for locally assigned addresses. Flat means no aggregation — a switch cannot summarise where a MAC lives, which is exactly why learning tables and spanning trees are needed.
Learning switch
A switch that fills its MAC table by watching source addresses, with a timeout so entries expire.
More detail
Backward learning: a frame arriving on port p proves its source lives behind p. Unknown destinations and broadcast still flood — the table is a pruning hint, never a correctness condition, so a stale or missing entry costs extra copies, not wrong delivery.
Spanning tree
Switches elect a root by lowest ID and keep only the tree edges, blocking every port that would close a loop.
More detail
Ethernet has no TTL, so a looped flood circulates forever; the tree removes loops physically by construction. Classic convergence takes tens of seconds and wastes the blocked links entirely — the two complaints RSTP and TRILL were built to answer.
VLAN tag
The 802.1Q tag inserted after the source MAC: TPID 0x8100 plus priority, drop-eligible and 12-bit VID fields.
More detail
One physical LAN partitions into per-VLAN broadcast domains; trunk links carry the tags between switches while access ports strip them. 4094 usable VIDs — 0 and 4095 are reserved — and crossing between VLANs still requires a router, which is the point.
Hidden terminal
Two senders out of each other’s radio range but both in range of the receiver — carrier sense sees a clear channel while the collision is already forming.
More detail
Physical sensing reports the sender’s neighbourhood, but the collision happens at the receiver’s. RTS/CTS fixes it with a reservation handshake: every station that overhears either control frame sets a NAV timer and stays silent for the declared duration — virtual carrier sense carried in the frames themselves.
NAV
Network allocation vector: a countdown each station sets from any Duration field it overhears, during which it will not contend.
More detail
The 802.11 Duration/ID field reserves the medium through the ACK of the current exchange, so even a lone large frame silences its neighbourhood. Collisions move to the short RTS: a lost RTS costs tens of microseconds where a lost data frame cost the whole payload’s airtime.
Three-address frame
802.11 headers name the current hop separately from the endpoints: receiver, transmitter, and the ultimate source or destination.
More detail
To DS / From DS bits say which direction the frame travels relative to the wired side; the AP translates between the wireless triple and Ethernet’s pair. A fourth address appears only on AP-to-AP links inside the distribution system — both hop endpoints and both end stations at once.
CIDR
Classless inter-domain routing: an address is a prefix of arbitrary bit-length, written a.b.c.d/n.
More detail
Replaced the classful A/B/C boundaries that wasted space — a network claims any contiguous power-of-two block. Aggregation lets one route cover many prefixes (192.4.16–31/16 → a single /20), which is what keeps backbone tables measured in hundreds of thousands rather than millions.
Longest-prefix match
When several table entries cover a destination, forward along the entry whose prefix is longest — most specific route first.
More detail
The rule is what lets a specific route punch a hole through a covering aggregate. Lookup structures make it fast: binary tries walk bit by bit, path-compressed tries skip one-child runs, multibit tries stride several bits per access, and TCAMs compare all entries at once.
ARP
Broadcast “who has this IP?” on the LAN; the owner replies unicast with its MAC; everyone caches the answer.
More detail
Cache entries time out in minutes, not forever — replug a machine and stale caches recover on their own. The protocol authenticates nothing: any host may answer any query, which is ARP spoofing, and gratuitous replies make it a feature as well as a hole.
Path MTU discovery
Send with DF set; each Too-Big reply names the next link’s MTU, and the sender halves or table-steps down until the packet passes.
More detail
RFC 1191’s plateau search; RFC 4821 (PLPMTUD) and RFC 8899 (DPLPMTUD) probe upward without trusting ICMP — the answer to links and tunnels that silently drop or filter the message. The floor is the IPv6 minimum of 1280 bytes.
Solicited-node multicast
Neighbour solicitation goes to the multicast group derived from the target’s last 24 address bits — typically one host hears it.
More detail
Replaces ARP’s every-host broadcast: ff02::1:ffXX:XXXX keeps the query off nearly every NIC on the link. Duplicate address detection reuses it — a station asks about its own would-be address first, and an answer means pick another.
Link-state advertisement
Each router’s signed statement of its own links — sequence-numbered, age-stamped, flooded everywhere.
More detail
Reliable flooding makes every router hold the same map: store if newer, forward except to the sender, reflood a zeroed TTL as a deletion. OSPF signs the 32-bit sequence space from 0x80000001 and ages entries toward MaxAge — the paper trail that lets transient loops exist at all, since two routers briefly run SPF on different maps.
OSPF area
A contiguous block of routers running its own link-state copy, with the backbone as the star’s hub.
More detail
The topology of an area is invisible outside it — internal routers store the area’s map plus summary advertisements, never the outside detail. The price is paid in optimality: a summary-LSA prices a whole range at its worst component’s cost, so a remote router cannot tell the near edge from the far.
Distance vector
Each router advertises only its distances; neighbours relax them and the system settles on shortest paths — Bellman–Ford distributed.
More detail
Good news travels at link speed, bad news at infinity speed: when a route dies, stale longer routes get re-advertised as real ones and each neighbour believes the other. Finite infinity, split horizon and poisoned reverse patch the easy cases; path vector fixes it by carrying the route itself.
Route reflector
An iBGP speaker allowed to readvertise iBGP routes to its clients, replacing the O(n²) full mesh.
More detail
iBGP’s no-readvertisement rule exists because intra-AS routes carry no AS-path loop check; a reflector bends it for clients only, tagging updates with ORIGINATOR_ID and CLUSTER_LIST so a route returning to its origin or cluster is dropped. Path hiding is the price: the reflector advertises its own best, and that may not be the AS’s best.
Valley-free
Gao–Rexford’s export rule: announce customer routes everywhere, peer and provider routes only to customers.
More detail
A path that obeys it climbs provider edges, crosses at most one peer edge, and descends customer edges — never up a second hill. The theorem is what BGP operators actually run: any AS using the usual import rules is inherently safe, no global coordination needed.
Anycast
The same service address advertised from several sites; routing delivers clients to the topologically nearest one.
More detail
Nearest means routing-metric nearest — fine for DNS’s single-shot queries, hazardous for anything stateful, since a topology change can shift a client’s packets to a different site mid-connection. Shared-unicast prefixes carry the same technique without the anycast semantics.
Traffic engineering objective
Minimise summed link utilisation penalties — a piecewise cost that explodes as a link fills, not just congestion.
More detail
Fortz–Thorup’s objective prices a link at slopes of 1, 3, 10, 70, 500, 5000 across utilisation bands, so the optimiser pays almost anything to keep links below ~85% load. Setting IGP weights to it beats hop-count by 50–110% of carried demand and lands within a few percent of optimal routing.
MPLS shim
A 4-byte label stack entry between L2 and L3: 20-bit label, 3-bit TC, bottom-of-stack bit, TTL.
More detail
Routers swap labels, not look up prefixes — the FEC is decided at the edge, so the core forwards on a fixed-format field at hardware speed. Penultimate-hop popping hands the egress a plain IP packet; label stacks are how VPNs and fast reroute ride the same fabric.
Segment routing
Source routing with an instruction list: SIDs steer the packet through waypoints, so per-flow state lives only at the ingress.
More detail
Each segment is either an IGP shortest-path step or an explicit hop (End/End.X in SRv6), encoded as MPLS labels or IPv6 addresses in the SRH. The network core keeps no per-flow state — a policy is just a header, which is why it scales where RSVP-TE did not.
SDN split
The control plane pulled out of the routers into a logically central controller programming match-action tables.
More detail
OpenFlow standardised the southbound protocol (McKeown 2008); Google’s B4 showed the economics — a WAN carrying Google-internal traffic at near-100% utilisation by computing paths centrally instead of trusting BGP. The hardware stays dumb and fast; policy lives in software that can be changed in hours.
Autonomous system
A network under one administrative authority with a consistent routing policy, identified by an ASN.
More detail
About 90,000 ASes hold the global routing table of over a million prefixes; the policy layer that matters is the business graph — stub, multihomed, and transit ASes connected by customer–provider and peering edges. Inside an AS you optimise with an IGP; between them you negotiate with BGP, and the two views deliberately disagree.
AS path
The sequence of ASNs a route announcement has traversed — BGP’s loop prevention and its shortest-path metric in one field.
More detail
Each speaker prepends its own ASN and rejects any UPDATE containing it, so loops die on arrival. Path length is a cheap, policy-agnostic rank key, but it is also the attack surface: prepending inflates it on purpose, and a rogue ASN that injects itself forwards traffic it was never meant to see.
BGP decision process
A strict ladder of increasingly desperate criteria: local preference, shortest AS path, lowest MED, eBGP over iBGP, lowest IGP cost, lowest router ID.
More detail
Each rung exists because the rung above it refused to decide — local-pref is operator policy, path length is a proxy, MED a hint between neighbours, and the last three are just determinism. The ladder makes route selection predictable, which is precisely why Griffin’s stable-paths analysis can treat it as a game.
Counting to infinity
Distance-vector loops where two routers slowly bid each other’s dead route up to infinity, hop by hop.
More detail
RIP declares sixteen unreachable, so a vanished subnet can take minutes to die while neighbours relay stale claims — the trace is dozens of advertisements before both sides converge. Split horizon and poisoned reverse cut the common cases but not the three-router triangle, which is why path vector carries the path, not just the count.
ECMP hashing
Splitting equal-cost traffic by hashing the 5-tuple to a next hop, keeping each flow on a single path.
More detail
Per-packet spraying would reorder segments inside a flow — beyond roughly one serialisation delay the late packet triggers fast retransmit, so routers pin flows instead. The hash divides key space into regions; a link loss reshuffles only that region’s flows, and the residual imbalance is the balls-into-bins bound plus whatever polarisation your hash chain hides.
Port demultiplexing
Ports extend host addressing to processes: (protocol, host, port) picks the exact socket a packet lands in.
More detail
The header’s port pair is the demux key — the kernel keeps a table of bound endpoints and queues each message behind the matching socket. Well-known numbers (53, 25, 517) pin services; the 16,384 ephemeral ports pin clients, which is why a leaky loop can exhaust TIME_WAIT capacity on a busy proxy.
UDP checksum
An optional-in-name end-to-end check over the header, data and a pseudo-header of IP fields.
More detail
Zero means not computed, but RFC 8085 effectively mandates it: it is the only thing standing between a bit-flipped address and silent delivery to the wrong endpoint. The pseudo-header folding in IP source and destination is the part people forget — the checksum protects against misdelivery, not just corruption.
Stop-and-wait
The simplest ARQ: send, wait for ack or timeout, repeat — correctness via a single sequence bit.
More detail
With only one outstanding frame, duplicates from a retransmitted frame and a real next frame collide, so one bit alternates. The cost is brutal: a 1.5 Mb/s satellite link drops to roughly 182 kb/s, an eighth of capacity — pipelining exists precisely because stop-and-wait wastes the bandwidth-delay product.
Three-way handshake
SYN, SYN-ACK, ACK — the exchange that anchors both sequence spaces before data moves.
More detail
The third segment exists because the responder must learn that its ISN arrived; without it, an old duplicate SYN could open a phantom connection. Each side sends its own ISN — the handshake is two interleaved two-way confirmations, not a courtesy.
Jacobson estimator
RTT smoothed by an exponential filter plus a mean-deviation safety margin — the RTO formula from the 1988 congestion-collapse fix.
More detail
Jacobson’s estimator runs SRTT ← (1−g)SRTT + g·R and multiplies the deviation by four, so the timeout tracks the mean without whipsawing on jitter. Karn’s refinement — never re-time a retransmitted segment — stops an ambiguous ACK from corrupting the estimate right when the network is already sick.
Duplicate ACKs
Three identical ACKs signal a hole in the sequence space and trigger retransmission without waiting for the timer.
More detail
Every out-of-order segment makes the receiver repeat its highest in-order ACK number, so a burst of dups means one segment is missing, not the whole flight. SACK narrows the retransmit set to the holes the receiver actually reports — four block pairs in the header, the rest advisory.
Silly window syndrome
A degenerate cycle where each side advertises and sends ever-smaller windows, collapsing throughput to dribbles.
More detail
The receiver-side fix is to advertise only a real chunk — half the buffer or one MSS; the sender-side fix is to accumulate a full segment before pushing. Between them the zero-window probe (5–60 s backoff) keeps a closed receiver polling without livelock.
Nagle versus delayed ACK
Nagle withholds small segments until the in-flight data is acked; delayed ACKs withhold the ack — together a 40 ms–class deadlock.
More detail
Individually both are defensible: Nagle turns keystroke traffic from forty-byte to four-byte efficiency, and delayed ACKs save a packet per two segments. Interleaved, a write-write-read application stalls ~90 ms a round; that is why TCP_NODELAY exists and why SSH feels different on lossy links.
Sliding window
The sender may keep up to W unacked segments in flight — enough to cover the bandwidth-delay product, not one more.
More detail
Window arithmetic is invariant bookkeeping: LFS−LAR≤SWS on the send side, LAF−LFR≤RWS on the receive. Under-utilisation is the failure that matters — at W below BDP the link idles between flights, which is why window sizing is a capacity question, not a courtesy.
Go-back-N
Receiver accepts only the next in-order segment; on loss the sender replays the whole outstanding window.
More detail
A single timer on the oldest unacked segment keeps sender state minimal, but one loss retransmits everything after the gap — fine at low loss rates and punishing at high ones. The sequence-space bound W ≤ 2^k − 1 is the ambiguity guard: a full window of lost ACKs must not alias onto the next.
Selective repeat
Receiver buffers out-of-order segments and ACKs individually; sender retransmits only what is actually missing.
More detail
Per-segment timers plus a receive window mean one loss costs exactly one retransmission — the efficiency GBN wastes. The price is a tighter bound, W ≤ 2^(k−1): the send and receive windows may not overlap on sequence numbers, or a replayed old segment is mistaken for new data.
Congestion collapse
The 1986 failure mode where retransmitted losses consume the link until delivered throughput hits zero.
More detail
Jacobson’s trace was brutal: 32 Kbps sagging to 40 bps because most packets crossing the bottleneck were copies the receiver already had. The cure was not a bigger queue but self-clocking — ACK-driven pacing, slow start and the RTO estimator — which is why TCP’s congestion machinery is named after the paper that diagnosed it.
Max-min fairness
An allocation is max-min fair when no flow can gain without taking from a smaller flow — computed by raising rates equally until bottlenecks freeze.
More detail
The water-filling algorithm saturates the tightest bottleneck first, then repeats on what is left, giving a unique allocation provable via the bottleneck-link property. It is the target TCP only approximates: real senders cannot see the plane, they can only probe it — hence AIMD.
AIMD
Additive increase, multiplicative decrease — the feedback rule that drives independent flows to share a bottleneck fairly.
More detail
Chiu and Jain showed that from any starting point on the allocation plane, a vector with positive additive and less-than-linear multiplicative terms converges to the fairness line. The sawtooth is the price: steady-state windows oscillate, and the equilibrium rate falls out of the geometry, not a negotiation.
Slow start
Doubling cwnd every RTT until ssthresh — the cheap way to find capacity quickly without overrunning it once known.
More detail
The name is a misdirection: per-RTT doubling is TCP’s most aggressive phase, reaching an IW-to-BDP span in a handful of round trips. Reno adds fast retransmit and fast recovery — keep the pipe half-full after a single loss instead of collapsing to one segment, which is what the later standards actually tune.
Mathis equation
TCP throughput ≈ (MSS/RTT)·√(3/(2p)) — the sawtooth period sets a hard ceiling tied to loss rate.
More detail
Each loss halves the window, so the average window is proportional to 1/√p; a 10 Gb/s flow over a transcontinental path needs loss below 1e-10, which is why math drives protocol design — Padhye's refinement adds timeouts and receiver-window caps that the simple model misses.
CUBIC
Linux's default control: a cubic function of time-since-loss that spends most of the window recovering near W_max.
More detail
Because growth is time-based not ACK-based, CUBIC is RTT-fair — flows at 10 ms and 100 ms climb the same curve. The β=0.7 cut plus fast convergence keeps it polite to itself, and RFC 9438 is just the code spelling out the constants.
Rule of √n
Backbone buffers need only BDP/√n when n flows share the link — their sawtooths desynchronise.
More detail
Appenzeller et al. showed the single-sawtooth B=RTT·C rule overprovisions wildly: with independent phases the aggregate loss rate smooths out, so a backbone with hundreds of flows needs a few dozen packets of buffering, not gigabytes. The caveat is synchronisation — under attack or on a single big flow, the old rule returns.
Bufferbloat
Standing latency from over-deep buffers — the link stays 'busy' while every packet waits behind hundreds of ms of backlog.
More detail
AQMs attack it by dropping early: CoDel drops only when queue sojourn exceeds ~5 ms past a 100 ms interval, with a 1/√count control law, and ECN lets a congested router mark instead of drop so TCP's feedback loop reacts without loss. The lesson is queues are a control knob, not a cushion.
Fair queueing
Per-flow queues serviced by virtual finish time — the packetized emulation of bit-by-bit round robin.
More detail
Demers–Keshav–Shenker price each packet at max(prev finish, virtual now) + size/weight and serve the smallest finish number; a flow's share survives its own bursts because its packets queue against themselves. DRR cuts the O(log n) heap to O(1) with a quantum-and-deficit scheme at the cost of a bounded unfairness.
ECN
Routers set the CE codepoint instead of dropping; receivers echo it in ACKs and senders halve without a loss.
More detail
The point is decoupling congestion signal from damage: marking capacity gets the sender's attention at queue-buildup time rather than tail-drop time, which is exactly what AQMs like RED and CoDel want. Middleboxes that strip or squash it are the reason deployment took two decades.
BBR
Google's control that paces at the estimated bandwidth×RTprop operating point instead of driving to loss.
More detail
Loss-based controls overshoot the knee — BBR periodically probes bandwidth (ProbeBW) and drains to re-measure RTprop (ProbeRTT), locking its inflight limit near one BDP. The v3 draft adds a modest loss response for coexistence; the interesting claim is that throughput and delay are jointly measurable, not a trade-off to guess.
DHCP lease
An address grant with T1=L/2 renew and T2=7L/8 rebind timers — the last eighth is slack for a dead server.
More detail
The lease is a soft-state contract: RENEWING unicasts back to the issuer, REBINDING broadcasts to anyone, and at expiry the address is unbound. The relay's giaddr is what makes it routable — without it the server cannot pick the right subnet scope or reply back to the client.
SLAAC
IPv6 hosts build their own address from the router-advertised prefix plus an interface identifier — no server needed.
More detail
The RA's A-flag gates autonomous addressing; the host runs duplicate-address detection before preferring the tentative address, then watches preferred/valid lifetimes roll it to deprecated and invalid. Stateless means the router only advertises prefixes — it never learns who took them, which is why DHCPv6 still exists for the managed cases.
NAT44
A middlebox rewriting (src IP, src port) into one public address — IPv4's survival mechanism and its connection tax.
More detail
Sixteen port bits cap a NAPT at ~65k simultaneous flows per inside address, and idle timeouts eat state fast — keepalive arithmetic shows why chat apps poll. The deeper cost is directionality: outbound works, inbound needs a port map, which is the asymmetry ICE and TURN exist to beat.
NAT traversal
Both ends report their view to a shared server (STUN), then punch simultaneous outbound packets through each other's mapping.
More detail
It works ~80% of the time for UDP because a mapping is created by sending; symmetric NATs break it since the map differs per peer, forcing TURN relays at provider cost. ICE just searches the candidate pairs in priority order — host, server-reflexive, relayed — which is why WebRTC ships all three.
Happy Eyeballs
Try IPv6 first, fall back to IPv4 after ~250 ms if it stalls — the dual-stack algorithm that made v6 deployable.
More detail
The insight was that a broken v6 path made dual-stack slower than v4-only, so hosts learned to hedge: sort by RFC 6724 preference, start the preferred family, and start the fallback a quarter-second later rather than waiting for failure. That small race is the difference between transition as progress and transition as regression.
Persistent connections
Reusing one TCP connection across requests removes per-object handshake + slow-start cost — the cheap win HTTP/1.1 got right.
More detail
A fresh connection pays a handshake RTT plus congestion-window ramp on every object; a 90-object page at 56 ms RTT costs ~12 s serially versus ~1.2 s with parallelism and persistence. Pipelining tried to go further but hit head-of-line blocking — the lesson HTTP/2's framing finally solved properly.
Cache validators
ETag and Last-Modified let a stale cache revalidate cheaply — a 304 carries headers only, ~96% byte saving.
More detail
Freshness lifetime is layered: s-maxage beats max-age beats Expires, and absent all three caches guess ~10% of age. The pitfall names matter — no-cache means revalidate, no-store means don't keep, and Vary decides which headers form the key; get them wrong and shared caches leak or starve.
DNS zone cut
The namespace tree split into zones; NS records at each cut point authority downward while glue keeps the loop resolvable.
More detail
Delegation is administrative fiat — a parent publishes NS for the child and glue A records only when the servers sit below the cut. That one design (names as a tree, authority as a chain) is why DNS scales to billions of names with thirteen logical roots.
Iterative resolution
A resolver walks root → TLD → authoritative, collecting NS referrals until an answer arrives — each hop one query.
More detail
Recursive servers do the walking so stubs ask once: a cold lookup of penguins.cs.princeton.edu costs about four queries — root, edu, princeton.edu, cs.princeton.edu — and every referral returned is itself a cacheable fact. The last hop answers authoritatively; everything before it is navigation.
DNS TTL
Every record carries a lifetime — the trade between query traffic and propagation delay, written on the answer itself.
More detail
Caching collapses the root's load by six orders of magnitude, which is what makes the whole tree economical. The cost is the bound: a 86400 s TTL means a moved address can stay wrong for a day, so operators drop TTLs before migrations — you pre-pay agility before you need it.
HTTP/2 streams
Requests become interleaved frames on shared streams — application-level multiplexing without parallel sockets.
More detail
The 9-octet frame header plus stream IDs let one TCP connection carry hundreds of concurrent responses, which fixes HTTP-level HOL blocking — but not transport HOL: one lost TCP segment stalls every stream at probability 1−(1−p)^n versus p per stream before. That residual is exactly what HTTP/3's QUIC datagrams remove.
HPACK
Header compression via a shared static table plus a per-connection dynamic table — indexing, not entropy coding, does the work.
More detail
CRIME proved that compressing attacker-chosen text against secrets leaks length; HPACK's answer is Huffman-coded literals and index references that never mix the two. Repeated headers send a few index bytes instead of hundreds — the 85–88% zlib wins without the side channel.
Dolev-Yao attacker
The standard adversary reads, writes, drops, replays and reroutes everything — only endpoints are trusted.
More detail
Treating the wire as fully adversarial is what makes the security goals crisp: confidentiality, integrity, authenticity, forward secrecy each need a distinct mechanism because the attacker in between can exercise all five verbs. Anything weaker just moves the trust boundary somewhere unexamined.
Birthday bound
A collision in an N-output hash appears after about √N samples — the quadratic shortcut every design must price in.
More detail
The pair-counting math means a 128-bit digest resists collisions for only ~2^64 work, not 2^128 — the reason SHA-256 exists and why key/IV/nonce sizing questions always halve themselves. It is the same arithmetic that bounds CTR counter space and nonce reuse.
CTR mode
Encrypt a unique counter block, XOR with plaintext — turning a block cipher into a parallelizable stream cipher.
More detail
The nonce is the whole game: reuse a counter value and two ciphertexts XOR into the plaintexts' difference, the two-time-pad failure. Its other virtue is parallelism plus no padding — encryption is a map XOR, so decryption never needs the inverse permutation.
HMAC
A keyed hash — H((K⊕opad)‖H((K⊕ipad)‖m)) — that survives length extension and proves the sender held the key.
More detail
The nested two-key construction exists because raw H(key‖message) is forgeable through Merkle-Damgård length extension. Verification is comparison: a tampered tag must be recomputed without the key, which is why truncating to 80 bits is still within the standard.
AEAD
One primitive returning (ciphertext, tag) over plaintext plus associated data — encrypt-then-MAC made atomic.
More detail
History says combining a cipher and a MAC yourself goes wrong — padding oracles ate TLS's MAC-then-encrypt, and nonce reuse in GCM hands the attacker the authentication key. AEAD's contract is simpler: the caller supplies a nonce and unencrypted context, the construction does the rest.
Diffie-Hellman
Two public exchanges a^{X} mod q combine into a^{X_iX_j} — a key both sides derive and no listener can.
More detail
Security rests on discrete log being hard while exponentiation is easy; an active MITM breaks it trivially, which is why DH always rides inside an authenticated handshake. Ephemeral DH is what buys forward secrecy — yesterday's key is already gone.
TLS record
A 5-octet header wrapping an AEAD-protected TLSInnerPlaintext — content type hidden inside, seq-derived nonce outside.
More detail
TLS 1.3 lies on the wire deliberately: every record claims type 23, while the real type sits encrypted at the tail with optional padding. The nonce is never transmitted — it is the 64-bit sequence number XORed into a per-direction write_iv, which is how both sides stay synchronised without an explicit IV field.
TLS 1.3 handshake
ClientHello with key shares, ServerHello picking the suite — encrypted from the second flight onward, one RTT to data.
More detail
Everything after ServerHello travels under handshake keys, which is why TLS 1.3 hides the certificate and finishes a round trip faster than 1.2 ever could. The downgrade sentinel and HelloRetryRequest magic exist because the remaining plaintext bits are where the middleboxes live.
HKDF chain
Extract → Derive-Secret stages produce an independent key per epoch and direction — early, handshake, application, resumption.
More detail
Each stage binds the transcript so far plus the previous secret, so a MiTM cannot splice phases: client and server hs_traffic keys diverge by label, and traffic secrets rotate with key updates. The resumption secret hangs off the application secret with the ticket_nonce — a separate tree entirely.
0-RTT trade
Early data arrives before the second flight — no forward secrecy on it, and the server must bound replays itself.
More detail
PSK resumption saves signatures, not round trips; 0-RTT saves the trip but weakens two guarantees — it is replayable and non-secret once the early secret leaks. The RFC's answer is a policy: safe methods only, single-use tickets, ClientHello recording — never pretending the cheap flight is the real one.
Ossification
Middleboxes that hardwire today's headers make tomorrow's transport undeployable — use it or lose it.
More detail
TCPExposure's measurements showed options stripped on ~14% of :80 paths and sequence numbers rewritten on ~18% — the network now owns your header. RFC 9170's answer is greasing: advertise unused values forever so the middleboxes can never ossify them, the same trick TLS runs on cipher suites.
QUIC streams
62-bit stream IDs with initiator/direction bits, per-stream and per-connection flow control, no cross-stream ordering.
More detail
A lost packet stalls only the streams it carried — the HOL cost TCP pays at the transport is gone. MAX_STREAM_DATA/MAX_DATA form a two-level credit system, MAX_STREAMS bounds concurrency, and RESET_STREAM/STOP_SENDING let either side abandon a stream without abandoning the connection.
QUIC handshake
Initial packets carry the TLS ClientHello; transport parameters and cipher suite are negotiated in the same round trip.
More detail
Folding TLS 1.3 into the transport means the connection-id, version and crypto arrive together — one RTT to first data, zero on resumption. The server's anti-amplification cap (3× received) and retry tokens police spoofed sources before any state exists.
Connection migration
Connection IDs decouple the flow from the 4-tuple — a WiFi→LTE hop keeps the connection alive through path validation.
More detail
TCP rebinds on a new source address; QUIC just validates the new path (PATH_CHALLENGE/RESPONSE) and keeps the CID. Rotating CIDs per path prevents an observer linking your packets across networks — privacy bought with unlinkability.
QUIC loss recovery
Packets are never renumbered on retransmit — ACK elicitation, PTO timers, and no Karn ambiguity in RTT estimates.
More detail
Retransmitted data rides in a brand-new packet number, so an ACK unambiguously names one transmission — the ambiguity that forced Karn's algorithm disappears. Loss is declared by packet threshold or time, and the probe-timeout mechanism replaces TCP's RTO.
QPACK
HPACK's ordered-state problem solved: encoder/decoder streams carry table updates separately, references wait instead of stalling.
More detail
HTTP/3 maps requests onto QUIC streams (0,4,8…) and drops HOL-blocking machinery HTTP/2 needed. QPACK's dynamic table updates travel on dedicated uni-streams; a request referencing a not-yet-arrived entry blocks only itself — a bounded stall, not a head-of-line pileup.
CDN steering
DNS-based or anycast-based mapping that lands a request on a nearby cache — measured by latency, not geography.
More detail
Akamai's measurements showed the resolver-to-client distance is the real problem: ECS (RFC 7871) leaks a client prefix through the resolver so the authoritative nameserver can map correctly. Twenty milliseconds of closer placement beats every bandwidth upgrade — the placement decision IS the performance.
ABR ladder
DASH/HLS chop video into segments at several bitrates; the client climbs a quality ladder while keeping the buffer full.
More detail
BBA-0's insight is that the buffer map is the whole algorithm: a reservoir where you play safe, a cushion where you ramp, and a panic region where you drop to minimum quality. The drain-rate boundary decides stalls, so the 10–20% rebuffer cut came from respecting it, not predicting bandwidth.
RAN / core split
Radio access network handles the air interface; the core (AMF/SMF/UPF) handles sessions, mobility and billing.
More detail
5G's TS 23.501 splits control and user planes cleanly: UPFs forward, SMFs assign, AMFs page. The N3 GTP-U tunnel is the seam — your packet is IP inside a UDP/TEID wrapper between the gNB and the UPF, which is how a cell network pretends to be an Ethernet.
Handover anchors
Cellular mobility works by relocating tunnels — Xn direct forwarding or N9 via UPF — while the session anchor stays put.
More detail
An end marker in the GTP stream tells the old gNB's buffer where forwarding ends; the SMF re-points N3 and the UE never sees an address change. QUIC migration and mobile-IP are the same trick viewed from opposite ends: someone updates the binding, the identifier survives.
SYN cookies
Encode the half-open state in the ISN itself — the server allocates nothing until the ACK returns.
More detail
A SYN flood exhausts the backlog queue with half-opens. Bernstein's trick packs timestamp, counter and a MAC of the 4-tuple into the initial sequence number, so the state rides the wire instead of memory — the queue is proven unnecessary. RFC 4987's honest advice: cookies trade options info for survivability.
Amplification factor
Small spoofed queries that return giant answers — DNS, NTP, memcached turn a modest botnet into a flood cannon.
More detail
The attacker's cost is the query; the victim pays for the answer, which is why UDP services became artillery. Rossow's census showed the abuse surface is protocol-wide, and CISA's advisory forced response-rate limiting and BCP38 source filtering as the only real cures.
Off-path injection
An attacker who cannot see the traffic forges TCP segments by guessing ports, addresses and sequence windows.
More detail
Challenge-ACK feedback turns guesswork into a side channel: send probes, count the challenge ACKs, and the exact window position leaks. RST injection kills the stream; data injection can poison a session — the defence is making the guess space intractable, not a firewall.
DDoS absorption
Volumetric attacks are beaten by capacity you cannot own: anycast spread plus upstream scrubbing centres.
More detail
Below the link, no appliance helps — the pipe is already full. Mitigation lives elsewhere: BGP diversion to scrubbing centres, anycast that spreads the flood across edges, rate limiting and ACLs for protocol attacks, and fair-queue/WAF logic for the application layer.
Stateful firewall
A stateful firewall matches packets against live connection state; stateless rules check headers alone.
More detail
Statefulness buys correctness — return traffic passes only when a matching outbound flow exists — at the price of a table that itself becomes a flooding target. The boundary between packet filters, stateful inspection and application proxies is what the rules can see, not the box.
VPN encapsulation
IPsec ESP and WireGuard wrap the inner packet in an encrypted envelope — confidentiality plus a new header tax.
More detail
Tunnel mode adds ~50–60 bytes per packet (outer IP, ESP/UDP, IV/tag, trailer), shrinking the MTU and forcing MSS clamping — which is why VPN links fragment. The cost buys an untrusted network acting as private wire: GRE and IP-in-IP tunnel without encryption, ESP and WireGuard add AEAD.
Clos fabric
Folded Clos: every leaf reaches every leaf through spines — nonblocking bandwidth from small switches.
More detail
Jupiter showed the trick scales to datacenter size: 3-stage folds multiply port count without chassis. The number that matters is bisection bandwidth per server — and ECMP is only as good as the entropy in the 5-tuple spread across those equal paths.
ECMP collision
Hash-based spreading lands colliding flows on the same link — CONGA and flowlet switching rebalance by measured load.
More detail
Static ECMP hashes pin an elephant to whatever link its tuple lands on, and a few collisions sink utilization. CONGA measures congestion per path and lets LetFlow rebalance only at flowlet gaps, exploiting the fact that reordering only happens if you move mid-burst.
Incast
Hundreds of senders blasting one receiver: the switch buffer fills, a whole window is lost, and goodput craters.
More detail
The collapse is deterministic: synchronized senders overrun one egress queue, tail-drop a full window, and all senders time out together — throughput floors until the barrier passes. Tiny buffers, pacing, and bounded response sizes all attack the same spike.
DCTCP
A fraction-marked estimator replaces TCP's binary loss signal — small, precise queue control at ~µs RTTs.
More detail
DCTCP multiplies window by the fraction of marked bytes instead of halving on loss, so the sawtooth flattens and the queue stays near the marking threshold. RFC 8257 standardized it because datacenter RTTs make the 1ms control loop feasible.
TIMELY
Google's delay-based datacenter CC: reads RTT gradients from NIC timestamps, reacts before queues build.
More detail
Once the serialization term is removed, residual RTT is almost pure queueing — a 27 µs queue on a 47 µs RTT says congestion while loss is still absent. TIMELY's gradient controller adds or cuts based on the slope, which is why it needs hardware timestamps and a homogeneous fabric.
PFC deadlock
802.1Qbb pauses a congested link per-class instead of dropping — cyclic buffer dependencies can freeze the fabric.
More detail
PFC turns Ethernet lossless for RDMA by sending PAUSE frames per priority class; transitively the backpressure tree can cycle and deadlock, so PFC storms and watchdog timers are an operational requirement, not an edge case.
GRO batching
NIC/driver offload that coalesces same-flow segments before the stack sees them — fewer packet trips through the kernel.
More detail
TSO pushes segmentation into the NIC; GRO undoes it on receive, delivering one jumbo skb where the wire carried many frames. The numbers that survive: per-packet CPU dominates at 10G+, so offload wins whenever the flow and MTU line up — and distorts every measurement made above it.
XDP verdicts
An eBPF program runs on the raw frame before sk_buff exists; its return code is the entire forwarding decision.
More detail
DROP, PASS, TX, REDIRECT — four exits and no lookup stack below them. That's why XDP handles DDoS and L4 load-balancing at line rate: it runs in the driver's RX path and can rewrite or bounce a frame before the kernel allocates anything.
P4 match-action
P4 describes parser plus match-action tables so the switch forwards whatever protocol you define, not just what the ASIC knew.
More detail
The 2014 paper's bet was that forwarding should be specified per-deployment: parser graphs, typed tables, and primitives compiled into the switch. Today's reality: programmable pipelines exist but the fast ones are still match-action shaped — your protocol lives or dies by whether it fits that silhouette.
RDMA verbs
Kernel-bypass remote memory access — a peer reads or writes registered buffers with zero copies and no remote CPU.
More detail
The NIC does the transport: queue pairs, memory registration, completion queues, and one-sided READ/WRITE/ATOMIC verbs so a request never enters the peer's software. RoCEv2 wraps that in UDP/IPv4, which is why the fabric has to be lossless — reliability that TCP borrowed from the application got pushed into switch buffers.
DCQCN
Datacenter quantized congestion notification — CNPs carry the mark rate and rate is cut smoothly instead of halving.
More detail
RDMA cannot tolerate drops (the fabric is lossless via PFC), so DCQCN marks with ECN, the receiver reflects congestion notification packets, and the sender's rate controller follows the fraction marked — the same loop DCTCP runs at the transport layer, placed at the NIC for queues PFC would otherwise pause.
AI training fabric
Backend networks sized for collectives, not browsing — rail-optimized Clos, dedicated RoCE planes, latency measured in µs.
More detail
All-reduce dominates training traffic and every straggler stalls the step, so Meta's RoCE fabric builds a separate backend: dedicated Clos islands, load balancing tuned for elephant flows, and DCQCN parameters set for incast-heavy collectives rather than front-end workloads.
GRO/TSO pairing
TSO splits jumbo writes at the NIC; GRO merges them back — the stack sees big packets, the wire sees MTU frames.
More detail
The pair keeps per-packet work flat at 10G+: sender hands one 64 KB write, the NIC emits the frames, the receiving driver rebuilds one skb before the stack sees it. Any middlebox that reorders or rewrites breaks the merge — which is why offloads are measurement hazards, not just accelerators.
XDP hook
A sandboxed eBPF program runs in the driver's RX path — verdicts DROP/PASS/TX/REDIRECT before sk_buff exists.
More detail
The hook's power is its earliness: the program sees the raw frame and can rewrite, drop, hairpin, or redirect to a socket without kernel allocation. Facebook's L4 load balancer and Cloudflare's DDoS edge run there — the price is a verifier that rejects anything unbounded.
P4 pipeline
P4 defines a parser plus match-action tables so a switch forwards whatever header layout you declare — not just IP.
More detail
The 2014 CCR paper's ask was forwarding described per deployment rather than baked into silicon: parse graphs, typed tables, primitives. Its living descendants (Tofino-class chips, P4Runtime) prove the fast path is still match-action shaped — programs that fit run at line rate; everything else falls to the CPU.
Pod networking
Each pod gets a network namespace and an IP; a bridge plus overlay/NAT makes it routable across hosts.
More detail
Kubernetes delegates to CNI: a veth pair joins the pod's netns to the host bridge, and the overlay or BGP layer carries pod IPs cluster-wide. Egress looks like NAT, ingress like port-forwarding — containers are just private stacks; the interesting part is who allocates the address.
Maglev hashing
Google's L4 load balancer: ECMP to a Maglev, then consistent-hashing into a fixed lookup table per VIP.
More detail
Maglev's contribution is the table, not the hash: backends fill a lookup table proportionally with almost-disjoint permutations, so one backend's death remaps only its slots — not the hash ring. Connection tracking is local and best-effort; the steering survives server churn because the table, not a negotiated state, holds the mapping.
VXLAN overhead
A tenant Ethernet frame wrapped in UDP/IP with a 24-bit VNI — 16M segments riding the datacenter underlay.
More detail
VXLAN exists because 4096 VLANs are not enough and tenants should not see the physical topology: the frame gets outer Eth/IP/UDP/VXLAN headers (~50 B tax, shrunken effective MTU) and the underlay just routes IP. The multicast-versus-learned-flood question is why every overlay ends up paired with a control plane.
Jitter buffer
Playout delay absorbs arrival-time variation — deeper buffer survives more jitter but adds latency.
More detail
The buffer's depth sets the survival probability: wait one packet-time and any late packet is a dropout; wait three and the codec always has work. Adaptive playout tracks the delay distribution, not its mean — a percentile decision, which is why tail-latency thinking lands in a media lesson.
RTCP feedback
RTP carries media; RTCP carries reception reports, loss fractions and jitter estimates back to the sender.
More detail
The protocol pair is small on purpose: sequence numbers and timestamps in RTP, sender/receiver reports and NACKs in RTCP. Every modern mechanism is a consumer of those two numbers — the receiver calculates jitter from timestamp deltas and the sender learns loss from cumulative counts.
NACK versus FEC
Retransmit on NACK when RTT fits in the buffer; send FEC parity upfront when it does not.
More detail
The race is quantifiable: repair wins if RTT + jitter slack fits before playout; otherwise redundancy (XOR parity or Reed–Solomon) buys recovery at steady bitrate. Interleaving spreads burst loss across FEC blocks — the same erasure-code trick FEC used at the link layer, aimed at one deadline.
Media congestion control
WebRTC's controller fuses delay-gradient and loss signals into one target bitrate the encoder chases.
More detail
Unlike TCP, the sender can simply emit less — the knob is encoder bitrate, so congestion control becomes estimation: Kalman-filtered one-way delay variation flags queue growth, loss rate caps the ceiling, and AIMD walks the estimate between the two bounds.
Digital signature
A signature is a private-key operation on a message hash — anyone can check it with the public key.
More detail
RSA signing is exponentiation of the padded hash with d; ECDSA and Ed25519 move to group arithmetic with fresh or deterministic nonces. The fragility is the nonce: a reused or biased k hands over the signing key, which is why Ed25519 derives the nonce from the key plus the message.
Certificate chain
A certificate binds a name to a public key via a CA signature; trust chains through intermediates to a root.
More detail
The chain is the audit trail of delegation: the leaf attests the site's key, each intermediate vouches for the one below, and verification ends at a root shipped in the trust store. Everything else — SANs, validity windows, key-usage bits — is policy the verifier enforces on that path.
Revocation and CT
CRLs and OCSP answer 'is this cert still valid'; Certificate Transparency logs make issuance itself auditable.
More detail
Revocation is the PKI's acknowledged soft underbelly — stapled OCSP is stale by design and CRLs are fetched lazily — so the modern answer shifts to evidence: CT logs require a signed inclusion promise before browsers trust a cert, turning silent misissuance into a visible event.
Packet capture
tcpdump/Wireshark see packets at a point — before some offloads, after some losses, and never the wire itself.
More detail
The capture point is the instrument's bias: GRO merges arrive as one segment, drops upstream never appear, and buffer exhaustion loses more under rate. Filters exist to keep the capture cheap enough to be truthful.
Packet-pair dispersion
Two back-to-back probes leave the bottleneck spaced by its service time — measure that gap, get capacity.
More detail
Keshav's observation: dispersion is information. If the bottleneck serves at C bits/s, a pair of length L leaves L/C apart and downstream links preserve it — queueing asymmetry is the error term, which is why estimators average over many pairs rather than trusting one.
MAC addresses
Two 48-bit MAC addresses: who should copy the frame, and who sent it (the source is what replies address — and what learning switches will read).
Go to Ethernet frames and MAC addresses →EtherType
A value of or less is an 802.3 length; or more is an EtherType, the demultiplexing key that names the payload's protocol — IPv4 is 0x0800, ARP 0x0806, IPv6 0x86DD in the IEEE's registry.
Go to Ethernet frames and MAC addresses →OUI
The first three bytes of a universally administered address are the manufacturer's OUI (organisationally unique identifier), assigned by the IEEE's registration authority; the vendor numbers the remaining three.
Go to Ethernet frames and MAC addresses →multicast
Two low bits of the first byte modify the whole address: the group bit marks multicast — addressed to a set of adaptors rather than one — and the local bit marks a locally administered address that an administrator may assign without an OUI.
Go to Ethernet frames and MAC addresses →broadcast
The all-ones address ff:ff:ff:ff:ff:ff is broadcast: the multicast that names every adaptor.
Go to Ethernet frames and MAC addresses →Promiscuous mode
Promiscuous mode disables the filter entirely — useless to a workstation, essential to the bridge that must receive every frame to forward it.
Go to Ethernet frames and MAC addresses →collision domain
Shared Ethernet gives every station the same wire and makes them take turns on it: one collision domain, one speed, every frame audible to every host, and a hard geometric limit on how far the contention can stretch.
Go to Learning switches: forwarding without configuration →switch
The escape is not a better sharing rule but a device that forwards — a switch that receives each frame whole, looks up its destination address, and emits it on only the port that leads there.
Go to Learning switches: forwarding without configuration →bridge
The first fix was the bridge: a promiscuous node joining two LANs that accepts every frame and repeats the ones that belong on the far side.
Go to Learning switches: forwarding without configuration →flood
Look up the destination: known ⇒ send only on the recorded port (and drop the frame if that port is the one it arrived on — the destination already heard it); unknown ⇒ flood a copy out every port except the ingress; broadcast ⇒ flood likewise, always.
Go to Learning switches: forwarding without configuration →spanning-tree protocol
The resolution is to leave the wires alone and make the forwarding graph loop-free instead: the spanning-tree protocol has the switches elect a root, keep each bridge's shortest path to it, and block every port that is not on the tree — all of it computed by the switches exchanging three numbers, and all of it recomputed when something breaks.
Go to Spanning tree: loop-free forwarding over a redundant LAN →broadcast storm
This is the broadcast storm: not a bug in flooding but flooding meeting a cycle.
Go to Spanning tree: loop-free forwarding over a redundant LAN →bridge ID
Each switch owns a bridge ID — a priority field on top of one of its MAC addresses — and the root bridge is simply the lowest ID in the LAN; numeric order does the electing.
Go to Spanning tree: loop-free forwarding over a redundant LAN →root bridge
Each switch owns a bridge ID — a priority field on top of one of its MAC addresses — and the root bridge is simply the lowest ID in the LAN; numeric order does the electing.
Go to Spanning tree: loop-free forwarding over a redundant LAN →configuration messages
Switches exchange configuration messages (BPDUs) carrying three fields, written : the ID the sender currently believes is root, the sender's distance to it in hops, and the sender's own ID.
Go to Spanning tree: loop-free forwarding over a redundant LAN →designated switch
On each link, the switch closer to the root (ties to the lower ID) is the designated switch for that link and keeps forwarding on it.
Go to Spanning tree: loop-free forwarding over a redundant LAN →blocked
Every port that is neither a root port nor a designated port is blocked: BPDUs still flow, data does not.
Go to Spanning tree: loop-free forwarding over a redundant LAN →edge ports
RSTP — now folded into IEEE 802.1Q Clause 13 alongside STP — removes most of that pause: on point-to-point links a switch can propose its port role and get an explicit agreement back, converging in roughly the time a few handshakes take rather than waiting out timer expiry, and edge ports that face a single host forward immediately.
Go to Spanning tree: loop-free forwarding over a redundant LAN →virtual LAN
A virtual LAN (VLAN) partitions the same wires into several independent LANs: the switch tags each frame with a -bit identifier, forwards and floods only within that identifier's domain, and asks a router for anything that must cross.
Go to VLANs: several LANs on one set of switches →VLAN ID
The first two are the tag protocol identifier 0x8100 — an EtherType announcing "a tag follows" — and the next two, the tag control information, carry three bits of priority, one drop-eligibility bit, and the -bit VLAN ID (VID).
Go to VLANs: several LANs on one set of switches →access port
An access port faces a host and belongs to exactly one VLAN; frames on its wire stay untagged, so the host knows nothing of the machinery.
Go to VLANs: several LANs on one set of switches →trunk port
A trunk port joins switches and carries many VLANs; there the tag does its work, telling the far switch which domain each frame belongs to.
Go to VLANs: several LANs on one set of switches →best-effort datagram
So the internetwork layer offers a best-effort datagram service: connectionless, so no setup precedes a packet; self-contained, so each packet carries everything a router needs to forward it; and honest about its failures — a packet may be lost, duplicated, delivered out of order, delayed arbitrarily, or arrive with its payload corrupted.
Go to IPv4: a best-effort datagram across any link →network part
So an IPv4 address splits into a network part (which network) and a host part (which host on it).
Go to IP addresses and CIDR: prefixes that aggregate →host part
So an IPv4 address splits into a network part (which network) and a host part (which host on it).
Go to IP addresses and CIDR: prefixes that aggregate →prefix
A prefix is written a.b.c.d/x — the low bits zeroed, the fixed-bit count — or equivalently as an address plus a netmask of ones then zeros.
Go to IP addresses and CIDR: prefixes that aggregate →private addressing
Three whole ranges are reserved for private addressing under RFC 1918:
Go to IP addresses and CIDR: prefixes that aggregate →binary trie
The bit-by-bit structure is a binary trie: level of the tree branches on bit of the address, so each node represents the prefix spelled by the path to it.
Go to Longest-prefix match: the forwarding lookup →ARP cache
Resolutions live in the ARP cache.
Go to ARP: from IP address to MAC address →gratuitous ARP
A host may also broadcast its own mapping unasked — gratuitous ARP.
Go to ARP: from IP address to MAC address →PMTUD black hole
The transport interprets each loss as congestion, retransmits, and stalls: this is the classic PMTUD black hole, catalogued by RFC 2923.
Go to Path MTU discovery: avoiding fragmentation →full-stop timeout
Detection can only come from the sender's own clock: a full-stop timeout — TCP's R1 threshold in RFC 1122 — with no ICMP explanation is treated as a detected black hole, and the recovery is blunt: fall to the smallest useful size, then halve the estimate on each successive timeout, bounded below by bytes for IPv4 and for IPv6.
Go to Path MTU discovery: avoiding fragmentation →link-state routing
Distance vector answers the job by exchanging summaries; link-state routing answers it more aggressively: every router describes the few links it can actually see, the domain floods those descriptions to every other router, and each router independently runs Dijkstra's algorithm over the assembled map.
Go to Link-state routing: flood the topology, compute locally →link-state packet
Three objects make it work — the link-state advertisement (LSA, distributed in a link-state packet, LSP), the flooding protocol that delivers it, and the synchronised link-state database (LSDB) every router computes from — and one window of risk: the interval between a topology change and convergence, during which forwarding loops are possible.
Go to Link-state routing: flood the topology, compute locally →link-state database
Three objects make it work — the link-state advertisement (LSA, distributed in a link-state packet, LSP), the flooding protocol that delivers it, and the synchronised link-state database (LSDB) every router computes from — and one window of risk: the interval between a topology change and convergence, during which forwarding loops are possible.
Go to Link-state routing: flood the topology, compute locally →convergence
Three objects make it work — the link-state advertisement (LSA, distributed in a link-state packet, LSP), the flooding protocol that delivers it, and the synchronised link-state database (LSDB) every router computes from — and one window of risk: the interval between a topology change and convergence, during which forwarding loops are possible.
Go to Link-state routing: flood the topology, compute locally →hello
Neighbourhood is discovered and continuously re-checked with hello packets sent to immediate neighbours at a defined interval — miss hellos for long enough and the link is declared down.
Go to Link-state routing: flood the topology, compute locally →areas
That bill is why a real OSPF deployment does not run one flat domain — it partitions the autonomous system into areas wired to a single backbone, lets area border routers (ABRs) summarise what crosses the boundary, and trades away a controlled amount of route optimality for a database and flood that scale with one area instead of the whole AS.
Go to OSPF areas: hierarchy that limits flooding →backbone
That bill is why a real OSPF deployment does not run one flat domain — it partitions the autonomous system into areas wired to a single backbone, lets area border routers (ABRs) summarise what crosses the boundary, and trades away a controlled amount of route optimality for a database and flood that scale with one area instead of the whole AS.
Go to OSPF areas: hierarchy that limits flooding →area border routers
That bill is why a real OSPF deployment does not run one flat domain — it partitions the autonomous system into areas wired to a single backbone, lets area border routers (ABRs) summarise what crosses the boundary, and trades away a controlled amount of route optimality for a database and flood that scale with one area instead of the whole AS.
Go to OSPF areas: hierarchy that limits flooding →area
An area is a set of contiguous networks plus the routers interfacing to them, and each area runs a separate copy of the link-state algorithm: its own LSDB, its own flooding, its own SPF computation.
Go to OSPF areas: hierarchy that limits flooding →virtual link
It must be contiguous, though not physically so: a virtual link between two backbone routers sharing a transit area is treated as an unnumbered point-to-point backbone link, priced at its intra-area distance, and exists to repair backbone partitions or extend the backbone to an area with no physical border router.
Go to OSPF areas: hierarchy that limits flooding →Distance-vector routing
Distance-vector routing takes the cheaper contract — share only distances.
Go to Distance-vector routing: distributed Bellman–Ford →infinity
RIP declares infinity to be 16: metrics 1–15 are valid routes and 16 means unreachable.
Go to Count to infinity: why distance vectors learn bad news slowly →Split horizon
Split horizon removes exactly that advertisement: a router never reports a destination to the neighbour that destination's route was learned from.
Go to Count to infinity: why distance vectors learn bad news slowly →Split horizon with poisoned reverse
Split horizon with poisoned reverse replaces the silence with an explicit lie-for-good: report each destination back to its teacher at metric 16, every update.
Go to Count to infinity: why distance vectors learn bad news slowly →path vector
A path vector advertisement carries the whole router-level path; a router that finds itself in a received path discards the route on inspection — killing loops of every length at receive time, with no bound and no counting.
Go to Count to infinity: why distance vectors learn bad news slowly →Equal-cost multipath
Equal-cost multipath (ECMP) installs all tied next hops in the forwarding table and chooses among them per flow — hashing header fields so every packet of a flow takes the same path and arrives in order, while different flows spread across the ties.
Go to Equal-cost multipath: spreading flows over several best paths →per-flow load balancing
The load-balancing identity of a TCP/UDP conversation is the 5-tuple — source IP, destination IP, protocol, source port, destination port — and hashing all five — the hash contract from Data Structures, applied to packet headers — gives per-flow load balancing: every new connection gets an independent coin flip.
Go to Equal-cost multipath: spreading flows over several best paths →polarisation
This is polarisation — not a rare event but a deterministic consequence of reusing one hash: collide once, collide always.
Go to Equal-cost multipath: spreading flows over several best paths →autonomous system number
To exist on that graph at all, an organisation registers with the Internet Assigned Numbers Authority (IANA) and receives a unique autonomous system number (ASN) — a 32-bit identifier, centrally assigned. (UC Berkeley holds ASN 25, an artefact of registering in the 1980s, when the list was short.) Inside the graph, two kinds of nodes dominate.
Go to Autonomous systems: customers, providers and peers →stub AS
A stub AS exists to connect its own hosts: it sends and receives its own traffic and forwards nobody else's — banks and universities, the vast majority of ASes.
Go to Autonomous systems: customers, providers and peers →transit AS
A transit AS carries other people's packets for a living, the way an intra-domain router forwards for its hosts; carriers like AT&T and Verizon are the canonical examples.
Go to Autonomous systems: customers, providers and peers →local traffic
Peterson and Davie refine the taxonomy with traffic direction: local traffic originates or terminates inside the AS, transit traffic merely passes through — so a stub carries only local traffic, a multihomed stub buys links from several providers yet still refuses transit, and a transit AS accepts transit traffic by definition.
Go to Autonomous systems: customers, providers and peers →transit traffic
Peterson and Davie refine the taxonomy with traffic direction: local traffic originates or terminates inside the AS, transit traffic merely passes through — so a stub carries only local traffic, a multihomed stub buys links from several providers yet still refuses transit, and a transit AS accepts transit traffic by definition.
Go to Autonomous systems: customers, providers and peers →multihomed stub
Peterson and Davie refine the taxonomy with traffic direction: local traffic originates or terminates inside the AS, transit traffic merely passes through — so a stub carries only local traffic, a multihomed stub buys links from several providers yet still refuses transit, and a transit AS accepts transit traffic by definition.
Go to Autonomous systems: customers, providers and peers →customer-provider
In a customer-provider relationship the customer pays the provider for connectivity to the rest of the Internet — the campus pays the carrier — and we draw a directed edge from provider to customer: the arrow records who gets paid, not which way packets flow (packets flow both ways regardless).
Go to Autonomous systems: customers, providers and peers →peer
In a peer relationship two ASes that view each other as equals agree, usually by contract, to exchange traffic without payment, provided the flow stays roughly equal in both directions — drawn as an undirected edge.
Go to Autonomous systems: customers, providers and peers →Tier-1
Second, arranging that acyclic graph as a hierarchy puts stubs at the bottom and providers at the top — and at the very top sit the Tier-1 ASes, which have no providers and peer with each other; around twenty real ASes occupy that tier.
Go to Autonomous systems: customers, providers and peers →internet exchange point
Often at a single shared location — an internet exchange point (IXP, a peering point) — where many providers interconnect over a common fabric rather than each pair laying a private link.
Go to Autonomous systems: customers, providers and peers →BGP speakers
BGP is spoken by BGP speakers — typically an AS's border routers — in pairwise sessions.
Go to BGP: path vectors between autonomous systems →eBGP
A session between routers in different ASes is eBGP (external); a session between routers inside one AS, used to spread externally learned routes around, is iBGP (internal — its mechanics get their own topic).
Go to BGP: path vectors between autonomous systems →iBGP
A session between routers in different ASes is eBGP (external); a session between routers inside one AS, used to spread externally learned routes around, is iBGP (internal — its mechanics get their own topic).
Go to BGP: path vectors between autonomous systems →withdrawn routes
One UPDATE carries three things: a list of withdrawn routes (prefixes to forget — the negative advertisement, so dead routes die explicitly rather than timing out), a list of path attributes describing the announced routes, and the NLRI — network-layer reachability information — the set of prefixes those attributes apply to, each encoded as a <length, prefix> pair.
Go to BGP: path vectors between autonomous systems →path attributes
One UPDATE carries three things: a list of withdrawn routes (prefixes to forget — the negative advertisement, so dead routes die explicitly rather than timing out), a list of path attributes describing the announced routes, and the NLRI — network-layer reachability information — the set of prefixes those attributes apply to, each encoded as a <length, prefix> pair.
Go to BGP: path vectors between autonomous systems →NLRI
One UPDATE carries three things: a list of withdrawn routes (prefixes to forget — the negative advertisement, so dead routes die explicitly rather than timing out), a list of path attributes describing the announced routes, and the NLRI — network-layer reachability information — the set of prefixes those attributes apply to, each encoded as a <length, prefix> pair.
Go to BGP: path vectors between autonomous systems →import filter
The import filter sits between Adj-RIBs-In and Loc-RIB: it can reject an announcement outright (loop, disliked path, policy) or tag an accepted route with a local preference.
Go to BGP: path vectors between autonomous systems →export filter
The export filter sits between Loc-RIB and Adj-RIBs-Out: it picks which installed routes each neighbour hears about — and only the route the AS itself uses gets re-announced, so an advertisement is a promise, not gossip.
Go to BGP: path vectors between autonomous systems →degree of preference
Phase 1 computes, for each newly received route, a degree of preference — a non-negative number that becomes the route's LOCAL_PREF value when it is readvertised internally.
Go to BGP route selection: policy first, distance last →permitted paths
Strip the protocol to its skeleton, as Griffin, Shepherd and Wilfong's Stable Paths Problem does: a destination AS ; every other AS holding a ranked list of permitted paths to — the candidates its policy allows, in its private order of preference; and the rule that AS may use path only while neighbour 's own chosen path is exactly the tail .
Go to Valley-free routing: when policy routing is stable →Multiprotocol Label Switching
Multiprotocol Label Switching (MPLS) breaks that coupling: a short, fixed-length label, meaningful only between two neighbouring routers, is attached at the edge and swapped hop by hop, so a packet follows whatever path the label bindings describe — shortest or not.
Go to MPLS: forwarding on labels along explicit paths →label
Multiprotocol Label Switching (MPLS) breaks that coupling: a short, fixed-length label, meaningful only between two neighbouring routers, is attached at the edge and swapped hop by hop, so a packet follows whatever path the label bindings describe — shortest or not.
Go to MPLS: forwarding on labels along explicit paths →shim header
MPLS makes that tag a 20-bit label carried in a 4-byte shim header inserted between the link-layer and network-layer headers (RFC 3032: label 20 bits, then 3 bits of traffic class, a 1-bit bottom-of-stack flag , and an 8-bit TTL).
Go to MPLS: forwarding on labels along explicit paths →label edge router
Three roles matter: a label edge router (LER) classifies an incoming IP packet into a forwarding equivalence class (FEC — "all packets to this prefix that should take the engineered path") and pushes a label; each label switching router (LSR) along the way looks the incoming label up in a table, takes the recorded action — usually swap to the next label and forward — and the last LSR (or, conventionally, the penul…
Go to MPLS: forwarding on labels along explicit paths →forwarding equivalence class
Three roles matter: a label edge router (LER) classifies an incoming IP packet into a forwarding equivalence class (FEC — "all packets to this prefix that should take the engineered path") and pushes a label; each label switching router (LSR) along the way looks the incoming label up in a table, takes the recorded action — usually swap to the next label and forward — and the last LSR (or, conventionally, the penul…
Go to MPLS: forwarding on labels along explicit paths →label switching router
Three roles matter: a label edge router (LER) classifies an incoming IP packet into a forwarding equivalence class (FEC — "all packets to this prefix that should take the engineered path") and pushes a label; each label switching router (LSR) along the way looks the incoming label up in a table, takes the recorded action — usually swap to the next label and forward — and the last LSR (or, conventionally, the penul…
Go to MPLS: forwarding on labels along explicit paths →label-switched path
The sequence of routers a labelled packet traverses is a label-switched path (LSP).
Go to MPLS: forwarding on labels along explicit paths →segments
Segment routing (RFC 8402) moves the path into the packet — the source encodes the route as an ordered list of segments carried in the header, and transit routers need only the segment identifiers their IGP already advertises: no per-path state, no signalling protocol inside the network.
Go to Segment routing: the path carried in the packet →SR Policy
An SR Policy is an ordered list of segments applied at the headend (the ingress).
Go to Segment routing: the path carried in the packet →node (prefix) SID
A segment names an instruction the network executes, and the two kinds that carry a path are topological: a node (prefix) SID says "forward toward this node by the best IGP path" — a global segment every router agrees on, advertised by the link-state protocol — and an adjacency SID says "forward out this specific interface to this neighbour" — a local segment meaningful only where it was allocated.
Go to Segment routing: the path carried in the packet →adjacency SID
A segment names an instruction the network executes, and the two kinds that carry a path are topological: a node (prefix) SID says "forward toward this node by the best IGP path" — a global segment every router agrees on, advertised by the link-state protocol — and an adjacency SID says "forward out this specific interface to this neighbour" — a local segment meaningful only where it was allocated.
Go to Segment routing: the path carried in the packet →Software-defined networking
Software-defined networking splits the two jobs: switches keep fast match–action tables, and a logically centralised controller programs them through a standard interface.
Go to Software-defined networking: centralising the control plane →flow table
An OpenFlow switch (2008) is three parts: a flow table, a secure channel to the controller, and the OpenFlow protocol spoken over it.
Go to Software-defined networking: centralising the control plane →secure channel
An OpenFlow switch (2008) is three parts: a flow table, a secure channel to the controller, and the OpenFlow protocol spoken over it.
Go to Software-defined networking: centralising the control plane →Network Operating System
That separation is what turns "compute the best routing" from a protocol problem into a program: the Network Operating System layer presents the map abstraction, and a TE application running on it can finally evaluate the LP from earlier and push the resulting splits down as flow-table entries.
Go to Software-defined networking: centralising the control plane →Flow Group
The abstractions map cleanly onto the flow LP: a Flow Group is a demand (sites, apps, priority), a Tunnel is a site-level path, a Tunnel Group binds flows to tunnels with weights; per-FG dimensionless fair-share objectives give a max-min allocation, a generator allocates bandwidth at bottleneck edges, and a quantization step adjusts split fractions to what the hardware can express.
Go to Software-defined networking: centralising the control plane →Tunnel
The abstractions map cleanly onto the flow LP: a Flow Group is a demand (sites, apps, priority), a Tunnel is a site-level path, a Tunnel Group binds flows to tunnels with weights; per-FG dimensionless fair-share objectives give a max-min allocation, a generator allocates bandwidth at bottleneck edges, and a quantization step adjusts split fractions to what the hardware can express.
Go to Software-defined networking: centralising the control plane →Tunnel Group
The abstractions map cleanly onto the flow LP: a Flow Group is a demand (sites, apps, priority), a Tunnel is a site-level path, a Tunnel Group binds flows to tunnels with weights; per-FG dimensionless fair-share objectives give a max-min allocation, a generator allocates bandwidth at bottleneck edges, and a quantization step adjusts split fractions to what the hardware can express.
Go to Software-defined networking: centralising the control plane →port
The transport's answer is the port: a small integer used as an abstract locator, so that a source process sends to a port and a destination process receives from a port.
Go to Ports and demultiplexing: from host to process →four-tuple
The connection's demux key is the full four-tuple: source address, source port, destination address, destination port.
Go to Ports and demultiplexing: from host to process →well-known port
The common one is the well-known port: each standard service holds a fixed, widely published number — DNS on port , SMTP mail on port , the old Unix talk program on — listed in the service-name registry and on most systems in /etc/services.
Go to Ports and demultiplexing: from host to process →ephemeral port
Either way, the client's own port is chosen the other way around — it needs no publication at all, so the OS picks an ephemeral port: any currently-free number from the dynamic range, held only for the conversation's life.
Go to Ports and demultiplexing: from host to process →pseudo-header
Its input is not just the UDP header and data but a twelve-byte pseudo-header assembled from the IP header: source address ( B), destination address ( B), a zero byte plus the protocol number ( B), and the UDP length again ( B).
Go to UDP: the minimal transport →automatic repeat request
The ARQ (automatic repeat request) strategy answers both with two mechanisms.
Go to Stop-and-wait ARQ: acknowledgements, timeouts and sequence numbers →acknowledgement
First, an acknowledgement — a small control message the receiver returns for every packet it accepts, so arrival is observable by the sender.
Go to Stop-and-wait ARQ: acknowledgements, timeouts and sequence numbers →timeout
Second, a timeout: if no ACK returns within a chosen interval, the sender treats the packet as lost and retransmits it, converting uncertainty into a retry.
Go to Stop-and-wait ARQ: acknowledgements, timeouts and sequence numbers →spurious retransmission
The ACK can arrive in time (the common case), the data packet can be lost outright (the timeout rescues it), the ACK can be lost (the timeout rescues that too — but the retransmission delivers a second copy to the receiver), or the timeout can fire early on a merely-delayed reply — a spurious retransmission that produces the same duplicate.
Go to Stop-and-wait ARQ: acknowledgements, timeouts and sequence numbers →pipelining
The missing mechanism is pipelining: let up to packets be outstanding at once, and let a sliding window track which sequence numbers may still be sent and which may still arrive.
Go to Pipelining and sliding windows →send window
The send window bounds how many frames may be unacknowledged at once; is the last acknowledgement received; the last frame sent.
Go to Pipelining and sliding windows →receive window
The receive window bounds how many out-of-order frames it will hold: is the last frame received in order, the largest acceptable frame, and a frame is accepted exactly when .
Go to Pipelining and sliding windows →Cumulative acknowledgement
Its acknowledgement is cumulative: it names the largest sequence number such that every frame up to has arrived, so one ACK can advance the sender's window past several frames at once. is a policy choice — discards everything out of order, holds anything the sender could have sent, and buys nothing.
Go to Pipelining and sliding windows →Selective acknowledgement
Let the receiver hold a real window — buffer arrivals that land past a gap, acknowledge each packet individually — and give every outstanding packet its own timer at the sender.
Go to Selective repeat: buffer out of order, retransmit only losses →segment
Every octet of the stream carries a 32-bit sequence number, each segment labels the range of the stream it carries, and the receiver acknowledges not what arrived but what it next expects — a cumulative ACK that sweeps every earlier byte at once.
Go to TCP's byte stream: segments, sequence numbers and cumulative ACKs →Byte stream
The service TCP exports is a pair of independent byte streams, one per direction: the sending application writes bytes into its end and the receiving application reads bytes out of the other — TCP buffers the writes and packetizes at its own pace, so segment boundaries have no required relationship to write boundaries.
Go to TCP's byte stream: segments, sequence numbers and cumulative ACKs →Cumulative acknowledgment
Since every octet is numbered, every octet can be acknowledged — and the acknowledgment mechanism is cumulative: the Acknowledgement field names the next expected byte, so an acknowledgment of declares that every octet before has been received.
Go to TCP's byte stream: segments, sequence numbers and cumulative ACKs →Initial sequence number
Each side therefore chooses an initial sequence number (ISN) and must prove to the other that its number was heard by a live peer — a three-way handshake that randomised clocks make unforgeable to eavesdroppers.
Go to TCP connection establishment: the three-way handshake →Half-close
TCP closes each stream independently with a FIN that consumes a sequence number like a byte, permits a lopsided half-close where one side has said its last word while the other keeps talking, and then — the part most designs omit — makes the side that closed wait out two maximum segment lifetimes in TIME_WAIT before the four-tuple may be recycled.
Go to TCP teardown: FIN, half-close and TIME_WAIT →TIME_WAIT
TCP closes each stream independently with a FIN that consumes a sequence number like a byte, permits a lopsided half-close where one side has said its last word while the other keeps talking, and then — the part most designs omit — makes the side that closed wait out two maximum segment lifetimes in TIME_WAIT before the four-tuple may be recycled.
Go to TCP teardown: FIN, half-close and TIME_WAIT →RST
A RST aborts the connection immediately — no negotiation, no waiting for outstanding data, no handshake — the receiving side abandons its state and delivers a reset error to the application rather than an end-of-stream.
Go to TCP teardown: FIN, half-close and TIME_WAIT →immediate duplicate ACK
RFC 5681 makes that repetition deliberate: a receiver SHOULD send an immediate duplicate ACK whenever a segment arrives out of order, telling the sender both that a segment arrived and which sequence number it still expects.
Go to Fast retransmit and SACK: repairing loss before the timer fires →fast retransmit
On the third duplicate ACK the sender retransmits the segment starting at the left edge — the next unacknowledged byte — without waiting for the timer; this is fast retransmit.
Go to Fast retransmit and SACK: repairing loss before the timer fires →fast recovery
Because each duplicate ACK proves another segment left the network into the receiver's buffer, the acknowledgement "clock" is preserved, and the sender keeps pacing new data under a reduced congestion window (fast recovery) rather than restarting from scratch — the window arithmetic itself is congestion control's topic.
Go to Fast retransmit and SACK: repairing loss before the timer fires →SACK
The SACK extension, RFC 2018, lets the receiver say what it is holding: a Sack-Permitted option (kind ) in the SYN enables it, and thereafter each duplicate ACK carries a SACK option (kind ) listing non-contiguous received blocks as pairs of 32-bit edges — Left Edge the first sequence number held, Right Edge one past the last.
Go to Fast retransmit and SACK: repairing loss before the timer fires →RACK
RFC 8985's RACK (Recent Acknowledgement) replaces counting with time.
Go to Fast retransmit and SACK: repairing loss before the timer fires →persist timer
TCP breaks it on the sender's side: while the advertised window is zero the sender keeps a persist timer and periodically transmits a zero-window probe — a one-byte segment carrying the next real data byte, which must be real because the receiver might accept it.
Go to TCP flow control: the receive window →zero-window probe
TCP breaks it on the sender's side: while the advertised window is zero the sender keeps a persist timer and periodically transmits a zero-window probe — a one-byte segment carrying the next real data byte, which must be real because the receiver might accept it.
Go to TCP flow control: the receive window →window scale option
RFC 7323's window scale option is tiny: kind , length , one byte of shift count.
Go to TCP window scaling: windows larger than 64 KB →timestamps option
The second clock is the timestamps option: the sender stamps each segment with a monotonically increasing value, the receiver echoes it, and the pair serves both jobs RFC 7323 specifies — RTTM (a precise per-segment RTT measurement feeding the retransmission timer) and PAWS (Protection Against Wrapped Sequences): a segment whose timestamp is older than the connection's current clock is a stale duplicate and is dro…
Go to TCP window scaling: windows larger than 64 KB →Nagle's algorithm
Nagle's algorithm replaces the timer with the ACK stream itself: a connection may have at most one small segment outstanding — while any previously sent data remains unacknowledged, new user data is buffered and coalesced, and it is flushed the moment the ACK arrives.
Go to Nagle's algorithm and delayed ACKs: two good ideas that collide →delayed ACK
RFC 1122 §4.2.3.2 requires a delayed ACK: a receiver SHOULD withhold an ACK for less than s, and MUST ACK at least every second full-sized segment.
Go to Nagle's algorithm and delayed ACKs: two good ideas that collide →Goodput
Goodput is the rate at which new data is delivered to the receiver — copies of already-delivered packets, and packets dropped downstream, do not count.
Go to Congestion collapse: when retransmission makes overload worse →water-filling
The definition suggests the algorithm directly — water-filling: start all rates at zero and raise them together; when a link saturates, freeze the flows crossing it (that link is their bottleneck) and keep raising the rest.
Go to Max-min fairness: what a fair allocation is →congestion window
The fix is the congestion window : a sender-side allowance that grows exponentially during slow start until it crosses a threshold, then grows linearly in congestion avoidance, and snaps back on every loss signal.
Go to Slow start and Reno: the congestion window →slow-start threshold
A second state variable, the slow-start threshold , is set "arbitrarily high" at connection start (the largest possible advertised window) so that the network, not a guess, decides where growth slows.
Go to Slow start and Reno: the congestion window →partial
If two segments of the same window are lost, the ACK for the first repair is only partial: it advances the cumulative acknowledgement but does not cover everything outstanding when recovery began.
Go to Slow start and Reno: the congestion window →Mathis model
This lesson derives the Mathis model: average the periodic sawtooth over one cycle — a mean window of spanning segments between loss events — to get and throughput .
Go to The TCP throughput model: rate falls as one over root loss →RTT unfairness
Short RTTs win at fixed loss: , so two flows sharing a bottleneck with the same split the link in proportion to — RTT unfairness: a flow with half the round-trip time takes twice the throughput of its neighbour.
Go to The TCP throughput model: rate falls as one over root loss →TCP-friendly region
RFC 9438 therefore keeps a TCP-friendly region: the sender also tracks a virtual Reno window , growing it by segments per RTT, and takes .
Go to CUBIC: window growth as a function of time →sojourn time
This lesson prices that delay (a -Mbit buffer behind a Mb/s uplink adds s when full), then derives active queue management: RED's early random drops on a measured average queue — and why its knobs defeated it — and CoDel's control of sojourn time, the per-packet residence time in the queue, with its ms target, ms interval and drop spacing.
Go to Bufferbloat and active queue management →zones
This lesson derives DNS's answer: a hierarchical namespace cut into zones, each the unit of administration delegated with NS records and, where the server's own name lies inside the delegated zone, glue address records — plus the record types every zone publishes.
Go to The DNS namespace: names, zones and delegation →NS
This lesson derives DNS's answer: a hierarchical namespace cut into zones, each the unit of administration delegated with NS records and, where the server's own name lies inside the delegated zone, glue address records — plus the record types every zone publishes.
Go to The DNS namespace: names, zones and delegation →glue
This lesson derives DNS's answer: a hierarchical namespace cut into zones, each the unit of administration delegated with NS records and, where the server's own name lies inside the delegated zone, glue address records — plus the record types every zone publishes.
Go to The DNS namespace: names, zones and delegation →Domain name
A node's domain name is the list of labels on the path up to the root, printed most-specific first and separated by dots, so penguins.cs.princeton.edu names the host penguins inside cs inside princeton inside edu.
Go to The DNS namespace: names, zones and delegation →absolute
A name ending in a dot is absolute; anything else is relative and completed with the local domain — which is how penguins typed in a Princeton office quietly means penguins.cs.princeton.edu.
Go to The DNS namespace: names, zones and delegation →Relative domain name
A name ending in a dot is absolute; anything else is relative and completed with the local domain — which is how penguins typed in a Princeton office quietly means penguins.cs.princeton.edu.
Go to The DNS namespace: names, zones and delegation →domain
A node's domain name is the list of labels on the path up to the root, printed most-specific first and separated by dots, so penguins.cs.princeton.edu names the host penguins inside cs inside princeton inside edu.
Go to The DNS namespace: names, zones and delegation →SOA
Zone data has four parts: the authoritative records for every node in the region; the records at the zone's top node, a set of NS records plus exactly one SOA record carrying the zone's management parameters; the NS records marking delegations at cuts around the bottom edge; and glue address records for any servers named below those cuts.
Go to The DNS namespace: names, zones and delegation →Resource record
Everything a zone knows is expressed as resource records, each a 5-tuple (Name, TTL, Type, Class, Value) — the Type says how to read the Value, and the TTL bounds how long others may cache it.
Go to The DNS namespace: names, zones and delegation →stub resolver
The resolution machinery splits the work three ways: a stub resolver on each host that simply asks, a recursive resolver (usually run by the network operator or an ISP) that does the walking, and authoritative servers that hold zone data and merely answer or refer.
Go to DNS resolution: stub, recursive and authoritative servers →recursive resolver
The resolution machinery splits the work three ways: a stub resolver on each host that simply asks, a recursive resolver (usually run by the network operator or an ISP) that does the walking, and authoritative servers that hold zone data and merely answer or refer.
Go to DNS resolution: stub, recursive and authoritative servers →Authoritative server
The resolution machinery splits the work three ways: a stub resolver on each host that simply asks, a recursive resolver (usually run by the network operator or an ISP) that does the walking, and authoritative servers that hold zone data and merely answer or refer.
Go to DNS resolution: stub, recursive and authoritative servers →iterative queries
The recursive resolver issues iterative queries from the root downward, speaking a single message format that rides UDP port with a -byte ceiling — longer answers truncate, set the TC bit, and retry over TCP unless EDNS(0) first negotiated a larger payload.
Go to DNS resolution: stub, recursive and authoritative servers →OPT
EDNS(0) loosens the cap hop by hop: an OPT pseudo-record in the additional section lets each side advertise the largest UDP payload it can reassemble (carried in the OPT's class field), so a pair that both speak EDNS can exchange multi-kilobyte responses without the TCP fallback.
Go to DNS resolution: stub, recursive and authoritative servers →cache
The resolution walk pays round trips for every uncached name and aims every one of them at the same few root and TLD servers — a design that could not survive real traffic if it ran per lookup.
Go to DNS caching and TTLs: how DNS scales →TTL
DNS survives because every resolver keeps a cache: each record carries a TTL (time to live) in seconds, counts down once stored, and is discarded on expiry — a bound on staleness exactly like TTL-based caches elsewhere, except here the authority for the bound is per record and set by the zone owner, not the caching party.
Go to DNS caching and TTLs: how DNS scales →lease
DHCP therefore issues each address as a lease — a finite hold, after which the server may hand the address to someone else.
Go to DHCP: configuring a host that has no address →relay agent
The escape is the relay agent, a small function (usually in the subnet's router) that is configured with exactly one fact: the DHCP server's unicast address.
Go to DHCP: configuring a host that has no address →autonomous flag
The advertisement's Prefix Information option carries the subnet prefix, two lifetimes and flags, and the autonomous flag is the gate: set, and the host may form an address by prefix identifier; clear, and it may not.
Go to SLAAC and DHCPv6: IPv6 address configuration →managed flag
Two flags in the advertisement — both set by whoever runs the router — arbitrate between autonomy and management: the managed flag directs hosts to DHCPv6 for addresses, and the other flag directs them to DHCPv6 for everything except the address (a resolver, a domain — "stateless DHCPv6", a two-message Information-request/Reply).
Go to SLAAC and DHCPv6: IPv6 address configuration →other flag
Two flags in the advertisement — both set by whoever runs the router — arbitrate between autonomy and management: the managed flag directs hosts to DHCPv6 for addresses, and the other flag directs them to DHCPv6 for everything except the address (a resolver, a domain — "stateless DHCPv6", a two-message Information-request/Reply).
Go to SLAAC and DHCPv6: IPv6 address configuration →DUID
The identifiers differ: a client is a DUID, a persistent identity rather than a hardware address, and each requested block of addresses is an identity-association — IA_NA for normal addresses, IA_TA for temporary ones — keyed by a client-chosen IAID, so a binding is the triple DUID, IA type, IAID.
Go to SLAAC and DHCPv6: IPv6 address configuration →prefix delegation
One role has no IPv4 counterpart: prefix delegation.
Go to SLAAC and DHCPv6: IPv6 address configuration →basic NAT
The weaker mechanism is basic NAT: dynamic one-for-one swaps between private addresses and a pool of registered ones.
Go to NAT: many hosts behind one address →NAPT
NAPT (network address and port translation) widens the translation key from the address to the address-port tuple: now many internal hosts share a single external address because their sessions are distinguished by port, and the multiplexing gain is the entire point.
Go to NAT: many hosts behind one address →application layer gateway
Protocols like FTP carry IP addresses inside their data, which the NAT cannot see from headers alone; the fix is an application layer gateway — a per-protocol parser inside the NAT that edits payloads on the fly.
Go to NAT: many hosts behind one address →hole punching
The repair is coordination: both peers meet on a public rendezvous server, learn the public mappings their NATs happened to grant them, and fire simultaneous outbound packets so each NAT's filter opens for the other — hole punching.
Go to NAT traversal: STUN, TURN and ICE →symmetric NAT
The mapping behaviour may be endpoint-independent — the NAT reuses the same public port for every destination reached from one private endpoint — or endpoint-dependent (a symmetric NAT), where each new destination earns a fresh public port.
Go to NAT traversal: STUN, TURN and ICE →STUN
A host cannot read its own mapping — the NAT owns the public side — so STUN (Session Traversal Utilities for NAT, RFC 8489) puts the measurement where it can be seen: on a public server.
Go to NAT traversal: STUN, TURN and ICE →reflexive transport address
That echoed address — the reflexive transport address — is the outermost NAT's public mapping for this client, exactly what a remote peer must target.
Go to NAT traversal: STUN, TURN and ICE →TURN
TURN (Traversal Using Relays around NAT, RFC 8656) makes the fallback explicit: the client sends an Allocate request to a TURN server (which challenges it once with a 401 and then authenticates it under STUN's long-term credential mechanism) and receives a relayed transport address — a port on the server that the client can hand to a peer.
Go to NAT traversal: STUN, TURN and ICE →relayed transport address
TURN (Traversal Using Relays around NAT, RFC 8656) makes the fallback explicit: the client sends an Allocate request to a TURN server (which challenges it once with a 401 and then authenticates it under STUN's long-term credential mechanism) and receives a relayed transport address — a port on the server that the client can hand to a peer.
Go to NAT traversal: STUN, TURN and ICE →ICE
ICE (Interactive Connectivity Establishment, RFC 8445) is the algorithm that assembles the pieces into a search.
Go to NAT traversal: STUN, TURN and ICE →dual stack
Three mechanisms carry the transition: dual stack (run both protocols and prefer IPv6, racing the families so a broken IPv6 path does not stall the user), tunnelling (carry IPv6 packets over IPv4-only paths), and translation (NAT64 with DNS64, letting IPv6-only networks reach IPv4-only servers).
Go to IPv6 transition: dual stack, tunnels and NAT64 →tunnelling
Three mechanisms carry the transition: dual stack (run both protocols and prefer IPv6, racing the families so a broken IPv6 path does not stall the user), tunnelling (carry IPv6 packets over IPv4-only paths), and translation (NAT64 with DNS64, letting IPv6-only networks reach IPv4-only servers).
Go to IPv6 transition: dual stack, tunnels and NAT64 →translation
Three mechanisms carry the transition: dual stack (run both protocols and prefer IPv6, racing the families so a broken IPv6 path does not stall the user), tunnelling (carry IPv6 packets over IPv4-only paths), and translation (NAT64 with DNS64, letting IPv6-only networks reach IPv4-only servers).
Go to IPv6 transition: dual stack, tunnels and NAT64 →DNS64
DNS64 (RFC 6147) lives in the client's recursive resolver: when a AAAA query gets a negative answer, it takes the domain's A record and synthesises a AAAA by concatenating the Well-Known Prefix (RFC 6052) with the 32-bit IPv4 address — becomes .
Go to IPv6 transition: dual stack, tunnels and NAT64 →NAT64
NAT64 (RFC 6146) is the stateful translator that makes the route real: traffic addressed into is routed to it, and on the first packet it installs a binding entry pairing the v6 transport address with a v4 transport address drawn from its own pool — after which packets translate in both directions exactly as in NAT.
Go to IPv6 transition: dual stack, tunnels and NAT64 →Header field
An HTTP/1.1 message is a sequence of octets laid out as a start-line, a section of header fields, an empty line, and the message content (body).
Go to HTTP semantics: methods, status codes and headers →Safe method
A method is safe when its semantics are read-only: the client requests no state change on the origin server, so spiders and prefetchers may issue it freely.
Go to HTTP semantics: methods, status codes and headers →Idempotent method
A method is idempotent when repeating it has the same intended effect as issuing it once, so a client that never read the response — the connection dropped mid-flight — may retry automatically without risking a doubled action.
Go to HTTP semantics: methods, status codes and headers →Content negotiation
They also carry content negotiation: one resource may exist as several representations — formats, languages, encodings — and in proactive negotiation the client advertises preferences in Accept, Accept-Charset, Accept-Encoding and Accept-Language (with q= quality weights) and the server picks the best match, declaring in Vary which request fields shaped the choice so caches do not serve the wrong variant.
Go to HTTP semantics: methods, status codes and headers →head-of-line blocking
First, responses must return in the same order the requests arrived, so one slow response stalls every faster one behind it: head-of-line blocking, the same failure mode as a single lane of traffic behind a stalled car, now applied to responses.
Go to HTTP connection management: persistence, pipelining and head-of-line blocking →private cache
A private cache serves one user — the browser's own store — and may keep nearly anything.
Go to HTTP caching: freshness and validation →shared cache
A shared cache serves many users — a forward proxy or CDN edge — so it must refuse what was personal: a response marked private, and any response to a request carrying Authorization unless it also says public, must-revalidate or s-maxage. no-store bars storage outright everywhere.
Go to HTTP caching: freshness and validation →cache key
The cache key that locates the entry is at minimum the request method and target URI — and since most caches store only GET responses, in practice just the URI, widened by whatever content negotiation selected (see Vary below).
Go to HTTP caching: freshness and validation →fresh
A stored response is fresh while its age has not exceeded its freshness lifetime, and a fresh response answers the request with zero network.
Go to HTTP caching: freshness and validation →freshness lifetime
A stored response is fresh while its age has not exceeded its freshness lifetime, and a fresh response answers the request with zero network.
Go to HTTP caching: freshness and validation →Frame
HTTP/2 removes the choice: it keeps HTTP's semantics but re-encodes the exchange as binary frames, each tagged with a stream identifier, so many messages interleave on a single TCP connection.
Go to HTTP/2: binary frames and multiplexed streams →Stream
HTTP/2 removes the choice: it keeps HTTP's semantics but re-encodes the exchange as binary frames, each tagged with a stream identifier, so many messages interleave on a single TCP connection.
Go to HTTP/2: binary frames and multiplexed streams →stream identifier
Every unit of HTTP/2 communication is a frame, and every frame starts with the same fixed 9-octet header: a 24-bit payload length, an 8-bit type, 8 bits of type-specific flags, a reserved bit, and a 31-bit stream identifier.
Go to HTTP/2: binary frames and multiplexed streams →static table
The static table is Appendix A of RFC 7541: entries of the fields every connection uses — index is :authority, and are :method: GET and POST, and are :path: / and /index.html, and are :scheme: http and https, and name-only entries continue through cache-control at , cookie at , user-agent at and www-authenticate at .
Go to HPACK: compressing headers without leaking secrets →dynamic table
The dynamic table is a per-connection FIFO of the fields this connection has actually sent: encoder and decoder each keep a copy, and every "literal with incremental indexing" appends its field to both copies, so each side watches the same list grow in the same order.
Go to HPACK: compressing headers without leaking secrets →Dolev–Yao
The classical statement is the attacker the literature calls Dolev–Yao — the network itself is hostile, so the adversary may read, drop, modify, replay and inject messages, five verbs that cover everything a relay can do.
Go to The network threat model: what an attacker on the path can do →trusted computing base
The design term is the trusted computing base (TCB): the set of components whose failure defeats the whole system, which you want as small as possible.
Go to The network threat model: what an attacker on the path can do →man-in-the-middle
The strongest form sits between the parties and exercises every verb in both directions: the man-in-the-middle intercepts each message and relays just enough to keep both ends talking — normally — through itself.
Go to The network threat model: what an attacker on the path can do →passive
A passive adversary only reads — the eavesdropper of the encryption games ahead — and threatens confidentiality alone.
Go to The network threat model: what an attacker on the path can do →active
An active adversary exercises all five verbs.
Go to The network threat model: what an attacker on the path can do →on-path
An on-path attacker sits between the endpoints and can exercise every verb in both directions — the man-in-the-middle.
Go to The network threat model: what an attacker on the path can do →off-path
An off-path attacker can inject but cannot read: it is blind, forced to guess the values a receiver checks — a TCP sequence number that must fall inside the receive window, say — without ever learning whether the guess landed.
Go to The network threat model: what an attacker on the path can do →Confidentiality
Confidentiality: reading traffic yields nothing about content.
Go to The network threat model: what an attacker on the path can do →Integrity
Integrity: any modification, reorder or replay is detected on receipt — the delivered message is the one sent, or there is no delivery.
Go to The network threat model: what an attacker on the path can do →Authentication
Authentication: the receiver learns who sent the message, and across a handshake, who it is talking to.
Go to The network threat model: what an attacker on the path can do →Forward secrecy
Forward secrecy: compromise of a long-term key tomorrow must not unlock ciphertexts recorded today.
Go to The network threat model: what an attacker on the path can do →block cipher
Real systems compress: a block cipher is a keyed permutation on fixed-size blocks — AES-128 permutes 128-bit blocks under a 128-bit key in 10 rounds — and a mode stretches one key over many blocks.
Go to Symmetric encryption: block ciphers, modes and nonces →cipher
A cipher is a pair over a key space , message space and ciphertext space , correct when always.
Go to Symmetric encryption: block ciphers, modes and nonces →one-time pad
The one-time pad sets all three spaces to -bit strings and computes ; decryption is the same operation, since XOR is its own inverse: .
Go to Symmetric encryption: block ciphers, modes and nonces →negligible
An advantage that is negligible — smaller than any inverse polynomial, on the order of — means ciphertexts might as well be coin flips.
Go to Symmetric encryption: block ciphers, modes and nonces →pseudorandom permutation
The security bar rhymes with the last section's: a pseudorandom permutation must be indistinguishable, to an efficient observer, from a permutation drawn uniformly from all of them — a space of about permutations for 128-bit blocks, addressed by keys only strong.
Go to Symmetric encryption: block ciphers, modes and nonces →electronic codebook
The obvious mode is wrong: electronic codebook (ECB) encrypts each block independently, .
Go to Symmetric encryption: block ciphers, modes and nonces →Counter mode
Counter mode encrypts nothing but successive counter values: pick a starting value , and XOR the -th plaintext block with , where is the block space.
Go to Symmetric encryption: block ciphers, modes and nonces →stream cipher
A block cipher evaluated only on inputs it has never seen behaves like a fresh pseudorandom stream, which is precisely a stream cipher: a short key expanded into a long pad.
Go to Symmetric encryption: block ciphers, modes and nonces →two-time pad
The result is devastating enough to have a name: the two-time pad.
Go to Symmetric encryption: block ciphers, modes and nonces →cryptographic hash function
A cryptographic hash function needs three different strengths — preimage, second-preimage and collision resistance — and the weakest-looking one prices the output: finding some colliding pair costs about work, not , by the same pair-counting that runs the birthday effect.
Go to Cryptographic hash functions: fingerprints an attacker cannot forge →preimage resistance
Security is stated as three games in the style of the last lesson, each priced by the best generic attack (one that treats as a random oracle — the strongest an ideal function can offer): propertythe adversary is givenmust producegeneric cost preimage resistancea digest any with evaluations second-preimage resistancea message …
Go to Cryptographic hash functions: fingerprints an attacker cannot forge →second-preimage resistance
Security is stated as three games in the style of the last lesson, each priced by the best generic attack (one that treats as a random oracle — the strongest an ideal function can offer): propertythe adversary is givenmust producegeneric cost preimage resistancea digest any with evaluations second-preimage resistancea message …
Go to Cryptographic hash functions: fingerprints an attacker cannot forge →collision resistance
Security is stated as three games in the style of the last lesson, each priced by the best generic attack (one that treats as a random oracle — the strongest an ideal function can offer): propertythe adversary is givenmust producegeneric cost preimage resistancea digest any with evaluations second-preimage resistancea message …
Go to Cryptographic hash functions: fingerprints an attacker cannot forge →compression function
A collision-resistant function on a fixed input size — the compression function — becomes a hash on arbitrary strings by iteration: pad the message to a block multiple (the padding carries an encoding of the message length — "Merkle–Damgård strengthening"), split it into blocks , iterate from a fixed public IV, and out…
Go to Cryptographic hash functions: fingerprints an attacker cannot forge →Davies–Meyer
SHA-256's compression function is a block cipher in the Davies–Meyer arrangement: — the 512-bit message block keys a cipher evaluated on the chaining value, then the input is added back wordwise modulo as feed-forward.
Go to Cryptographic hash functions: fingerprints an attacker cannot forge →message authentication code
The construction is a message authentication code (MAC): a pair of efficient algorithms over a key space, a message space and a tag space.
Go to MACs: integrity with a shared key →authenticated encryption with associated data
The interface is authenticated encryption with associated data, and its correctness condition is just decrypt.
Go to Authenticated encryption: AEAD →discrete logarithm assumption
When that recovery is computationally infeasible, the group satisfies the discrete logarithm assumption.
Go to Diffie–Hellman: agreeing on a key in public →computational Diffie–Hellman assumption
The stronger demand — that cannot be computed from alone — is the computational Diffie–Hellman assumption.
Go to Diffie–Hellman: agreeing on a key in public →digital signature scheme
A digital signature scheme is a triple of algorithms: key generation producing a public key and secret key ; signing producing a signature ; and verification answering accept or reject.
Go to Digital signatures: authentication anyone can verify →Existential unforgeability
Security is existential unforgeability under a chosen-message attack: an adversary who sees and may ask for signatures on messages of its choice still cannot produce a valid pair for any new .
Go to Digital signatures: authentication anyone can verify →certificate
A certificate is a digitally signed statement that a given public key belongs to a given identity — useful only because the signer's key is already known.
Go to Certificates and chains: binding a key to a name →Certification authority
A certification authority (CA) is an entity trusted to make exactly those statements: it verifies a keyholder's control of a name, then signs the pair.
Go to Certificates and chains: binding a key to a name →TBSCertificate
The deployed format is X.509 v3: the signed payload is the to-be-signed certificate (TBSCertificate), DER-encoded, followed by the signature algorithm identifier and the signature bits themselves.
Go to Certificates and chains: binding a key to a name →Trust anchor
The answer is a hierarchy: a small set of trust anchors (root CAs) ship inside the browser or OS trust store, each root signs certificates for intermediate CAs, and intermediates sign the end-entity certificates servers present.
Go to Certificates and chains: binding a key to a name →Domain validation
Before signing, the CA must be convinced the requester actually controls the names to be certified — the domain-validated (DV) check that anchors the certificate in the DNS hierarchy the lesson of that name already defines.
Go to Certificates and chains: binding a key to a name →Certificate revocation list
Revocation exists because the window is too long to wait out: the CA publishes a certificate revocation list (CRL), a signed, timestamped list of serial numbers of its revoked certificates, regenerated on a fixed period and distributed over ordinary untrusted channels — the signature makes the list itself unforgeable.
Go to PKI's weak links: revocation and Certificate Transparency →CT log
Certificate Transparency (RFC 9162) makes issuance itself observable: CAs and third parties submit every certificate chain to public logs, append-only structures anyone may read; the log returns a Signed Certificate Timestamp (SCT), a signed promise that the entry is (or will be) in the log.
Go to PKI's weak links: revocation and Certificate Transparency →Signed Certificate Timestamp
Certificate Transparency (RFC 9162) makes issuance itself observable: CAs and third parties submit every certificate chain to public logs, append-only structures anyone may read; the log returns a Signed Certificate Timestamp (SCT), a signed promise that the entry is (or will be) in the log.
Go to PKI's weak links: revocation and Certificate Transparency →TLSInnerPlaintext
What gets encrypted is not the bare fragment but a TLSInnerPlaintext: the content bytes, then the real content-type byte, then an arbitrary run of zero padding.
Go to The TLS record protocol: protecting a byte stream →64-bit sequence number
TLS derives each record's nonce so uniqueness is arithmetic, not probabilistic: each direction keeps a 64-bit sequence number that increments per record and resets to zero whenever the key changes.
Go to The TLS record protocol: protecting a byte stream →resumption master secret
The key schedule ends the handshake with a resumption master secret derived from the transcript of the first connection — separate from the traffic keys, so offering it later does not reuse application keys.
Go to TLS resumption and 0-RTT: faster, but replayable →PSK binder
To resume, the client puts the ticket in a pre_shared_key extension on its ClientHello and appends a PSK binder — an HMAC over the truncated ClientHello computed with a key derived from the PSK, binding this handshake to the claimed secret and chaining the PSK back to the connection that issued it.
Go to TLS resumption and 0-RTT: faster, but replayable →0-RTT
A client holding a ticket can go further than proving identity cheaply: it can send application data in its first flight, encrypted under a client_early_traffic_secret derived from the PSK — the 0-RTT or early data path.
Go to TLS resumption and 0-RTT: faster, but replayable →server_name
RFC 6066's server_name extension puts the answer in the ClientHello: a ServerNameList holding one host_name — the fully qualified DNS hostname as an ASCII byte string, internationalized names encoded as A-labels, literal IP addresses excluded — and at most one name per type.
Go to HTTPS: SNI, ALPN and hostname validation →ALPN
ALPN (RFC 7301) moves the decision inside it.
Go to HTTPS: SNI, ALPN and hostname validation →reference identity
The check (§4.3.4) builds a reference identity from the URI's host — a DNS-ID for a name, an IP-ID compared against the certificate's subjectAltName iPAddress entries for a literal — and matches it against the certificate per RFC 6125's procedure; the old fallback to the certificate's Common Name, CN-ID, is forbidden.
Go to HTTPS: SNI, ALPN and hostname validation →ossified
Any field a middlebox can read becomes a contract it may enforce — the transport layer ossified.
Go to Transport ossification: why TCP cannot change →TCP option
TCP's intended extension point is the TCP option: typed slots in the header that a receiver ignores if it does not recognise them.
Go to Transport ossification: why TCP cannot change →TCPExposure
Honda, Nishida, Raiciu, Greenhalgh, Handley and Tokuda answered this empirically in 2011 with TCPExposure, a pair of probing tools run by volunteers: initiators in access networks across countries (home, hotspot, cellular, university, enterprise, hosting) drove crafted traffic at a responder on a deliberately middlebox-free network, echoing received headers back so the client could see exactly what …
Go to Transport ossification: why TCP cannot change →GREASE
Second, greasing: reserve code points that are guaranteed meaningless, then offer them at random so the ecosystem is continuously exposed to unknown values — GREASE began in TLS and was adopted by QUIC, on the principle that a mechanism exercised often is discovered broken while it is still cheap to fix.
Go to Transport ossification: why TCP cannot change →QUIC stream
HTTP/2 multiplexed many streams onto one connection — and inherited a failure it could not fix: a single lost TCP segment withholds every stream's bytes behind it.
Go to QUIC packets and streams: a transport in user space →QUIC packet
The result is that a QUIC packet is the encrypted unit on the wire, and a frame is a typed instruction inside it.
Go to QUIC packets and streams: a transport in user space →QUIC frame
The result is that a QUIC packet is the encrypted unit on the wire, and a frame is a typed instruction inside it.
Go to QUIC packets and streams: a transport in user space →packet number space
Packet numbers are scoped to a packet number space: three spaces exist (Initial, Handshake, and Application data, the last shared by 0-RTT and 1-RTT packets), numbers run to , are never reused within a space, and are encoded in one to four bytes.
Go to QUIC packets and streams: a transport in user space →connection ID
QUIC instead labels packets with a connection ID — the deployments described in the SIGCOMM paper use 64-bit IDs — chosen by each endpoint for its peer to use, so an unchanged ID can route a connection whose addresses changed underneath it.
Go to QUIC packets and streams: a transport in user space →CRYPTO frame
QUIC provides the record layer TLS no longer needs to carry itself: the handshake bytes travel in CRYPTO frames, which are reliable, ordered, and fragmentable like stream data — but they appear only in Initial and Handshake packets, never in 0-RTT or 1-RTT packets.
Go to The QUIC handshake: TLS 1.3 inside the transport →encryption level
Because keys appear progressively, QUIC packets are protected at four encryption levels, each with its own key set and mapped onto the three packet number spaces:
Go to The QUIC handshake: TLS 1.3 inside the transport →anti-amplification limit
The first is the anti-amplification limit: before the client's address is validated, the server must not send more than three times the bytes it has received — amplification is bounded, not eliminated.
Go to The QUIC handshake: TLS 1.3 inside the transport →validated
The first is the anti-amplification limit: before the client's address is validated, the server must not send more than three times the bytes it has received — amplification is bounded, not eliminated.
Go to The QUIC handshake: TLS 1.3 inside the transport →Retry packet
The second part is a Retry: rather than doing handshake work for an unvalidated address, the server sends a tiny Retry carrying a token — a proof-of-reachability ticket — and a fresh server-chosen connection ID.
Go to The QUIC handshake: TLS 1.3 inside the transport →packet numbers
QUIC's answer is structural: packet numbers count transmissions — they increase by at least one per send and are never reused — while stream offsets count bytes for delivery.
Go to QUIC loss recovery: packet numbers that never repeat →probe timeout
From that one move the whole recovery apparatus simplifies: every RTT sample is usable, ACKs carry arbitrary range lists that cannot be reneged, loss is declared by a packet threshold of or a time threshold of of the RTT, and a single probe timeout replaces both RTO and tail-loss probe — all of it feeding a congestion controller that lives in user space and can be swapped wholesale.
Go to QUIC loss recovery: packet numbers that never repeat →ack-eliciting
On the sending side the contract is: Initial and Handshake packets are acknowledged immediately; application packets trigger an ACK after every second ack-eliciting packet — and immediately when one arrives out of order — under a declared max_ack_delay ceiling, default ms, which plays the role the delayed-ACK timer played in TCP but is now a negotiated quantity the sender knows rather than guesses.
Go to QUIC loss recovery: packet numbers that never repeat →persistent congestion
First, the collapse trigger is persistent congestion: when two ack-eliciting packets spanning more than the PTO duration are both declared lost with nothing between them acknowledged — and an RTT sample already existed — the window drops to , roughly TCP's collapse after two failed tail-loss probes.
Go to QUIC loss recovery: packet numbers that never repeat →connection IDs
QUIC decouples connection identity from the addresses beneath it: endpoints agree on connection IDs — opaque labels chosen by each peer and carried in every packet — and the connection survives any change of address as long as the packets keep presenting a valid ID.
Go to QUIC connection migration: surviving an address change →Base
Encoded field sections on the request streams never mutate the table at all — they only reference it, by absolute index for entries older than a declared Base and by post-Base index for entries inserted while the section was being encoded.
Go to HTTP/3 and QPACK: HTTP semantics on QUIC streams →post-Base index
Encoded field sections on the request streams never mutate the table at all — they only reference it, by absolute index for entries older than a declared Base and by post-Base index for entries inserted while the section was being encoded.
Go to HTTP/3 and QPACK: HTTP semantics on QUIC streams →Known Received Count
The feedback is what makes references safe: the encoder's Known Received Count — the number of inserts the decoder has acknowledged — tells it which entries may be referenced without any risk of blocking, and an entry becomes evictable only when acknowledged and no outstanding field section still references it.
Go to HTTP/3 and QPACK: HTTP semantics on QUIC streams →request routing
The missing piece is request routing: steering the request to a good edge.
Go to CDN request routing: DNS redirection and anycast →adaptive bitrate
The answer derived below is the adaptive bitrate (ABR) ladder — a manifest of variant encodings, a playback buffer measured in seconds of video, and a rule for picking the next segment's rate.
Go to Adaptive bitrate streaming: choosing quality from the buffer →Variant Streams
Apple's HLS (RFC 8216) defines a Media Playlist per encoding — an ordered list of Media Segments with their durations and a target duration bounding the whole — and a Master Playlist listing the Variant Streams: one EXT-X-STREAM-INF entry per rung carrying its URI and a required BANDWIDTH attribute giving the encoding's peak segment bit rate, which is exactly what the client needs to budget a download.
Go to Adaptive bitrate streaming: choosing quality from the buffer →rate map
A rate map assigns a bitrate to each buffer level over , pinned at the ends — , — continuous and increasing.
Go to Adaptive bitrate streaming: choosing quality from the buffer →radio access network
The radio access network (RAN) is a fleet of base stations — NodeB, then eNB, then gNB across generations — each owning the jobs the air makes hard: encoding and link-layer framing, scheduling every attached handset onto shared spectrum, retransmission and forward error correction, interference coordination between cells, a broadcast control channel so a powered-on phone can find a tower, and the wired backhaul th…
Go to Cellular networks: radio access, core and bearers →mobile core
The mobile core owns everything the air does not: identity, session setup, policy and accounting.
Go to Cellular networks: radio access, core and bearers →control plane and user plane separation
Inside the core the jobs divide once more, and the division is the architecture's deepest idea: control plane and user plane separation (CUPS).
Go to Cellular networks: radio access, core and bearers →network functions
In the 5G core the planes are decomposed into named network functions, each an IP-reachable service.
Go to Cellular networks: radio access, core and bearers →AMF
The AMF (Access and Mobility Management Function) terminates the RAN's control connection — the N2 interface — and the handset's own NAS channel on N1: it runs registration, connection and reachability management, ciphers and integrity-protects the signalling channel, and carries session-management messages for the SMF (TS 23.501 §6.2.1).
Go to Cellular networks: radio access, core and bearers →SMF
The AMF (Access and Mobility Management Function) terminates the RAN's control connection — the N2 interface — and the handset's own NAS channel on N1: it runs registration, connection and reachability management, ciphers and integrity-protects the signalling channel, and carries session-management messages for the SMF (TS 23.501 §6.2.1).
Go to Cellular networks: radio access, core and bearers →UPF
The UPF (User Plane Function) is the data path itself: the point where the session interconnects with the external data network, the mobility anchor, the QoS and rate enforcer, the usage reporter that feeds billing, and the buffer that holds downlink packets for an idle phone while paging it awake (§6.2.3).
Go to Cellular networks: radio access, core and bearers →IMSI
The SIM carries the proof: an IMSI — at most fifteen decimal digits holding the country code, carrier code and subscriber identity — plus a secret key the carrier provisioned and the network can challenge.
Go to Cellular networks: radio access, core and bearers →data radio bearer
On the air it rides a data radio bearer; in the wired RAN and core it rides a tunnel; the pair is what the standards call a bearer (an EPS bearer in 4G, PDU session with QoS flows in 5G).
Go to Cellular networks: radio access, core and bearers →PDU session
On the air it rides a data radio bearer; in the wired RAN and core it rides a tunnel; the pair is what the standards call a bearer (an EPS bearer in 4G, PDU session with QoS flows in 5G).
Go to Cellular networks: radio access, core and bearers →QoS flow
On the air it rides a data radio bearer; in the wired RAN and core it rides a tunnel; the pair is what the standards call a bearer (an EPS bearer in 4G, PDU session with QoS flows in 5G).
Go to Cellular networks: radio access, core and bearers →5QI
Within the session, a QoS flow is the finest unit of differentiated treatment; each flow's forwarding tag, the QFI, rides inside the encapsulation header on N3 without touching the user's packet header (§5.7.1.1), and its promised treatment is referenced by a scalar 5QI naming a standardized profile of scheduling weights, priorities and budgets (§5.7.2.1).
Go to Cellular networks: radio access, core and bearers →GTP-U tunnel
Between base station and UPF — the N3 interface — every flow's packets are wrapped in a GTP-U tunnel over UDP/IP: the phone's real packet becomes the payload of an outer IP datagram addressed to the UPF, the encapsulation trick applied to mobility itself.
Go to Cellular networks: radio access, core and bearers →TEID
A 32-bit TEID (tunnel endpoint identifier) in the GTP header names the session endpoint, and it is the receiving end that assigns it — the UPF allocates its side's TEID when the SMF requests it over N4 and hands the value back as the session's CN Tunnel Info: a TEID plus a UPF IP address (§5.8.2.3).
Go to Cellular networks: radio access, core and bearers →PDU session anchor
The anchor is the PDU session anchor: the packet's home address is stable because the anchor never moves, and mobility reduces to updating one tunnel endpoint.
Go to Cellular networks: radio access, core and bearers →mobile node
Move the mobile node to a new point of attachment and both readings fail at once — packets routed to the old address land where the host no longer is, and a fresh address from the new network matches no connection's state.
Go to Mobility: keeping a connection when the attachment point moves →home address
The home address is permanent, allocated from the home network's prefix; the care-of address names where the node currently is.
Go to Mobility: keeping a connection when the attachment point moves →care-of address
The home address is permanent, allocated from the home network's prefix; the care-of address names where the node currently is.
Go to Mobility: keeping a connection when the attachment point moves →home agent
A home agent on the home network intercepts traffic addressed to the home address — answering ARP for it by proxy and announcing itself gratuitously — and tunnels each datagram to the care-of address, by default wrapped in a second IPv4 header (the minimal and GRE encodings are negotiable).
Go to Mobility: keeping a connection when the attachment point moves →foreign agent
At the far end a foreign agent strips the envelope and delivers the inner packet on the visited link.
Go to Mobility: keeping a connection when the attachment point moves →triangle routing
Traffic for the mobile node detours through the home agent even when the direct route is short — triangle routing: two sides of a triangle, correspondent-to-home and home-to-mobile, stand in for the third.
Go to Mobility: keeping a connection when the attachment point moves →handover
A handover between base stations is choreographed so that the user plane never sees a hole.
Go to Mobility: keeping a connection when the attachment point moves →end marker
An end marker — a dedicated GTP-U message, not data — is sent down the old tunnel behind the last user packet and forwarded with the buffered tail, telling the target the moment the old path is empty.
Go to Mobility: keeping a connection when the attachment point moves →BCP 38
RFC 2827 (which became BCP 38) puts the check there — ingress filtering on the link where a customer's traffic first enters the provider's aggregation router, accepting only packets whose source falls inside the prefixes that customer legitimately advertises:
Go to IP spoofing and ingress filtering →ingress filtering
RFC 2827 (which became BCP 38) puts the check there — ingress filtering on the link where a customer's traffic first enters the provider's aggregation router, accepting only packets whose source falls inside the prefixes that customer legitimately advertises:
Go to IP spoofing and ingress filtering →unicast reverse-path forwarding
RFC 3704's unicast reverse-path forwarding (uRPF) derives the same check from the routing state the router already maintains — for each arriving packet, look up the source in the forwarding table and ask whether the answer is consistent with where the packet came in:
Go to IP spoofing and ingress filtering →route leak
RFC 7908's working definition: a route leak is the "propagation of routing announcement(s) beyond their intended scope" — an announcement that violates the policies of the receiver, the sender, or an AS along the path.
Go to BGP hijacks and route leaks →resource certificates
The same chain that handed out the numbers — IANA to the five regional registries to local registries and ISPs — now issues resource certificates binding each holder's public key to its exact address blocks and AS numbers, and those holders sign Route Origin Authorizations (ROAs) naming which AS may originate which prefixes.
Go to RPKI: validating route origins →Route Origin Authorizations
The same chain that handed out the numbers — IANA to the five regional registries to local registries and ISPs — now issues resource certificates binding each holder's public key to its exact address blocks and AS numbers, and those holders sign Route Origin Authorizations (ROAs) naming which AS may originate which prefixes.
Go to RPKI: validating route origins →Validated ROA Payloads
A relying party — software run by whoever operates the routers — walks the repository, verifies every certificate chain and ROA signature, and emits a cleaned table of Validated ROA Payloads: VRPs of the form (prefix, prefix length, maximum length, origin AS).
Go to RPKI: validating route origins →SYN flood
A SYN flood is a stream of SYN segments whose claimed sources will never complete the handshake — typically spoofed addresses chosen to be unresponsive, because a live host that receives a stray SYN,ACK would answer with a reset and free the slot.
Go to SYN floods and SYN cookies →challenge ACK
For resets, RFC 5961 replaces "anywhere in the window" with "exactly ": an RST matching the next expected byte still tears the connection down (a real peer's reset deserves honouring), while an in-window-but-inexact RST earns a challenge ACK — an ordinary acknowledgment — and the forged segment is dr…
Go to Off-path TCP injection: resets and data in someone else's connection →reflection attack
A reflection attack is a redirection, not a volume of the attacker's own making.
Go to Reflection and amplification attacks →amplifier
The attacker emits small requests whose IP source address is forged to the victim's — possible wherever ingress filtering is absent — and each contacted server, called an amplifier or reflector, dutifully answers the address on the packet: the victim.
Go to Reflection and amplification attacks →bandwidth amplification factor
The metric is the bandwidth amplification factor (BAF): UDP payload bytes the amplifier sends to the victim, divided by payload bytes of the request.
Go to Reflection and amplification attacks →scrubbing
Where the victim cannot be replicated, the same idea works by detour: the victim (or its DDoS-mitigation provider) announces the prefix, attack traffic routes to upstream scrubbing capacity — sites built to classify and discard at scale — and the surviving legitimate traffic tunnels back to the victim.
Go to DDoS mitigation: absorb, filter and rate-limit →BLACKHOLE community
RFC 7999's BLACKHOLE community ( — the low two octets read , the operators' long-standing convention) is a well-known transitive BGP community telling a neighbouring AS to discard everything destined for the tagged prefix.
Go to DDoS mitigation: absorb, filter and rate-limit →Remote Triggered Blackhole
This is remote-triggered blackholing (RTBH): the victim sacrifices its own reachability to keep the link — and every other customer behind it — alive.
Go to DDoS mitigation: absorb, filter and rate-limit →firewall
A firewall sits at a site's only connectivity to the outside and enforces policy on each packet: the stateless kind matches each one against an ordered list of rules on its own, and the stateful kind also asks whether the packet belongs to a connection the firewall has already admitted.
Go to Firewalls: packet filters and connection tracking →stateless firewall
A stateless firewall is a table of rules evaluated in order, each rule a pattern over header fields — typically the four-tuple of source and destination addresses and ports, plus protocol — with wildcards for "any": (* , * , 128.7.6.5 , 80) matches every packet addressed to port on one host, whoever sent it.
Go to Firewalls: packet filters and connection tracking →default deny
The clean policy is default deny: the final rule discards everything, so only traffic an administrator explicitly admitted passes.
Go to Firewalls: packet filters and connection tracking →DMZ
Nor is one wall enough to express trust: a common arrangement puts externally reachable services in a DMZ, a zone the inside and the outside can both reach but which cannot reach inside — a compromised mail server there still cannot touch the internal network.
Go to Firewalls: packet filters and connection tracking →VPN
Sites and remote workers need to converse across an untrusted Internet as though they shared one network, so the answer is a virtual private network: an encapsulated tunnel whose payloads are protected per packet with authenticated encryption.
Go to VPNs: IPsec and WireGuard →security association
Each protected session is a security association, identified on the wire by a 32-bit SPI in the ESP header; behind it sits a 32-bit sequence number counting packets from , and because that counter may never wrap on a live SA, the peers rekey before the nd packet — the optional extended sequence number widens the true counter to 64 bits while only the low 32 ride in the packet.
Go to VPNs: IPsec and WireGuard →SPI
Each protected session is a security association, identified on the wire by a 32-bit SPI in the ESP header; behind it sits a 32-bit sequence number counting packets from , and because that counter may never wrap on a live SA, the peers rekey before the nd packet — the optional extended sequence number widens the true counter to 64 bits while only the low 32 ride in the packet.
Go to VPNs: IPsec and WireGuard →extended sequence number
Each protected session is a security association, identified on the wire by a 32-bit SPI in the ESP header; behind it sits a 32-bit sequence number counting packets from , and because that counter may never wrap on a live SA, the peers rekey before the nd packet — the optional extended sequence number widens the true counter to 64 bits while only the low 32 ride in the packet.
Go to VPNs: IPsec and WireGuard →ICV
Integrity travels as an ICV computed over the SPI, sequence number and ciphertext; freshness is enforced at the receiver by an anti-replay window that tracks which counters have already appeared — a window of at least , with the preferred default.
Go to VPNs: IPsec and WireGuard →transport mode
ESP then offers two placements: transport mode, where the ESP header slots between the original IP header and its payload to protect traffic between two hosts, and tunnel mode, where the entire inner datagram — addresses and all — is encrypted inside a fresh outer IP header whose endpoints are the tunnel gateways, so the inner addresses stay invisible on the wire and the two versions need not even match.
Go to VPNs: IPsec and WireGuard →tunnel mode
ESP then offers two placements: transport mode, where the ESP header slots between the original IP header and its payload to protect traffic between two hosts, and tunnel mode, where the entire inner datagram — addresses and all — is encrypted inside a fresh outer IP header whose endpoints are the tunnel gateways, so the inner addresses stay invisible on the wire and the two versions need not even match.
Go to VPNs: IPsec and WireGuard →cryptokey routing table
Routing and identity fuse in the cryptokey routing table: a peer's allowed source addresses are bound one-to-one to its key, so a packet that decrypts under a peer's key may only claim that peer's addresses, and the table doubles as the lookup for outbound encapsulation.
Go to VPNs: IPsec and WireGuard →fat tree
The fix is to stop growing switches and multiply paths instead: connect identical commodity boxes into a folded-Clos fabric, whose canonical form is the fat tree.
Go to Clos fabrics: full bisection from commodity switches →oversubscription
Define oversubscription as the ratio of the worst-case achievable aggregate bandwidth among end hosts to the topology's total bisection bandwidth — the capacity of a minimal cut splitting the hosts in two.
Go to Clos fabrics: full bisection from commodity switches →bisection bandwidth
Define oversubscription as the ratio of the worst-case achievable aggregate bandwidth among end hosts to the topology's total bisection bandwidth — the capacity of a minimal cut splitting the hosts in two.
Go to Clos fabrics: full bisection from commodity switches →flowlet
Flowlets — bursts separated by idle gaps longer than the path-delay difference — allow safe rerouting without reordering; CONGA measures congestion on every path and reroutes flowlets onto the best one, while LetFlow shows that choosing paths at random per flowlet nearly matches it, because congested paths automatically shrink their flowlets.
Go to Fabric load balancing: flowlets and packet spraying →elephant flow
The load is carried by a handful of elephants, and elephants hashing independently onto paths collide constantly: the birthday-paradox arithmetic, not link capacity, sets the limit.
Go to Fabric load balancing: flowlets and packet spraying →flowlet timeout
The minimum safe silence is the flowlet timeout :
Go to Fabric load balancing: flowlets and packet spraying →CONGA
CONGA instruments the leaf switches: every packet's VXLAN header carries a congestion metric piggybacked on the leaf-to-leaf path it traverses, so each leaf accumulates a real-time congestion table for every path to every other leaf — a two-party feedback loop operating at the fabric's RTT, not at flow timescales.
Go to Fabric load balancing: flowlets and packet spraying →TSO
Segmentation offloads exploit exactly that redundancy: the stack walks one large buffer and the slicing into wire frames is pushed down — to the NIC (TSO), to a software pass just above the driver (GSO), or merged away on receive (GRO).
Go to Segmentation and receive offloads: TSO, GSO, GRO and checksum offload →GSO
Segmentation offloads exploit exactly that redundancy: the stack walks one large buffer and the slicing into wire frames is pushed down — to the NIC (TSO), to a software pass just above the driver (GSO), or merged away on receive (GRO).
Go to Segmentation and receive offloads: TSO, GSO, GRO and checksum offload →GRO
Segmentation offloads exploit exactly that redundancy: the stack walks one large buffer and the slicing into wire frames is pushed down — to the NIC (TSO), to a software pass just above the driver (GSO), or merged away on receive (GRO).
Go to Segmentation and receive offloads: TSO, GSO, GRO and checksum offload →TCP Segmentation Offload
TCP Segmentation Offload (TSO) removes the multiplication: TCP builds one oversized sk_buff — say all KiB of the write — marks it with a gso_size (the payload each wire segment must carry) and a GSO type naming the header shape, and hands it down once.
Go to Segmentation and receive offloads: TSO, GSO, GRO and checksum offload →Generic Segmentation Offload
Generic Segmentation Offload (GSO) is the same trick in software: the oversized packet travels the whole stack as one object and is segmented at the last moment — in the driver or in software when the NIC lacks TSO.
Go to Segmentation and receive offloads: TSO, GSO, GRO and checksum offload →Generic Receive Offload
Generic Receive Offload (GRO) runs the same argument backwards.
Go to Segmentation and receive offloads: TSO, GSO, GRO and checksum offload →XDP
XDP (eXpress Data Path) moves that verdict to the earliest hook the driver offers: an eBPF program that runs on the raw frame — before any sk_buff exists — and returns drop, pass, transmit, or redirect.
Go to XDP: programs at the driver's receive hook →AF_XDP
One CPU core then drops at Mpps, roughly the fastest in-stack drop path, and the same machinery feeds packets to user space through AF_XDP sockets without paying the stack at all.
Go to XDP: programs at the driver's receive hook →XSK
An XSK is created with an ordinary socket(AF_XDP) call, bound to a specific NIC and queue, and associated with an XSKMAP that an XDP program uses as a redirect target.
Go to XDP: programs at the driver's receive hook →UMEM
The socket does not move sk_buffs — it shares a UMEM, a registered memory region of fixed-size chunks, through four lock-free rings: RX (kernel deposits incoming frames), TX (user space queues frames to send), FILL (user space supplies the kernel free chunks to receive into), and COMPLETION (kernel returns sent chunks).
Go to XDP: programs at the driver's receive hook →P4
P4 removes that freeze: one language specifies the parser, the match–action tables and the deparser of a programmable pipeline, and a compiler maps the program onto the target's stages and memories.
Go to P4: programmable switch pipelines →Table Dependency Graph
Dependencies against stage order: from the control flow between tables the compiler builds a Table Dependency Graph — a DAG whose edges are "this action's result decides that table's match".
Go to P4: programmable switch pipelines →Overlay networking
Overlay networking resolves the mismatch by tunnelling: the tenant's whole Ethernet frame is carried as the payload of a UDP datagram between tunnel endpoints, so the fabric sees only ordinary IP traffic while tenants get isolated virtual LANs.
Go to Overlay networks: VXLAN and Geneve →VTEP
That is encapsulation pointed at a new target: the inner frame is Ethernet, the outer carrier is UDP/IP, and the tunnel endpoints — VXLAN Tunnel End Points, or VTEPs — live in the hypervisors (or switches) at the fabric's edge.
Go to Overlay networks: VXLAN and Geneve →VXLAN Network Identifier
The originating VTEP takes the VM's Ethernet frame — header, payload, everything except its frame check sequence — and wraps it in four layers: a VXLAN header carrying the VNI, then UDP, then IPv4, then a fresh outer Ethernet header for the next hop.
Go to Overlay networks: VXLAN and Geneve →Geneve
Geneve (RFC 8926) answers with a deliberately minimal base and a TLV extension surface.
Go to Overlay networks: VXLAN and Geneve →network namespace
The network half of that illusion is built from three pieces of plumbing: a network namespace gives the container a private copy of the stack (interfaces, routes, firewall, port space), a veth pair gives that stack a virtual cable back to the host, and a Linux bridge — an in-kernel layer-2 switch — wires many such cables together.
Go to Container networking: namespaces, veth pairs and bridges →veth pair
The network half of that illusion is built from three pieces of plumbing: a network namespace gives the container a private copy of the stack (interfaces, routes, firewall, port space), a veth pair gives that stack a virtual cable back to the host, and a Linux bridge — an in-kernel layer-2 switch — wires many such cables together.
Go to Container networking: namespaces, veth pairs and bridges →direct server return
A packet thread on the chosen Maglev hashes the flow's 5-tuple, looks the entry up, wraps the packet in GRE and sends it to a real backend; the backend holds the VIP on a loopback alias, so it can answer the client directly — direct server return — and the heavier response traffic never re-enters the balancer at all.
Go to Maglev: a software layer-4 load balancer →playout buffer
The receiver's answer is the jitter buffer (also called the playout buffer): instead of playing each packet on arrival, it holds packet until the playout point measured from when the sender generated it, so every packet emerges on the same schedule the sender kept.
Go to Jitter buffers: trading delay for smooth playout →playout point
The receiver's answer is the jitter buffer (also called the playout buffer): instead of playing each packet on arrival, it holds packet until the playout point measured from when the sender generated it, so every packet emerges on the same schedule the sender kept.
Go to Jitter buffers: trading delay for smooth playout →adaptive playout buffer
An adaptive playout buffer re-estimates the tail continuously and re-anchors , but it cannot shift the point mid-sentence: warping a stretch of speech is plainly audible.
Go to Jitter buffers: trading delay for smooth playout →talkspurt
The escape hatch is the talkspurt: speech arrives in bursts separated by silence, and Peterson and Davie observe that lengthening or shortening the silences between words is not perceptible, while warping the words themselves is.
Go to Jitter buffers: trading delay for smooth playout →RTCP
RTP flows one way; RTCP (RTP Control Protocol) flows the other way on the adjacent port, carrying periodic reports.
Go to RTP and RTCP: timing and feedback for media →Forward error correction
Forward error correction — the media-face of the erasure codes of forward-error-correction — sends redundant data in the same stream so a receiver reconstructs losses without asking.
Go to Media loss recovery: FEC, NACK and concealment →Packet loss concealment
Packet loss concealment replays the previous frame with a fade, interpolates across the gap, or — for video — freezes the last decoded frame or skips to the next keyframe; the damage is bounded by the codec rather than by the network.
Go to Media loss recovery: FEC, NACK and concealment →target bitrate
TCP's sender opens a window; a call's sender sets the encoder's target bitrate — the codec retunes quality to spend the allowance.
Go to Media congestion control: delay-based rate adaptation →inter-group delay variation
The inter-group delay variation is the difference of the two spacings:
Go to Media congestion control: delay-based rate adaptation →Kalman filter
Because is noise, one sample of cannot be trusted; the estimate is tracked with a one-dimensional Kalman filter.
Go to Media congestion control: delay-based rate adaptation →packet metric block
RFC 8888 supplies the wire format — a Transport-Layer Feedback message (RTCP packet type , FMT ) carrying one report block per SSRC: a -bit starting sequence number, a -bit report count, then one -bit packet metric block per sequence number — a received bit, the echoed -bit ECN mark, and a -bit arrival time offset in units of second before the report's -bi…
Go to Media congestion control: delay-based rate adaptation →packet sniffer
A packet sniffer — tcpdump on a terminal, Wireshark with its decoded fields — answers by running libpcap: the kernel takes a passive copy of every packet it sees, runs a compiled filter program over each one, and hands the survivors to user space through a bounded buffer.
Go to Packet capture: what tcpdump and Wireshark actually show →active measurement
What remains is active measurement: inject your own packets and read what the path does to them.
Go to Active path measurement: RTT, loss and capacity →Which mechanism do I reach for?
A decision the reader faces, the recommendation, and the topic that derives the trade-off. Entries appear as their lessons are written.
Reserve circuits or switch packets?
Reserve when a conversation needs a hard guarantee; switch packets when users are bursty and rare overload beats certain blocking.
More detail
Problem: more demand than dedicated capacity. Guarantee: circuits isolate perfectly; packets serve ~3.5× the users here at 0.04% overload. Cost: circuits waste idle slices and block newcomers; packets queue and occasionally drop. Failure case: correlated demand (stadiums, outages) breaks the independence the tail assumes.
Which delay dominates this hop?
Compute all three tolls; upgrade only the largest — usually propagation everywhere beyond the room.
More detail
Problem: slowness with several candidate causes. Preconditions: packet size, rate, distance and per-box processing known. Guarantee: transmission falls with R, propagation never moves, processing is per-box. Cost: misdiagnosis buys upgrades that change the total by a rounding error (a 10× rate upgrade saving 0.03% on a continental hop). Failure case: confusing bandwidth with latency — a faster link never delivers the first bit earlier.
How busy is too busy for one link?
Price ρ = La/R and keep headroom: delay explodes past ~0.8, and loss is the healthy response, not damage.
More detail
Problem: a link that looks merely busy but answers slowly. Guarantee: W = E[S]/(1−ρ) quoted from queueing — 60 ms at 0.80, 300 ms at 0.96 here. Cost: averaging hides bursts; provision the pair (ρ plus buffer B), not either alone. Failure case: answering overload with bigger buffers converts drops into standing delay; the cure is sending slower.
Where do I spend an upgrade budget?
Find the bottleneck minimum first, then spend there — anywhere else buys idle capacity.
More detail
Problem: end-to-end rate below what most links could carry. Guarantee: path rate is min_i R_i, per flow the smallest share. Cost: the bottleneck moves after each upgrade (link, then share). Failure case: upgrading the fat core while the thin access still decides every transfer.
How much unacknowledged data must a sender sustain?
Keep BDP = R × RTT bits outstanding: throughput obeys min(R, W/RTT).
More detail
Problem: a fast long path delivering a fraction of its rate. Guarantee: one BDP in flight fills the pipe; more only queues. Cost: windows must grow with the links they feed — a 64-KByte window wastes a 1 Gb/s continental path at ~6.6 Mb/s. Failure case: counting packets instead of bits when packet sizes vary.
Fixed headers or TLV options?
Fixed offsets for the hot path with reserved room budgeted in advance; TLV chains where unanticipated options must parse by skipping.
More detail
Problem: headers must parse fast today and extend tomorrow. Guarantee: fixed fields read in constant time; TLV meets unknown types by length. Cost: fixed room runs out; TLV pays a bounds-checked loop per option. Failure case: middleboxes clearing unknown bits spend the extension room the designers saved — the ossification trap.
Hop check, end-to-end check, or both?
Always the ends check; add hop help beneath it for performance — never instead of it.
More detail
Problem: where to place a function both hops and ends could perform. Guarantee: correctness is q^H(1−h) — hop effort asymptotes at the ends ceiling. Cost: in-network functions tax every path. Failure case: dropping the endpoint verification because the link retransmits; wireless hop recovery shortens repair but observes nothing about endpoint memory.
How do two strangers interoperate exactly?
Fix format, order and timeout actions together, as a state machine — any piece missing fails a different way.
More detail
Problem: agreement between independently built ends. Guarantee: the machine survives loss (timer), absorbs duplicates (state-gated replies), and disambiguates identical bytes by state. Cost: timeouts manufacture duplicates, so replies must be idempotent. Failure case: pipelining without numbering — one ack no longer identifies which request completed.
How many bits can this band carry?
Compute B log2(1+S/N) before choosing modulation or power: spectrum decides, power refines.
More detail
Problem: rate ambition without a feasibility bound. Guarantee: no reliable rate above C exists. Cost: approaching C needs long-block coding. Failure case: buying power (logarithmic) where the shortfall is bandwidth (linear) — e.g. pushing uncoded 64-QAM past a 133 Mb/s ceiling.
How do I share one band among conversations?
FDM for static simplicity, TDM for guard-free rotation, OFDM where spectrum binds — spaced exactly 1/T.
More detail
Problem: many conversations, one band. Guarantee: FDM/TDM isolate by non-contact; OFDM by orthogonality with a cyclic-prefix time tax. Cost: guard hertz, idle slots, or prefix airtime. Failure case: detuned subcarrier spacing, or a prefix shorter than the delay spread.
How dense can my constellation go?
Pack points until the noise bridges the gaps: at equal power BPSK gives 2.0, QPSK 1.414, 16-QAM 0.6325 units of spacing.
More detail
Problem: more bits per symbol versus more errors. Guarantee: minimum distance at fixed power ranks schemes fairly. Cost: superlinear noise vulnerability with density. Failure case: reading Nyquist density as achievable without checking the error tail.