The Yo-Yo Attack: Bankrupting Cloud Infrastructure
A comprehensive guide to the Yo-Yo attack, an Economic Denial of Sustainability (EDoS) technique that targets auto-scaling mechanisms in cloud environments.
Feb 28, 2026Cybersecurity
Imagine you're sending a fragile package across the country. You wouldn't just toss it into the mail without tracking, right? You'd want confirmation it arrived safely, retries if it got lost, and a way to avoid overwhelming the postal service. That's essentially what TCP (Transmission Control Protocol) does for data on the internet. It's one of the core protocols in the TCP/IP suite, ensuring that information gets from point A to point B reliably, in order, and without errors.
In this article, we'll break down TCP in simple terms—no PhDs required. We'll explore how it works, dive deep into its famous "three-way handshake" with everyday analogies, include some code snippets to see it in action, and wrap up with why hackers love (and fear) it.
The internet is a wild place: data packets zip around like cars on a highway, sometimes getting lost in traffic, duplicated, or arriving out of order. UDP (User Datagram Protocol) is the speedy but reckless driver—it sends data fast but doesn't care if it arrives. TCP, on the other hand, is the cautious trucker: slower but dependable.
Key features of TCP:
TCP powers most internet traffic: web browsing (HTTP/HTTPS), email (SMTP), file transfers (FTP), and more. Without it, your Netflix stream might buffer endlessly or your emails could vanish.
Before TCP sends any real data, it performs a three-way handshake to set up a reliable connection. Think of it like two friends meeting at a café for the first time—they need to confirm they're both there and ready to talk.
Here's the step-by-step, with an analogy of hailing a taxi:
SYN (Synchronize): The client (you) waves to flag down a taxi and shouts, "Hey, need a ride to downtown!" This sets a sequence number (like a ticket number) to track the order of messages.
Analogy: You're standing on the curb, arm raised, yelling to get the driver's attention. No ride yet—just checking if they're available.
SYN-ACK (Synchronize-Acknowledge): The server (taxi driver) sees you, honks the horn, pulls over, and yells back, "Hop in! I see your ticket #123—mine's #456." This acknowledges your SYN and sends its own sequence number.
Analogy: The driver not only stops but also confirms they heard you and shares their route plan. Now you know it's the right cab.
ACK (Acknowledge): You hop in, say "Got it—your #456 is noted, let's roll with #123," and off you go. This final ACK confirms everything's synced.
Analogy: You nod, buckle up, and the trip starts. Any confusion? No way—everyone's on the same page (or route).
This dance happens in milliseconds and uses flags in the TCP header (a small envelope at the start of each packet). The SYN flag kicks it off, ACK confirms, and SYN-ACK combines both. Once done, data flows bidirectionally until one side says "FIN" (finish) to close the connection gracefully.
If the handshake fails (e.g., no SYN-ACK), the client retries or gives up—better safe than sorry!
Here's a simple diagram in text form:
Client Server
| |
|-------- SYN (seq=100) -------> |
| |
|<------- SYN-ACK (seq=300, ack=101) ---|
| |
|-------- ACK (ack=301) -------> |
| |
Data flows here...
Want to see TCP in code? Python's socket library makes it easy. Below is a basic client-server example. The server listens for connections (handshake happens behind the scenes), and the client sends a message.
tcp_server.py)import socket
# Create a TCP socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8080)) # Bind to address and port
server_socket.listen(1) # Listen for connections
print("Server listening on port 8080...")
while True:
client_socket, addr = server_socket.accept() # Accept connection (handshake here!)
print(f"Connection from {addr}")
data = client_socket.recv(1024).decode() # Receive data
print(f"Received: {data}")
client_socket.send(b"Echo: " + data.encode()) # Send response
client_socket.close() # Close connectiontcp_client.py)import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 8080)) # Connect (initiates handshake)
message = "Hello, TCP!"
client_socket.send(message.encode()) # Send data
response = client_socket.recv(1024).decode() # Receive echo
print(f"Response: {response}")
client_socket.close() # CloseRun the server first (python tcp_server.py), then the client (python tcp_client.py). You'll see the handshake establish the connection automatically. Tools like Wireshark can capture the SYN/SYN-ACK/ACK packets for debugging.
Once connected, TCP uses sequence numbers (those ticket #'s) to reorder packets and ACKs for confirmations. If a packet drops, it's resent. For traffic jams, congestion control algorithms (like Tahoe or Reno) slow things down—think of it as cars merging onto a busy freeway one by one.
From a cybersecurity lens, TCP is both a fortress and a potential weak spot. Its handshake is a prime target for SYN flood attacks, where hackers spam fake SYN packets to overwhelm servers, exhausting resources (like a prank caller tying up phone lines). Defenses include firewalls that detect and drop suspicious traffic, or SYN cookies to verify real connections without allocating memory upfront.
Understanding TCP is crucial because it's the backbone of secure comms: HTTPS wraps it for encryption, and misconfigurations (e.g., open ports) lead to breaches like the 2017 Equifax hack. For devs, it means building robust apps; for everyday users, it explains why your Zoom call lags in bad Wi-Fi. In a world of IoT devices and 5G, grasping TCP empowers you to troubleshoot, secure, and innovate—turning internet chaos into reliable magic.
Dive deeper with RFC 793 (TCP's original spec) or experiment with the code above.
Love it? Share this article: