PortsFirewallsWAFTCPSocketsConnections

Ports, Firewalls & How Servers Handle Thousands of Users

A clear, intuition-first guide to what ports really are, why 80 and 443 matter, how firewalls and WAFs protect servers, and how one port handles thousands of simultaneous connections without breaking a sweat.

25 min read10 sections
01

What Is a Port?

Every device on the internet has an IP address — that's how data finds the right machine. But a machine runs dozens of services at once: a web server, an SSH daemon, a database, a mail server. When a packet arrives at the machine, how does the operating system know which service should handle it?

That's what ports solve. A port is a 16-bit number (0–65535) that acts as a logical endpoint on a machine. The combination of an IP address and a port uniquely identifies a specific service on a specific machine.

🏢

The Office Building Analogy

Think of an IP address as the street address of an office building. The port number is the room number inside that building. Mail addressed to '192.168.1.10:443' is like a letter sent to 'Building 192.168.1.10, Room 443.' The mailroom (operating system) looks at the room number and delivers the letter to the right office (service).

IP Address vs. Porttext
Your machine: 203.0.113.50

  Port 80Web server (HTTP)         🌐
  Port 443Web server (HTTPS)        🔒
  Port 22SSH daemon                🖥️
  Port 5432PostgreSQL database       🗄️
  Port 3000Node.js dev server        ⚙️
  Port 6379Redis                     📦

One IP address, many servicesports keep them separate.

When a browser requests https://example.com:
DNS resolves example.com to 93.184.216.34
Browser connects to 93.184.216.34 on port 443
OS on that machine routes the packet to the HTTPS service

Without ports, a machine could only run one network service at a time. Ports are what allow a single server to host a website, accept SSH connections, serve a database, and run a Redis cache — all simultaneously, all on the same IP address.

🔥 The Key Point

An IP address gets you to the right machine. A port gets you to the right service on that machine. Together, they form a complete network address: IP:Port — like a building address plus a room number.

02

What Do 80, 443, 22 Mean?

You've probably seen these numbers everywhere. They're not magic — they're conventions. Specific port numbers have been assigned to specific protocols by IANA (Internet Assigned Numbers Authority), the organization that manages global internet standards.

🌐

Port 80 — HTTP

The default port for unencrypted web traffic. When you visit http://example.com, your browser connects to port 80. All data travels in plain text — anyone on the network can read it.

🔒

Port 443 — HTTPS

The default port for encrypted web traffic (HTTP over TLS). When you visit https://example.com, your browser connects to port 443. All data is encrypted end-to-end.

🖥️

Port 22 — SSH

The default port for Secure Shell — the protocol developers use to remotely log into servers, transfer files, and run commands. SSH encrypts everything, including your password.

Common Well-Known Portstext
Port    Protocol    What It Does
────    ────────    ──────────────────────────────────
21      FTP         File transfer (unencrypted)
22      SSH         Secure remote access
25      SMTP        Sending email
53      DNS         Domain name resolution
80      HTTP        Web traffic (unencrypted)
443     HTTPS       Web traffic (encrypted)
3306    MySQL       MySQL database
5432    PostgreSQL  PostgreSQL database
6379    Redis       Redis cache/store
8080    HTTP Alt    Common alternative HTTP port
27017   MongoDB     MongoDB database

Ports 01023 are "well-known ports"reserved by IANA.
Ports 102449151 are "registered ports"assigned to specific services.
Ports 4915265535 are "ephemeral ports"used temporarily by clients.

The reason browsers "just work" when you type example.com is because they assume port 443 for https:// URLs and port 80 for http:// URLs. You never have to type the port because the browser fills it in based on the protocol.

What the Browser Actually Doestext
What you type:              What the browser actually connects to:
──────────────              ──────────────────────────────────────
https://example.com    →    example.com:443
http://example.com     →    example.com:80
https://example.com:8443 →  example.com:8443  (explicit override)

The port is ALWAYS therethe browser just hides it
when it matches the default for the protocol.

💡 These Are Conventions, Not Laws

There's nothing technically stopping you from running an HTTPS server on port 9999 or SSH on port 2222. These port assignments are standards agreed upon by the industry — they make the internet predictable and interoperable. But they're not enforced by the protocol itself.

03

Why Can't We Use Other Ports?

Short answer: you absolutely can. There's nothing preventing you from running a web server on port 3000, 8080, or 51234. During development, you do this all the time. But in production, there are strong practical reasons why everyone sticks to 80 and 443.

Reason 1: Browsers Assume Default Ports

When a user types example.com in their browser, the browser automatically connects to port 443 (HTTPS) or 80 (HTTP). If your server runs on port 3000, the user must type example.com:3000 explicitly. Most users don't know what a port is, let alone how to specify one.

Reason 2: Firewalls Block Non-Standard Ports

Corporate networks, cloud security groups, and ISPs typically only allow traffic on ports 80 and 443. If your server runs on port 9999, a significant portion of your users simply can't reach it — their firewall silently drops the connection.

Reason 3: Standardization Enables the Ecosystem

CDNs, load balancers, reverse proxies, monitoring tools, and SSL certificate providers all assume ports 80 and 443. Using non-standard ports means fighting your entire infrastructure stack.

ScenarioStandard Port (443)Custom Port (3000)
User types URLJust worksMust include :3000
Corporate firewallAllowed by defaultLikely blocked
CDN integrationAutomaticRequires custom config
SSL certificatesStandard setupWorks, but unusual
SEO & link sharingClean URLsUgly URLs with port
Load balancersDefault configManual port mapping
Custom Port in Practicetext
Development (totally fine):
  http://localhost:3000        ← your React dev server
  http://localhost:8080        ← your API server
  http://localhost:5432        ← your database

Production (use standard ports):
  https://api.example.com      ← port 443 (implicit)
  https://app.example.com      ← port 443 (implicit)

Behind the scenes, a reverse proxy (Nginx, Caddy) often
listens on port 443 and forwards to your app on port 3000:

  Internet → :443 (Nginx) → :3000 (your Node.js app)

This gives you the best of both worlds:
Standard port for the outside world
Any port you want internally
🚫

Ports 80 and 443 are hardcoded into the internet — you can't use anything else

Ports are just numbers. Any service can listen on any port. The "standard" ports are conventions maintained by IANA, not technical limitations. You can run HTTPS on port 8443 or SSH on port 2222 — it works fine. The constraints are practical (firewalls, browser defaults, user expectations), not technical.

04

Firewall Rules Explained

A firewall is a gatekeeper that decides which network traffic is allowed in and which is blocked. It operates at the network level — it looks at the source IP, destination IP, port number, and protocol (TCP/UDP) of each packet and applies rules.

Let's read a real firewall ruleset line by line:

Network Firewall Rulestext
Rule #   Action    Protocol   Port   Source          Description
──────   ──────    ────────   ────   ──────          ───────────
1        ALLOW     TCP        443    0.0.0.0/0       HTTPS from anywhere
2        ALLOW     TCP        80     0.0.0.0/0       HTTP from anywhere
3        ALLOW     TCP        22     10.0.0.0/8      SSH from internal network only
4        DENY      ALL        ALL    0.0.0.0/0       Block everything else

Let's break down every piece:

1

ALLOW TCP 443 from 0.0.0.0/0

Allow any IP address on the internet (0.0.0.0/0 means 'anywhere') to connect to port 443 using TCP. This is your HTTPS traffic — the public web.

2

ALLOW TCP 80 from 0.0.0.0/0

Same thing for port 80 (HTTP). Many servers keep this open to redirect HTTP visitors to HTTPS automatically.

3

ALLOW TCP 22 from 10.0.0.0/8

Allow SSH connections, but ONLY from IP addresses starting with 10.x.x.x — your internal/private network. This means developers can SSH into the server from the office or VPN, but nobody on the public internet can even attempt to connect.

4

DENY ALL from 0.0.0.0/0

The catch-all rule: block everything that didn't match a previous rule. If someone tries to connect to port 5432 (PostgreSQL) from the internet — denied. Port 6379 (Redis) — denied. This is the 'default deny' principle.

🚪

The Nightclub Bouncer

A firewall is like a bouncer at a nightclub with a guest list. Rule 1: 'Anyone can enter through the main door (443).' Rule 2: 'Anyone can enter through the side door (80).' Rule 3: 'Only employees can use the staff entrance (22).' Rule 4: 'If you're not on the list, you're not getting in.' The bouncer doesn't care what you do once you're inside — that's the WAF's job.

Key Concepts

Firewall Terminologytext
TCP (Transmission Control Protocol):
  The protocol used for reliable, ordered data delivery.
  HTTP, HTTPS, SSH all run over TCP.

0.0.0.0/0:
  CIDR notation meaning "every IP address on the internet."
  The /0 means "zero bits of the address are fixed" = all addresses match.

10.0.0.0/8:
  CIDR notation meaning "any IP starting with 10."
  The /8 means "the first 8 bits (10.) are fixed."
  Covers 10.0.0.0 through 10.255.255.255a private network range.

Attack Surface:
  Every open port is a potential entry point for attackers.
  Fewer open ports = smaller attack surface = harder to breach.
  That's why Rule 4 (DENY ALL) is critical — it closes every
  door you didn't explicitly open.

🔥 Why SSH Is Restricted

SSH gives full shell access to your server. If an attacker gets in via SSH, they own the machine. That's why Rule 3 restricts SSH to the internal network (10.0.0.0/8). Even if someone guesses the SSH password, they can't connect from the public internet — the firewall drops the packet before it ever reaches the SSH service.

05

WAF — Web Application Firewall

A network firewall controls who can connect to which port. But once someone is allowed through port 443, the firewall's job is done. It doesn't inspect what the visitor actually sends — it just checks the envelope, not the letter inside.

A WAF (Web Application Firewall) goes deeper. It sits between the internet and your web application and inspects the actual HTTP request: the URL, headers, query parameters, request body, cookies — everything. Its job is to block malicious requests before they reach your application code.

🌐

User Request

HTTP/HTTPS request

🧱

Network Firewall

Port-level filtering

🛡️

WAF

Content inspection

⚙️

Your App

Application logic

What Does a WAF Block?

WAF Rules — Examplestext
Rule 1: Block SQL Injection
  Request: GET /users?id=1; DROP TABLE users;--
  WAF sees: SQL keywords in query parameterBLOCKED 🚫

Rule 2: Block Cross-Site Scripting (XSS)
  Request: POST /comment  body: { "text": "<script>steal(cookies)</script>" }
  WAF sees: <script> tag in request bodyBLOCKED 🚫

Rule 3: Rate Limiting
  Request: 500 requests from same IP in 10 seconds
  WAF sees: abnormal request rateBLOCKED 🚫 (likely a bot or DDoS)

Rule 4: User-Agent Filtering
  Request: GET / with User-Agent: "sqlmap/1.5"
  WAF sees: known attack tool signatureBLOCKED 🚫

Rule 5: Path Traversal
  Request: GET /files/../../../etc/passwd
  WAF sees: directory traversal patternBLOCKED 🚫
PropertyNetwork FirewallWAF
Operates atNetwork/Transport layer (L3/L4)Application layer (L7)
InspectsIP addresses, ports, protocolsHTTP requests, headers, body, cookies
BlocksUnauthorized network accessMalicious request content
AnalogyBouncer checking IDs at the doorSecurity guard scanning bags inside
ExamplesAWS Security Groups, iptablesAWS WAF, Cloudflare WAF, ModSecurity

💡 They Work Together, Not Instead Of

A network firewall and a WAF are complementary layers. The firewall reduces the attack surface by closing unnecessary ports. The WAF protects the ports that must stay open (80, 443) by inspecting what comes through them. Defense in depth — multiple layers, each catching what the previous one missed.

🏛️

Airport Security Analogy

The network firewall is like the airport perimeter fence — it controls who can enter the airport grounds at all. The WAF is like the TSA checkpoint inside — it lets authorized people through but scans their bags for prohibited items. You need both: the fence keeps random people out, and the checkpoint catches threats from people who are allowed in.

06

Thousands of Users, Same Port?

This is the question that trips up most developers: if 10,000 users all visit https://example.com at the same time, they're all connecting to port 443 on the same server. Don't they collide? How does the server tell them apart?

The answer is: connections are not identified by the server port alone. A connection is identified by a 4-tuple — four pieces of information together. As long as any one of those four values is different, it's a completely separate connection.

🚫

If thousands of users connect to the same port, they'll conflict with each other

A port is not a pipe with limited capacity. It's a logical label. The operating system uses the full 4-tuple (source IP, source port, destination IP, destination port) to distinguish connections. Port 443 can handle tens of thousands of simultaneous connections because each one has a unique combination of client IP and client port.

Why Connections Don't Collidetext
Server: 93.184.216.34:443

Connection 1:  (Client: 72.14.200.1:52431)  →  (Server: 93.184.216.34:443)
Connection 2:  (Client: 72.14.200.1:52432)  →  (Server: 93.184.216.34:443)
Connection 3:  (Client: 198.51.100.5:49812) →  (Server: 93.184.216.34:443)
Connection 4:  (Client: 198.51.100.5:49813) →  (Server: 93.184.216.34:443)
Connection 5:  (Client: 203.0.113.42:61234) →  (Server: 93.184.216.34:443)
   ...
Connection 10000: (Client: 10.0.5.22:55019) →  (Server: 93.184.216.34:443)

All 10,000 connections land on port 443.
All 10,000 are completely separate.
The OS uses the FULL 4-tuple to route each packet
to the correct connection/socket.

Notice that even the same user (72.14.200.1) has two connections — they just use different client-side ports (52431 and 52432). This happens naturally when you open multiple tabs to the same website.

🔥 The Core Insight

A port is not a connection. A port is an address label. The connection is the full 4-tuple. That's why one port can serve unlimited concurrent connections — each connection is uniquely identified by the combination of all four values.

07

How Connections Stay Unique

Let's go deeper into the 4-tuple that makes every connection unique. This is the mechanism that allows the entire internet to work.

The 4-Tuple (Socket Pair)

Every TCP connection is uniquely identified by exactly four values:

The 4-Tupletext
┌─────────────────────────────────────────────────────┐
TCP Connection Identity
├─────────────────────────────────────────────────────┤
│                                                     │
1. Source IP Address      (client's IP)           
2. Source Port            (client's ephemeral port)
3. Destination IP Address (server's IP)           
4. Destination Port       (server's port, e.g. 443)
│                                                     │
If ANY one of these four values differs,          │
it's a completely different connection.            
│                                                     │
└─────────────────────────────────────────────────────┘

Examplesame user, two browser tabs:

  Tab 1: (72.14.200.1 : 52431) → (93.184.216.34 : 443)
  Tab 2: (72.14.200.1 : 52432) → (93.184.216.34 : 443)

              Different source port = different connection

What Are Ephemeral Ports?

When your browser opens a connection to a server, it needs a port on your side too — a "return address" for the server's responses. Your operating system automatically assigns a random port from the ephemeral range (typically 49152–65535). You never see this port, but it's always there.

Ephemeral Ports in Actiontext
You open https://example.com in Chrome:

  Your OS picks ephemeral port 52431
  Connection: (your_ip:52431) → (example.com:443)

You open a second tab to the same site:

  Your OS picks ephemeral port 52432
  Connection: (your_ip:52432) → (example.com:443)

You open Slack (which also uses HTTPS):

  Your OS picks ephemeral port 52433
  Connection: (your_ip:52433) → (slack.com:443)

Each connection gets its own ephemeral port automatically.
You have ~16,000 ephemeral ports available (4915265535).
That's 16,000 simultaneous connections from one machine to one server.

Visualizing Multiple Connections

Client IPClient PortServer IPServer PortConnection
72.14.200.15243193.184.216.34443Connection A
72.14.200.15243293.184.216.34443Connection B
198.51.100.54981293.184.216.34443Connection C
198.51.100.55243193.184.216.34443Connection D
72.14.200.15243193.184.216.3480Connection E

Notice Connection A and Connection D both use client port 52431 — but they're from different client IPs, so they're different connections. Connection A and Connection E have the same client IP and port, but different server ports (443 vs 80) — also different connections.

💡 Why This Matters for Developers

Understanding the 4-tuple explains why you can run multiple services on different ports on localhost during development, why NAT works, why load balancers can distribute traffic, and why connection limits are about memory and file descriptors — not about "running out of ports."

08

What Happens Inside the Server

Now that we know connections are unique, let's look at what the server actually does when thousands of connections arrive on port 443.

The Listening Socket

When a web server starts, it creates a listening socket bound to port 443. This socket doesn't handle data — it just waits for new connection requests. Think of it as a receptionist at a front desk.

Server Socket Lifecycletext
Step 1: Server starts
Creates a listening socket on port 443
Socket state: LISTENING
"I'm ready to accept connections on port 443"

Step 2: Client A connects
Listening socket accepts the connection
OS creates a NEW socket for this specific connection
New socket: (Client_A_IP:52431Server_IP:443)
  → Listening socket goes back to waiting

Step 3: Client B connects
  → Listening socket accepts again
  → OS creates ANOTHER new socket
  → New socket: (Client_B_IP:49812Server_IP:443)
  → Listening socket goes back to waiting

After 10,000 connections:
  → 1 listening socket (still waiting for more)
  → 10,000 connected sockets (each handling one client)

  Listening socket ──→ "Front desk receptionist"
  Connected sockets ──→ "Individual meeting rooms"
🏨

The Hotel Reception Desk

Port 443 is like the hotel's front door — there's only one, and every guest walks through it. The listening socket is the receptionist. When a guest arrives, the receptionist doesn't personally serve them for their entire stay. Instead, they assign the guest a room (a new connected socket) and go back to greeting the next guest. The hotel can have thousands of guests, all of whom entered through the same front door.

How the Server Processes Connections

Different servers handle concurrent connections differently, but the two dominant models are:

🧵

Thread-per-Connection

Each connection gets its own OS thread. The thread reads the request, processes it, sends the response, and dies. Simple to reason about, but threads are expensive — each uses ~1MB of stack memory. At 10,000 connections, that's 10GB just for stacks. Used by: Apache (prefork), traditional Java servers.

🔄

Event Loop (Non-blocking I/O)

A single thread manages thousands of connections using an event loop. Instead of waiting for I/O (disk reads, database queries), it registers a callback and moves to the next connection. When I/O completes, the callback fires. Extremely memory-efficient. Used by: Nginx, Node.js, Go (goroutines).

Thread-per-Connection vs. Event Looptext
Thread-per-Connection (Apache-style):

  Connection 1Thread 1 → [read request] [query DB ⏳] [send response]
  Connection 2Thread 2 → [read request] [query DB ⏳] [send response]
  Connection 3Thread 3 → [read request] [query DB ⏳] [send response]
  ...
  Connection 10000Thread 10000 → ...

  Problem: 10,000 threads, most sitting idle waiting for DB.
  Memory: ~10 GB just for thread stacks.

Event Loop (Nginx/Node.js-style):

  Single thread:
Connection 1: read request, start DB query (non-blocking)
Connection 2: read request, start DB query (non-blocking)
Connection 3: read request, start DB query (non-blocking)
Connection 1: DB result ready! Send response.
Connection 3: DB result ready! Send response.
Connection 2: DB result ready! Send response.

  Memory: minimalno thread stacks, just connection state.
  Can handle 100,000+ connections on a single thread.

🔥 The Real Bottleneck

The limit on concurrent connections isn't the port — it's server resources: memory (each connection needs some state), file descriptors (each socket is a file descriptor in Linux), and CPU (to process requests). A well-tuned Nginx server can handle over 100,000 concurrent connections on modest hardware. The port itself is never the bottleneck.

09

Common Questions

Q:Why are ports like 80 and 443 'fixed'?

A: They're not fixed by the protocol — they're standardized by convention. IANA assigns well-known port numbers so that every browser, server, and tool on the internet agrees on which port to use for which service. Without this convention, you'd have to manually specify the port for every URL you visit. It's like how everyone agrees to drive on the same side of the road — not a law of physics, but essential for things to work.

Q:Why can't I just use a random port for my production server?

A: You technically can, but you'll fight three battles: (1) browsers won't auto-connect to it, so users must type the port manually, (2) most firewalls block non-standard ports by default, cutting off a chunk of your users, and (3) CDNs, load balancers, and monitoring tools all assume standard ports. The workaround is a reverse proxy: run your app on any port internally, and let Nginx/Caddy listen on 443 and forward traffic.

Q:If many users hit the same URL, do their connections clash?

A: Never. Each connection is identified by a 4-tuple: (client IP, client port, server IP, server port). Even if 50,000 users connect to the same server on port 443, each has a unique client IP + client port combination. The OS uses this 4-tuple to route every packet to the correct socket. There's no collision, no confusion, no shared state between connections.

Q:How does a server handle thousands of connections on one port?

A: The server creates one listening socket on the port. For each incoming connection, the OS creates a new connected socket with the unique 4-tuple. The server then processes each socket independently — either with a dedicated thread (Apache-style) or via an event loop (Nginx/Node.js-style). The port is just the entry point; the actual work happens on individual sockets.

Q:What is the role of client-side ports?

A: When your browser connects to a server, your OS assigns a random 'ephemeral' port (typically 49152–65535) as the source port. This is the return address — the server sends responses back to your IP on this port. You never see it, but it's what makes your connection unique. If you open two tabs to the same site, each tab gets a different ephemeral port, creating two separate connections.

Q:Can a server run out of ports?

A: The server only uses one port (e.g., 443) for all connections — it doesn't consume a new port per connection. The limit is on the client side: each outgoing connection uses one ephemeral port, and there are ~16,000 available. So one client machine can have ~16,000 simultaneous connections to the same server. In practice, you hit memory or file descriptor limits long before port exhaustion.

10

Final Mental Model

Let's tie everything together into one clear picture. Here's the complete journey of a request, from the user's browser to the server's application code:

The Complete Picturetext
User types: https://example.com

1. DNS Resolution
   example.com93.184.216.34

2. TCP Connection
   Browser picks ephemeral port 52431
   Connection: (user_ip:52431) → (93.184.216.34:443)

3. Network Firewall
   ✅ Port 443 from 0.0.0.0/0 → ALLOWED
   (If this was port 5432, it would be DENIED here)

4. TLS Handshake
   🔐 Encrypted channel established on this connection

5. WAF Inspection
   ✅ Request: GET /api/users → looks clean, ALLOWED
   (If this was GET /users?id=1;DROP TABLEBLOCKED)

6. Server Processing
   Listening socket on :443 accepts the connection
   OS creates a new connected socket for this 4-tuple
   Server reads the request, processes it, sends response

7. Response travels back
   Server → (93.184.216.34:443) → (user_ip:52431) → Browser

Meanwhile, 9,999 other users are doing the exact same thing,
each with their own unique 4-tuple, their own socket,
their own encrypted TLS session — all on port 443.

Quick Revision Cheat Sheet

Port: A 16-bit number (0–65535) that identifies a service on a machine. IP gets you to the machine, port gets you to the service.

80 / 443 / 22: IANA-standardized ports for HTTP, HTTPS, and SSH. Conventions, not hard rules — but the entire ecosystem assumes them.

Custom ports: Technically work, but blocked by firewalls, ignored by browsers, and unsupported by CDNs. Use a reverse proxy instead.

Network Firewall: Controls which IPs can reach which ports. Operates at the network layer. Reduces attack surface by closing unused ports.

WAF: Inspects HTTP request content (SQL injection, XSS, rate limits). Operates at the application layer. Protects open ports from malicious payloads.

4-Tuple: (Client IP, Client Port, Server IP, Server Port) — uniquely identifies every TCP connection. This is why one port handles thousands of users.

Ephemeral port: Random port (49152–65535) assigned by the client OS for each outgoing connection. The 'return address' for server responses.

Listening socket: The server's 'front desk' — waits for new connections on a port. Each accepted connection gets its own connected socket.

Connection limit: Not the port — it's memory, file descriptors, and CPU. A single Nginx instance can handle 100K+ connections on one port.

💡 The One-Sentence Summary

A port is the door, a firewall decides who can knock, a WAF checks what they're carrying, and the 4-tuple ensures every visitor gets their own private room — even if 10,000 of them walked through the same door.