618  Advanced MAC Protocols and Network Concepts

618.1 Learning Objectives

By the end of this chapter, you will be able to:

  • Understand TCP congestion control and its impact on IoT over lossy links
  • Explain IPv4 exhaustion and NAT challenges for IoT deployments
  • Compare MAC protocols (CSMA, TDMA, ALOHA) for different use cases
  • Identify and solve hidden and exposed terminal problems
  • Implement QoS for prioritizing critical IoT traffic
  • Handle MTU and fragmentation issues in constrained networks

618.2 Deep Dive: Advanced Networking Concepts for IoT

This section covers advanced networking topics for engineers implementing production IoT systems. Beginners can skip and return when deploying large-scale networks.

618.2.1 TCP Congestion Control and IoT Implications

TCP’s congestion control algorithms (originally designed for traditional networks) can cause problems in IoT environments.

How TCP Congestion Control Works:

TCP Congestion Window (CWND) states:

1. Slow Start: CWND doubles each RTT until threshold
   - Start: 1 MSS (Maximum Segment Size β‰ˆ 1460 bytes)
   - After 1 RTT: 2 MSS
   - After 2 RTT: 4 MSS
   - After 3 RTT: 8 MSS
   - ...until ssthresh (slow start threshold) reached

2. Congestion Avoidance: CWND increases linearly
   - +1 MSS per RTT
   - Continue until packet loss detected

3. Fast Recovery: On packet loss
   - Cut CWND in half
   - Resume from there (not back to 1)

IoT Problem: Lossy wireless links trigger congestion control unnecessarily.

Example: LoRaWAN TCP connection
- Packet loss rate: 5% (normal for LoRa due to interference/collisions)
- TCP interprets ALL losses as congestion
- CWND repeatedly halved β†’ Poor throughput

Measured performance:
- Wi-Fi (0.1% loss): 80 Mbps throughput (94% of capacity)
- LoRa (5% loss):   2 Kbps throughput (4% of 50 Kbps capacity!)

Solutions: 1. Use UDP for lossy links: CoAP (UDP-based) works better than HTTP (TCP) 2. Tune TCP parameters: Increase initial CWND, adjust retransmission timeout 3. Application-layer retries: Implement custom retry logic at MQTT/CoAP layer

Real Implementation:

# Linux TCP tuning for IoT gateway
sysctl -w net.ipv4.tcp_congestion_control=bbr  # Use BBR instead of CUBIC
sysctl -w net.ipv4.tcp_slow_start_after_idle=0  # Don't reset CWND on idle
sysctl -w net.ipv4.tcp_no_metrics_save=1  # Don't cache congestion metrics

618.2.2 IPv4 Address Exhaustion and NAT for IoT

The IPv4 Problem:

IPv4 address space: 2Β³Β² = 4,294,967,296 addresses (~4.3 billion)
Unusable addresses: ~590 million (private ranges, reserved, multicast)
Usable public IPv4: ~3.7 billion addresses

Current IoT devices (2024): ~16 billion
Projected (2030): ~30+ billion
Problem: NOT ENOUGH IPv4 addresses for every device!

Network Address Translation (NAT) - The Temporary Fix:

NAT allows many devices to share one public IP:

Your home network (192.168.1.0/24):

  • Router public IP: 203.0.113.45 (ONE public IP)
  • Devices behind NAT:
    • Phone: 192.168.1.100 (private)
    • Thermostat: 192.168.1.101 (private)
    • Camera: 192.168.1.102 (private)
    • Lights: 192.168.1.103-120 (private)

%%{init: {'theme': 'base', 'themeVariables': {'primaryColor': '#2C3E50', 'primaryTextColor': '#fff', 'primaryBorderColor': '#16A085', 'lineColor': '#16A085', 'secondaryColor': '#E67E22', 'tertiaryColor': '#7F8C8D'}}}%%
flowchart LR
    subgraph PRIVATE["Internal (Private)"]
        P1["192.168.1.100:45678<br/>Phone"]
        P2["192.168.1.101:45679<br/>Thermostat"]
        P3["192.168.1.102:45680<br/>Camera"]
    end

    NAT["NAT Router<br/>203.0.113.45"]

    subgraph PUBLIC["External (Public)"]
        E1["203.0.113.45:50001"]
        E2["203.0.113.45:50002"]
        E3["203.0.113.45:50003"]
    end

    P1 --> NAT --> E1
    P2 --> NAT --> E2
    P3 --> NAT --> E3

    style P1 fill:#16A085,stroke:#2C3E50,color:#fff
    style P2 fill:#16A085,stroke:#2C3E50,color:#fff
    style P3 fill:#16A085,stroke:#2C3E50,color:#fff
    style NAT fill:#E67E22,stroke:#2C3E50,color:#fff
    style E1 fill:#2C3E50,stroke:#16A085,color:#fff
    style E2 fill:#2C3E50,stroke:#16A085,color:#fff
    style E3 fill:#2C3E50,stroke:#16A085,color:#fff

Figure 618.1

NAT Problems for IoT:

  1. Inbound connections blocked:

    • Can’t directly access smart camera from internet
    • Need port forwarding or VPN
    • Security risk if misconfigured
  2. NAT traversal complexity:

    • Requires STUN/TURN servers for peer-to-peer
    • Adds latency (extra hops)
    • Some protocols don’t work through NAT (FTP, SIP without ALG)
  3. Port exhaustion:

    One public IP = 65535 ports
    If 10000 IoT devices each maintain 10 connections:
    10000 Γ— 10 = 100,000 connections β†’ EXCEEDS port limit!
    
    Result: Connection failures, timeouts

IPv6: The Real Solution:

IPv6 address space: 2¹²⁸ β‰ˆ 3.4 Γ— 10³⁸ addresses

That's: 340,282,366,920,938,463,463,374,607,431,768,211,456 addresses
      = 670,000,000,000,000,000,000,000,000 addresses per square millimeter of Earth!

Every IoT device can have multiple global unicast addresses - no NAT needed!

IPv6 Adoption in IoT (2024): - Cellular IoT (NB-IoT, LTE-M): 100% IPv6 support - Wi-Fi 6: Full IPv6 support - Zigbee, Thread: 6LoWPAN (IPv6 over Low-Power Wireless Personal Area Networks) - LoRaWAN: IPv6 via IPv6-over-LoRaWAN draft standard

618.2.4 MAC Protocol Challenges: Hidden and Exposed Terminals

CSMA/CA works well in simple scenarios, but wireless networks face unique challenges that don’t exist in wired networks. Two fundamental problemsβ€”hidden terminals and exposed terminalsβ€”can severely degrade network performance in IoT deployments.

618.2.4.1 The Hidden Terminal Problem

Definition: Two nodes cannot hear each other’s transmissions but both can reach a common destination, causing undetected collisions at the receiver.

Why It Happens: - Wireless signals attenuate with distance - Physical obstacles (walls, furniture, machinery) block signals - Nodes outside each other’s carrier sense range

%%{init: {'theme': 'base', 'themeVariables': {'primaryColor': '#2C3E50', 'primaryTextColor': '#fff', 'primaryBorderColor': '#16A085', 'lineColor': '#E67E22', 'secondaryColor': '#16A085', 'tertiaryColor': '#ecf0f1', 'clusterBkg': '#ecf0f1', 'clusterBorder': '#2C3E50', 'edgeLabelBackground':'#ffffff'}}}%%
graph LR
    A["Node A<br/>(Sensor)"]
    B["Node B<br/>(Gateway)"]
    C["Node C<br/>(Sensor)"]

    A -->|"Can transmit to B"| B
    C -->|"Can transmit to B"| B
    A -.->|"❌ Cannot hear C<br/>(out of range)"| C

    style A fill:#2C3E50,stroke:#16A085,stroke-width:3px,color:#fff
    style B fill:#E67E22,stroke:#2C3E50,stroke-width:3px,color:#fff
    style C fill:#2C3E50,stroke:#16A085,stroke-width:3px,color:#fff

Figure 618.2: Hidden terminal problem with nodes A and C both transmitting to gateway B unaware of each other

The Problem in Action:

Scenario: Smart factory with Wi-Fi sensors

Time 0ms:  Node A senses channel β†’ idle (can't hear C)
           Node C senses channel β†’ idle (can't hear A)

Time 1ms:  Node A starts transmitting to Gateway B
           Node C starts transmitting to Gateway B

Time 2ms:  COLLISION at Gateway B!
           - Gateway B receives garbled data from both A and C
           - A and C think transmission succeeded (no collision detection)
           - Both A and C cannot hear each other's carrier signal

Result:    Both frames lost, but nodes don't know it
           No retransmission until timeout (wasted time and energy)

Real-World IoT Impact:

Scenario Hidden Terminal Effect Performance Loss
Smart home (2-story house) Upstairs sensors can’t hear downstairs β†’ collisions at Wi-Fi AP 20-40% packet loss
Zigbee mesh (walls) Nodes in different rooms β†’ collisions at coordinator 15-30% throughput reduction
Industrial WSN (metal machinery) Metal blocks RF β†’ severe hidden terminals 40-60% retransmissions
Wi-Fi in dense deployment 50+ APs in building β†’ overlapping coverage areas 50%+ channel utilization loss

Solution: RTS/CTS Handshake (Request-to-Send / Clear-to-Send)

%%{init: {'theme': 'base', 'themeVariables': {'primaryColor': '#2C3E50', 'primaryTextColor': '#fff', 'primaryBorderColor': '#16A085', 'lineColor': '#E67E22', 'secondaryColor': '#16A085', 'tertiaryColor': '#ecf0f1'}}}%%
sequenceDiagram
    participant A as Node A (Sender)
    participant B as Gateway B (Receiver)
    participant C as Node C (Hidden Terminal)

    Note over A,C: Initial State: All nodes idle

    A->>B: RTS (Request to Send)<br/>Duration: 100 bytes
    Note over C: C hears RTS β†’ sets NAV timer<br/>(Network Allocation Vector)
    B->>A: CTS (Clear to Send)<br/>Duration: 100 bytes
    B->>C: CTS (broadcast)
    Note over C: C hears CTS β†’ updates NAV timer

    Note over C: C defers transmission<br/>for NAV duration

    A->>B: DATA (actual frame)
    Note over C: C still waiting (NAV active)

    B->>A: ACK (acknowledgment)

    Note over A,C: All nodes can now transmit

Figure 618.3: RTS/CTS handshake sequence diagram preventing hidden terminal collisions

How RTS/CTS Works:

Step 1: Node A sends RTS (Request to Send) to Gateway B
        - RTS includes: duration of upcoming transmission
        - All nodes hearing RTS (even if they can't hear A) set NAV timer

Step 2: Gateway B responds with CTS (Clear to Send)
        - CTS also includes transmission duration
        - All nodes hearing CTS (including hidden Node C) set NAV timer
        - Crucially: Node C hears CTS even if it couldn't hear RTS!

Step 3: Node A transmits DATA frame
        - Hidden Node C stays silent (NAV timer active)
        - No collision at Gateway B

Step 4: Gateway B sends ACK (acknowledgment)
        - Transmission complete
        - All NAV timers expire β†’ nodes can compete for channel again

RTS/CTS Trade-offs:

Overhead Calculation (Wi-Fi example):

Without RTS/CTS:
- DATA frame: 1500 bytes
- ACK: 14 bytes
- Total airtime: ~120 ΞΌs (at 100 Mbps)

With RTS/CTS:
- RTS: 20 bytes β†’ 1.6 ΞΌs
- CTS: 14 bytes β†’ 1.1 ΞΌs
- DATA: 1500 bytes β†’ 120 ΞΌs
- ACK: 14 bytes β†’ 1.1 ΞΌs
- Total airtime: ~124 ΞΌs

Overhead: 4 ΞΌs / 124 ΞΌs = 3.2% (small!)

But if hidden terminals cause 30% collisions:
- Without RTS/CTS: 30% retransmissions β†’ 156 ΞΌs average (collision + retry)
- With RTS/CTS: 3.2% overhead β†’ 124 ΞΌs (no collisions)

RTS/CTS wins when collision rate > ~10%!

When to Enable RTS/CTS:

IoT Deployment Enable RTS/CTS? Reasoning
Small smart home (< 10 devices) ❌ No Low collision risk, overhead not worth it
Large smart building (50+ Wi-Fi devices) βœ… Yes Hidden terminals common, reduces collisions
Zigbee mesh (many walls) βœ… Yes Physical obstacles create hidden terminals
Industrial IoT (metal machinery) βœ… Yes Severe RF blocking β†’ many hidden terminals
LoRaWAN ❌ N/A Uses ALOHA, not CSMA (no RTS/CTS)
Bluetooth mesh βœ… Yes Dense deployments with obstacles

618.2.4.2 The Exposed Terminal Problem

Definition: A node unnecessarily defers transmission when its transmission would not cause a collision, reducing channel efficiency.

Why It Happens: - Node overhears a transmission not directed at its intended receiver - CSMA/CA conservatively assumes all transmissions will collide - Spatial reuse is prevented

%%{init: {'theme': 'base', 'themeVariables': {'primaryColor': '#2C3E50', 'primaryTextColor': '#fff', 'primaryBorderColor': '#16A085', 'lineColor': '#E67E22', 'secondaryColor': '#16A085', 'tertiaryColor': '#ecf0f1', 'clusterBkg': '#ecf0f1', 'clusterBorder': '#2C3E50', 'edgeLabelBackground':'#ffffff'}}}%%
graph LR
    A["Node A<br/>(Receiver)"]
    B["Node B<br/>(Sender)"]
    C["Node C<br/>(Sender)"]
    D["Node D<br/>(Receiver)"]

    B -->|"Transmitting to A"| A
    C -.->|"βœ… Could transmit to D<br/>(no collision)"| D
    C -->|"❌ Hears B β†’ defers<br/>(unnecessary!)"| B

    style A fill:#16A085,stroke:#2C3E50,stroke-width:3px,color:#fff
    style B fill:#2C3E50,stroke:#16A085,stroke-width:3px,color:#fff
    style C fill:#E67E22,stroke:#2C3E50,stroke-width:3px,color:#fff
    style D fill:#16A085,stroke:#2C3E50,stroke-width:3px,color:#fff

Figure 618.4: Exposed terminal problem where node C unnecessarily defers though D is out of B’s range

The Problem in Action:

Scenario: Zigbee smart lighting network

Configuration:
- Node B (light switch) transmitting to Node A (controller)
- Node C (motion sensor) wants to transmit to Node D (different controller)
- Node C can hear Node B, but Node D cannot

Time 0ms:  Node B starts transmitting to Node A

Time 1ms:  Node C senses channel β†’ BUSY (hears B)
           Node C defers transmission

Problem:   Node C COULD transmit to Node D safely!
           - Node D is far from Node B (won't hear B's transmission)
           - C β†’ D transmission wouldn't collide with B β†’ A
           - But CSMA/CA doesn't allow spatial reuse

Result:    Channel is underutilized
           Node C waits unnecessarily β†’ increased latency

Real-World IoT Impact:

Scenario Exposed Terminal Effect Efficiency Loss
Linear sensor array Sensors at opposite ends defer unnecessarily 30-50% channel underutilization
Multi-floor building Wi-Fi Devices on different floors could transmit simultaneously 20-40% throughput loss
Factory floor WSN Sensors in different zones defer to each other 25-35% latency increase
Parking lot sensors Distant sensors wait for nearby transmissions 15-30% reduced spatial reuse

Why Exposed Terminals Matter Less Than Hidden Terminals:

Hidden Terminal:  CAUSES COLLISIONS β†’ data loss, retransmissions, wasted energy
                  Severity: HIGH (actual failures)

Exposed Terminal: REDUCES EFFICIENCY β†’ channel underutilization, higher latency
                  Severity: MEDIUM (performance degradation, not failures)

Engineering Priority:
1. Solve hidden terminals first (RTS/CTS)
2. Accept some exposed terminal inefficiency as acceptable trade-off
3. Use directional antennas or TDMA for mission-critical deployments

618.2.4.3 MAC Protocol Comparison: Handling Hidden/Exposed Terminals

MAC Protocol Hidden Terminal Solution Exposed Terminal Solution IoT Use Cases
CSMA/CA ❌ Poor (collisions common) ❌ Poor (spatial reuse limited) Wi-Fi, Zigbee (add RTS/CTS for improvements)
CSMA/CA + RTS/CTS βœ… Good (handshake prevents collisions) ❌ Poor (still defers unnecessarily) Dense Wi-Fi, industrial Zigbee
TDMA βœ… Excellent (no collisions, time slots) βœ… Excellent (spatial reuse via slot assignment) Cellular IoT, mission-critical WSN
ALOHA ❌ Terrible (no carrier sensing at all!) βœ… Good (transmits anytime β†’ spatial reuse) LoRaWAN (works due to sparse traffic)
FDMA βœ… Excellent (different frequencies) βœ… Excellent (simultaneous transmission) Cellular (frequency bands per user)

Real-World Mitigation Strategies:

Strategy 1: Network Planning (Design Phase)
- Site survey to identify hidden terminal zones
- Strategic AP/gateway placement to minimize coverage holes
- Use 5 GHz Wi-Fi (better wall penetration than 2.4 GHz for hidden terminals)

Strategy 2: Protocol Configuration (Deployment Phase)
- Enable RTS/CTS for networks with > 20 devices or physical obstacles
- Adjust CSMA/CA backoff parameters (increase contention window)
- Use mesh routing to provide multiple paths (avoids single collision point)

Strategy 3: Advanced Techniques (Enterprise IoT)
- Beamforming (directional antennas reduce hidden terminals)
- MU-MIMO (Wi-Fi 6) - simultaneous transmission to multiple devices
- TDMA scheduling for deterministic traffic (industrial IoT)
- Frequency hopping (Bluetooth) - collision on one channel doesn't affect others

Case Study: Wi-Fi Smart Factory Deployment

Initial Deployment (no RTS/CTS):
- 80 Wi-Fi sensors across factory floor
- Metal machinery creates hidden terminals
- Measured performance:
  * 45% packet loss during peak traffic
  * 3-5 second latency for critical alerts
  * 60% retransmission rate

After Enabling RTS/CTS + Network Redesign:
- RTS/CTS enabled on all APs
- Added 2 additional APs to reduce hidden terminal zones
- Mesh routing for redundancy
- Measured performance:
  * 5% packet loss (acceptable)
  * 200-500ms latency for alerts (excellent)
  * 8% retransmission rate (normal)

Cost: $2000 for 2 additional APs
Benefit: $50,000/year in reduced downtime from missed alerts

TDMA (Time Division Multiple Access): Used by: Cellular (GSM, LTE), some industrial WSN

Algorithm:
1. Coordinator assigns time slots to nodes
2. Each node transmits only in its slot
3. No collisions possible

Example: 10ms frame, 10 nodes
Node 1: 0-1ms
Node 2: 1-2ms
...
Node 10: 9-10ms
Repeat every 10ms

Pros:
+ No collisions β†’ predictable, high efficiency
+ Deterministic latency (max = frame duration)
+ Low power (sleep when not your slot)

Cons:
- Requires time synchronization (GPS, PTP)
- Coordinator needed (single point of failure)
- Wasted slots if node has no data
- Scalability issues (more nodes = longer frames)

Real performance (LTE):
- 50+ devices: 85-95% channel utilization (even with many devices)

ALOHA / Slotted ALOHA: Used by: LoRaWAN Class A, Sigfox

Pure ALOHA:
1. Transmit whenever you have data
2. If collision β†’ wait random time, retry
3. No carrier sensing

Slotted ALOHA:
1. Time divided into slots
2. Transmit only at slot boundaries
3. Still no carrier sensing

Throughput comparison:
Pure ALOHA:    Max 18% channel utilization (!)
Slotted ALOHA: Max 36% channel utilization
CSMA/CA:       Max 70-90% channel utilization
TDMA:          Max 85-95% channel utilization

Why use ALOHA for LoRaWAN?
+ Ultra-simple (no coordination, no synchronization)
+ Low power (no listening, just transmit)
+ Works for infrequent traffic (0.5% duty cycle)
+ Scales to 1000s of nodes (if traffic is sparse)

Choosing MAC Protocol for IoT:

Use Case Traffic Pattern Best MAC Why
Smart meter (1 msg/hour) Infrequent, periodic ALOHA (LoRaWAN) Simple, low power, scales well for sparse traffic
Industrial sensor (100 Hz) Frequent, deterministic TDMA Predictable latency, no collisions, mission-critical
Smart home devices Bursty, on-demand CSMA (Wi-Fi, Zigbee) Fair access, efficient for dynamic traffic
Real-time video Continuous, high-rate TDMA (LTE) Guaranteed bandwidth, low latency

618.2.5 MTU, MSS, and Fragmentation in Constrained Networks

Maximum Transmission Unit (MTU): Maximum packet size a network can carry without fragmentation.

Common MTU sizes:
Ethernet:     1500 bytes (most wired LANs)
Wi-Fi:         1500 bytes (matches Ethernet for compatibility)
6LoWPAN:      127 bytes (IEEE 802.15.4 frame size)
LoRaWAN:      51-242 bytes (depends on spreading factor and region)
NB-IoT:       1358 bytes
PPPoE:        1492 bytes (Ethernet 1500 - 8 for PPP header)

Maximum Segment Size (MSS): Maximum TCP payload size (MTU - IP header - TCP header).

MSS calculation:
Ethernet MSS = 1500 (MTU) - 20 (IPv4 header) - 20 (TCP header) = 1460 bytes

6LoWPAN MSS = 127 (MTU) - 40 (IPv6 header, compressed to 2-4) - 20 (TCP header)
            = ~63-85 bytes (tiny!)

Fragmentation Problem:

Scenario: HTTP request from 6LoWPAN sensor to cloud server

HTTP GET request size: 400 bytes
6LoWPAN MTU: 127 bytes
Required fragments: ceil(400 / 127) = 4 fragments

Fragment transmission:
- Fragment 1/4: 127 bytes
- Fragment 2/4: 127 bytes
- Fragment 3/4: 127 bytes
- Fragment 4/4: 19 bytes

If ANY fragment is lost β†’ ENTIRE datagram lost!
Packet loss: 5% per fragment
Success probability: (0.95)⁴ = 81.5%
Effective loss rate: 18.5% (!)

Compare to no fragmentation (single 127-byte packet):
Packet loss: 5%
Much better!

Mitigation Strategies:

  1. Path MTU Discovery: Discover smallest MTU along path

    Send packets with DF (Don't Fragment) bit set
    If too large β†’ get ICMP "Fragmentation Needed" error
    Reduce packet size and retry
  2. Application-level chunking: Send multiple small requests

    Instead of: 1Γ— 400-byte HTTP request
    Use:        4Γ— 100-byte HTTP requests (each fits in one 6LoWPAN frame)
  3. Protocol choice:

    Avoid TCP for constrained networks (large headers, fragmentation)
    Use CoAP (UDP-based, small headers, built-in chunking)

618.2.6 Quality of Service (QoS) for IoT Traffic Differentiation

Not all IoT data is equal - some requires priority handling.

DiffServ (Differentiated Services) Model:

IPv4/IPv6 packets have DSCP (Differentiated Services Code Point) field:

%%{init: {'theme': 'base', 'themeVariables': {'primaryColor': '#2C3E50', 'primaryTextColor': '#fff', 'primaryBorderColor': '#16A085', 'lineColor': '#16A085', 'secondaryColor': '#E67E22', 'tertiaryColor': '#7F8C8D'}}}%%
flowchart TD
    subgraph HEADER["IP Header"]
        subgraph TOS["Type of Service Byte"]
            DSCP["DSCP<br/>(6 bits)"]
            ECN["ECN<br/>(2 bits)"]
        end
    end

    DSCP --> D1["0x00 (0): Best Effort<br/>Default - regular IoT data"]
    DSCP --> D2["0x2E (46): Expedited Forwarding<br/>Low latency, low loss"]
    DSCP --> D3["0x0A (10): Assured Forwarding AF11<br/>Guaranteed minimum bandwidth"]

    style DSCP fill:#E67E22,stroke:#2C3E50,color:#fff
    style ECN fill:#16A085,stroke:#2C3E50,color:#fff
    style D1 fill:#7F8C8D,stroke:#2C3E50,color:#fff
    style D2 fill:#2C3E50,stroke:#16A085,color:#fff
    style D3 fill:#16A085,stroke:#2C3E50,color:#fff

Figure 618.5

IoT Traffic Classes:

Application Latency Requirement Loss Tolerance Suggested QoS
Fire alarm trigger <100ms 0% loss EF (highest priority)
Video surveillance <500ms 1-5% loss AF41 (high priority)
Temperature reading <5s 10% loss OK AF21 (medium priority)
Firmware update <1min 0% loss (use TCP retries) Best Effort (bulk)
Historical data sync <1hr 0% loss (use retries) Best Effort (lowest)

Real Implementation:

ESP32 example - marking CoAP packets for fire alarm:

// Set DSCP to EF (Expedited Forwarding) for fire alarm
int dscp = 0x2E << 2; // Shift left 2 bits for TOS field
setsockopt(sock, IPPROTO_IP, IP_TOS, &dscp, sizeof(dscp));

// Regular temperature reading uses default (Best Effort)

Router Configuration (Cisco example):

! Define class for IoT alarm traffic
class-map match-any IOT_ALARMS
 match dscp ef

! Define policy - guarantee 10% bandwidth, low latency queue
policy-map IOT_QOS
 class IOT_ALARMS
  priority percent 10

! Apply to WAN interface
interface GigabitEthernet0/0
 service-policy output IOT_QOS

Measured Impact:

Without QoS (fire alarm competes with firmware download):
- Alarm latency: 5-50 seconds (unacceptable!)
- Jitter: Β±20 seconds
- Occasional drops during congestion

With QoS (EF class for alarms):
- Alarm latency: 50-200ms (excellent)
- Jitter: Β±10ms
- Zero drops even during congestion

618.3 Summary

  • TCP congestion control interprets wireless packet loss as network congestion, causing severe throughput degradation on lossy IoT links
  • NAT allows IPv4 sharing but blocks inbound connections and creates complexity for peer-to-peer IoT
  • MAC protocols differ significantly: CSMA is fair but collision-prone; TDMA is deterministic but requires coordination; ALOHA is simple but low efficiency
  • Hidden terminals cause collisions that CSMA cannot detect - solve with RTS/CTS handshaking
  • QoS with DSCP marking ensures critical IoT traffic (alarms) gets priority over bulk transfers
  • Fragmentation increases effective loss rate - design for MTU constraints rather than fragmenting

618.4 What’s Next

Continue to the Labs chapter for hands-on network simulation exercises.