%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#2C3E50', 'primaryTextColor': '#fff', 'primaryBorderColor': '#16A085', 'lineColor': '#16A085', 'secondaryColor': '#E67E22', 'tertiaryColor': '#7F8C8D', 'fontSize': '14px'}}}%%
flowchart LR
subgraph UDP_PKT["UDP Packet (10-byte payload)"]
UDP_IP["IPv6: 6B<br/>(compressed)"]
UDP_H["UDP: 8B"]
UDP_P["Payload: 10B"]
UDP_IP --> UDP_H --> UDP_P
UDP_T["Total: 24B<br/>(58% overhead)"]
end
subgraph TCP_PKT["TCP Packet (10-byte payload)"]
TCP_HS["Handshake:<br/>78B"]
TCP_IP["IPv6: 6B<br/>(compressed)"]
TCP_H["TCP: 20B"]
TCP_P["Payload: 10B"]
TCP_A["ACK: 26B"]
TCP_TD["Teardown:<br/>104B"]
TCP_HS --> TCP_IP
TCP_IP --> TCP_H --> TCP_P --> TCP_A --> TCP_TD
TCP_T["Total: 244B<br/>(96% overhead)"]
end
subgraph DTLS_PKT["DTLS Packet (10-byte payload)"]
DTLS_IP["IPv6: 6B"]
DTLS_U["UDP: 8B"]
DTLS_R["DTLS Record: 13B"]
DTLS_E["Encrypted: 10B"]
DTLS_TAG["Auth Tag: 16B"]
DTLS_IP --> DTLS_U --> DTLS_R --> DTLS_E --> DTLS_TAG
DTLS_T["Total: 53B<br/>(81% overhead)"]
DTLS_HS["+ Initial Handshake:<br/>620B (amortized)"]
end
UDP_PKT --> COMPARE
TCP_PKT --> COMPARE
DTLS_PKT --> COMPARE
COMPARE["Efficiency Comparison<br/>ββββββββββββββ<br/>UDP: 24B β 1.3ms radio<br/>TCP: 244B β 13.3ms radio<br/>DTLS: 53B β 2.8ms radio<br/>ββββββββββββββ<br/>Energy Ratio (10s interval):<br/>UDP: 1Γ baseline<br/>TCP: 10Γ worse<br/>DTLS: 2Γ worse"]
style UDP_PKT fill:#16A085,stroke:#2C3E50,stroke-width:3px,color:#fff
style TCP_PKT fill:#E67E22,stroke:#2C3E50,stroke-width:3px,color:#fff
style DTLS_PKT fill:#7F8C8D,stroke:#2C3E50,stroke-width:3px,color:#fff
style COMPARE fill:#2C3E50,stroke:#16A085,stroke-width:3px,color:#fff
style UDP_IP fill:#1ABC9C,stroke:#2C3E50,stroke-width:1px,color:#fff
style UDP_H fill:#1ABC9C,stroke:#2C3E50,stroke-width:1px,color:#fff
style UDP_P fill:#27AE60,stroke:#2C3E50,stroke-width:2px,color:#fff
style UDP_T fill:#16A085,stroke:#2C3E50,stroke-width:2px,color:#fff
style TCP_HS fill:#D35400,stroke:#2C3E50,stroke-width:1px,color:#fff
style TCP_IP fill:#E67E22,stroke:#2C3E50,stroke-width:1px,color:#fff
style TCP_H fill:#E67E22,stroke:#2C3E50,stroke-width:1px,color:#fff
style TCP_P fill:#F39C12,stroke:#2C3E50,stroke-width:2px,color:#fff
style TCP_A fill:#E67E22,stroke:#2C3E50,stroke-width:1px,color:#fff
style TCP_TD fill:#D35400,stroke:#2C3E50,stroke-width:1px,color:#fff
style TCP_T fill:#E67E22,stroke:#2C3E50,stroke-width:2px,color:#fff
style DTLS_IP fill:#95A5A6,stroke:#2C3E50,stroke-width:1px,color:#fff
style DTLS_U fill:#95A5A6,stroke:#2C3E50,stroke-width:1px,color:#fff
style DTLS_R fill:#95A5A6,stroke:#2C3E50,stroke-width:1px,color:#fff
style DTLS_E fill:#BDC3C7,stroke:#2C3E50,stroke-width:2px,color:#000
style DTLS_TAG fill:#95A5A6,stroke:#2C3E50,stroke-width:1px,color:#fff
style DTLS_T fill:#7F8C8D,stroke:#2C3E50,stroke-width:2px,color:#fff
style DTLS_HS fill:#5D6D7E,stroke:#2C3E50,stroke-width:1px,color:#fff
756 Transport Review: Overhead and Battery Analysis
756.1 Learning Objectives
By the end of this chapter, you will be able to:
- Calculate protocol overhead: Analyze header sizes and total packet costs
- Compare efficiency: Evaluate UDP, TCP, and DTLS for small IoT payloads
- Estimate battery life: Calculate radio on-time and energy consumption
- Apply overhead analysis: Make data-driven protocol selection decisions
756.2 Prerequisites
Required Chapters:
- Transport Review: Protocol Selection - Protocol trade-offs
- Transport Fundamentals - TCP/UDP basics
Estimated Time: 25 minutes
756.3 Protocol Overhead Visualization
Protocol overhead comparison for 10-byte IoT payload showing packet structure and efficiency. UDP achieves 42% payload efficiency (24 bytes total: 6B compressed IPv6, 8B UDP header, 10B payload) with 58% overhead. TCP full connection consumes 244 bytes (96% overhead) including 78B handshake, 36B data packet, 26B ACK, and 104B teardownβdelivering only 4% payload efficiency. DTLS over UDP adds 53 bytes total (81% overhead) with 13B record header, 16B GCM authentication tag, plus amortized 620B initial handshake. Radio on-time at 250 kbps: UDP 1.3ms, TCP 13.3ms (10Γ worse), DTLS 2.8ms (2Γ worse). For battery-powered sensors transmitting every 10 seconds, UDP provides baseline energy consumption, while TCP consumes 10Γ more energy and DTLS 2Γ more. Protocol selection critically impacts battery life: UDP enables 45+ year deployments, TCP reduces to 8-9 years, DTLS achieves 20+ years with session resumption.
756.4 Overhead Comparison Table
| Protocol | Total Bytes | Payload Efficiency | Radio Time (250kbps) | Energy Ratio |
|---|---|---|---|---|
| UDP | 24 bytes | 42% | 1.3 ms | 1Γ baseline |
| TCP (full) | 244 bytes | 4% | 13.3 ms | 10Γ worse |
| DTLS | 53 bytes | 19% | 2.8 ms | 2Γ worse |
Key Insight: For a 10-byte sensor payload, TCP transmits 24Γ more data than the actual payload when including connection setup/teardown.
756.5 Battery Life Impact Comparison
%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#2C3E50', 'primaryTextColor': '#fff', 'primaryBorderColor': '#16A085', 'lineColor': '#16A085', 'secondaryColor': '#E67E22', 'tertiaryColor': '#7F8C8D', 'fontSize': '14px'}}}%%
graph TD
SCENARIO["Scenario: Environmental Sensor<br/>βββββββββββββββββββ<br/>Payload: 10 bytes temp/humidity<br/>Interval: 10 seconds<br/>Radio: 250 kbps, 5 mA TX<br/>Battery: 2000 mAh<br/>Target: 5 years minimum"]
subgraph UDP_LIFE["UDP Fire-and-Forget"]
UDP_PKT_SIZE["Packet: 24 bytes"]
UDP_RADIO["Radio on: 1.3 ms/transmission"]
UDP_DAILY["Daily: 11.2 sec active"]
UDP_ENERGY["Energy: 0.136 mAh/day"]
UDP_YEARS["Battery Life: 45.5 years β"]
UDP_PKT_SIZE --> UDP_RADIO --> UDP_DAILY --> UDP_ENERGY --> UDP_YEARS
end
subgraph TCP_LIFE["TCP Full Connection"]
TCP_PKT_SIZE["Packet: 244 bytes"]
TCP_RADIO["Radio on: 13.3 ms/transmission"]
TCP_DAILY["Daily: 115 sec active"]
TCP_ENERGY["Energy: 0.280 mAh/day"]
TCP_YEARS["Battery Life: 8.6 years"]
TCP_PKT_SIZE --> TCP_RADIO --> TCP_DAILY --> TCP_ENERGY --> TCP_YEARS
end
subgraph DTLS_LIFE["DTLS with Session Resumption"]
DTLS_PKT_SIZE["Packet: 53 bytes + resumption"]
DTLS_RADIO["Radio on: 2.8 ms/transmission"]
DTLS_DAILY["Daily: 24 sec active"]
DTLS_ENERGY["Energy: 0.160 mAh/day"]
DTLS_YEARS["Battery Life: 22.7 years β"]
DTLS_PKT_SIZE --> DTLS_RADIO --> DTLS_DAILY --> DTLS_ENERGY --> DTLS_YEARS
end
SCENARIO --> UDP_LIFE
SCENARIO --> TCP_LIFE
SCENARIO --> DTLS_LIFE
COMPARISON["Performance Comparison<br/>βββββββββββββββββββ<br/>UDP: 1.0Γ baseline (45.5 yrs)<br/>TCP: 5.3Γ worse (8.6 yrs)<br/>DTLS: 2.0Γ worse (22.7 yrs)<br/>βββββββββββββββββββ<br/>Decision: Use UDP for telemetry<br/>TCP fails 5-year target<br/>DTLS acceptable if security needed"]
UDP_LIFE --> COMPARISON
TCP_LIFE --> COMPARISON
DTLS_LIFE --> COMPARISON
style SCENARIO fill:#2C3E50,stroke:#16A085,stroke-width:3px,color:#fff
style UDP_LIFE fill:#16A085,stroke:#2C3E50,stroke-width:3px,color:#fff
style TCP_LIFE fill:#E67E22,stroke:#2C3E50,stroke-width:3px,color:#fff
style DTLS_LIFE fill:#7F8C8D,stroke:#2C3E50,stroke-width:3px,color:#fff
style COMPARISON fill:#2C3E50,stroke:#E67E22,stroke-width:3px,color:#fff
style UDP_PKT_SIZE fill:#1ABC9C,stroke:#2C3E50,stroke-width:1px,color:#fff
style UDP_RADIO fill:#1ABC9C,stroke:#2C3E50,stroke-width:1px,color:#fff
style UDP_DAILY fill:#1ABC9C,stroke:#2C3E50,stroke-width:1px,color:#fff
style UDP_ENERGY fill:#1ABC9C,stroke:#2C3E50,stroke-width:1px,color:#fff
style UDP_YEARS fill:#27AE60,stroke:#2C3E50,stroke-width:2px,color:#fff
style TCP_PKT_SIZE fill:#F39C12,stroke:#2C3E50,stroke-width:1px,color:#000
style TCP_RADIO fill:#F39C12,stroke:#2C3E50,stroke-width:1px,color:#000
style TCP_DAILY fill:#F39C12,stroke:#2C3E50,stroke-width:1px,color:#000
style TCP_ENERGY fill:#F39C12,stroke:#2C3E50,stroke-width:1px,color:#000
style TCP_YEARS fill:#C0392B,stroke:#2C3E50,stroke-width:2px,color:#fff
style DTLS_PKT_SIZE fill:#95A5A6,stroke:#2C3E50,stroke-width:1px,color:#fff
style DTLS_RADIO fill:#95A5A6,stroke:#2C3E50,stroke-width:1px,color:#fff
style DTLS_DAILY fill:#95A5A6,stroke:#2C3E50,stroke-width:1px,color:#fff
style DTLS_ENERGY fill:#95A5A6,stroke:#2C3E50,stroke-width:1px,color:#fff
style DTLS_YEARS fill:#16A085,stroke:#2C3E50,stroke-width:2px,color:#fff
Battery life comparison for transport protocols in environmental sensor deployment. Scenario: 10-byte temperature/humidity readings transmitted every 10 seconds over 250 kbps radio (5 mA TX current) from 2000 mAh battery, targeting 5-year minimum operation. UDP fire-and-forget delivers 45.5-year battery life: 24-byte packets require 1.3ms radio time per transmission (11.2 seconds daily active), consuming 0.136 mAh/dayβ5.3Γ better than TCP and exceeding target. TCP full connection achieves only 8.6 years: 244-byte packets (including handshake/teardown) require 13.3ms radio time (115 seconds daily active), consuming 0.280 mAh/dayβfailing the 5-year target due to 96% protocol overhead. DTLS with session resumption provides 22.7-year life: 53-byte packets plus amortized resumption handshake require 2.8ms radio time (24 seconds daily active), consuming 0.160 mAh/dayβacceptable security compromise at 2Γ UDP overhead. Performance ratios: UDP baseline (1.0Γ), TCP 5.3Γ worse, DTLS 2.0Γ worse. Protocol selection decision: use UDP for non-critical telemetry (45-year life), avoid TCP for frequent small transmissions (fails target), choose DTLS when security required (22-year compromise). Transmission frequency critically impacts battery: at 10-second intervals, protocol overhead dominates sleep current, making UDP essential for long deployments.
756.6 Detailed Power Budget Calculation
Scenario Parameters:
- Payload: 10 bytes temperature/humidity
- Interval: Every 10 seconds (8,640 transmissions/day)
- Radio: 250 kbps, 5 mA TX current
- Battery: 2000 mAh
- Target: 5 years minimum
756.6.1 UDP Calculation
Packet size: 24 bytes
TX time: 24 bytes / 31,250 bytes/s = 0.77 ms + 0.5 ms processing = 1.3 ms
Daily active: 8,640 Γ 1.3 ms = 11.2 seconds
Active energy: 5 mA Γ (11.2 / 3600) hours = 0.0156 mAh
Sleep energy: 5 Β΅A Γ (86,389 / 3600) hours = 0.1200 mAh
Total daily: 0.136 mAh
Battery life: 2000 / 0.136 = 45.5 years
756.6.2 TCP Calculation
Packet size: 244 bytes (including handshake/teardown)
TX time: 7.8 ms + 5 ms RX (ACKs) + 0.5 ms = 13.3 ms
Daily active: 8,640 Γ 13.3 ms = 115 seconds
Active energy: 5 mA Γ (115 / 3600) hours = 0.160 mAh
Sleep energy: 5 Β΅A Γ (86,285 / 3600) hours = 0.120 mAh
Total daily: 0.280 mAh
Battery life: 2000 / 0.280 = 8.6 years
756.6.3 DTLS Calculation (with Session Resumption)
Packet size: 53 bytes + amortized resumption
TX time: ~2.8 ms average
Daily active: 8,640 Γ 2.8 ms = 24 seconds
Active energy: 5 mA Γ (24 / 3600) hours = 0.033 mAh
Sleep energy: 5 Β΅A Γ (86,376 / 3600) hours = 0.120 mAh
Resumption overhead: ~7 mAh/day amortized
Total daily: 0.160 mAh
Battery life: 2000 / 0.160 = 22.7 years
756.7 Impact of Transmission Frequency
| Interval | UDP Life | TCP Life | Recommendation |
|---|---|---|---|
| 10 sec | 45 years | 8.6 years | UDP essential |
| 1 min | 45+ years | 35 years | UDP preferred |
| 5 min | 45+ years | 45+ years | Either works |
| 1 hour | 45+ years | 45+ years | TCP acceptable |
Key Insight: At infrequent transmission intervals (>5 min), sleep current dominates and protocol overhead becomes negligible. At frequent intervals (<1 min), protocol overhead dominates and UDP is essential.
756.8 Summary
Protocol overhead directly impacts battery life:
- UDP delivers 42% payload efficiency with 58% overhead - ideal for frequent transmissions
- TCP delivers only 4% payload efficiency with 96% overhead - avoid for small frequent messages
- DTLS delivers 19% efficiency with session resumption - acceptable for secure applications
- Transmission frequency determines whether protocol overhead matters
756.9 Whatβs Next
Continue exploring transport protocol analysis:
- Transport Review: DTLS Security: DTLS architecture and IoT security patterns
- Transport Review: Knowledge Check: Quiz questions to test your understanding
- DTLS and Security: Deep dive into DTLS implementation