MINI802.11SIM/
├── .vscode/
│ ├── settings.json
│ ├── tasks.json
├── include/ # 所有標頭檔(宣告 struct 與函數原型)
│ ├── station.h # STA 結構與相關函數宣告
│ ├── event.h # 事件佇列結構與操作函數宣告
│ └── logger.h # 模擬統計與 log 函數宣告
├── src/ # 程式主體原始碼
│ ├── main.c # 主模擬程式(tick-by-tick 控制流程)
│ ├── station.c # 各 STA 的狀態機與傳輸邏輯實作
│ ├── event.c # 事件佇列的增刪與排序實作
│ └── logger.c # 統計記錄與模擬輸出格式化
└── README.md
本實作為一個簡化的 Wi-Fi MAC 協定模擬器,主要模擬 IEEE 802.11 Distributed Coordination Function (DCF) 中的 CSMA/CA(Carrier Sense Multiple Access with Collision Avoidance) 機制。DCF 是目前 Wi-Fi 網路中最常見的傳輸控制機制。
在此模擬中,我們建構一個離散事件系統,模擬多個 STA(Station)在共享通道上進行封包傳輸、等待 DIFS、執行 Backoff、偵測碰撞、處理 ACK 等操作。雖然細節已簡化,但整體邏輯仍忠實反映 Wi-Fi 的核心媒體存取行為。
本模擬為一個以 C 語言撰寫之 IEEE 802.11 DCF (Distributed Coordination Function) 協定的 MAC 層簡化模擬器,支援:
- CSMA/CA 傳輸流程(含 DIFS, Backoff, SIFS, ACK 等)
- 多 STA 環境模擬與競爭機制
- 隨機新資料產生事件
- 模擬時間以 tick 為單位,逐 tick 處理傳送與事件行為
本模擬器可協助觀察各種環境參數對於 throughput、collision 等效能指標的影響。
Figure: State transition flowchart of a simulated STA in my CSMA/CA implementation
- Frame Tx Time : 3 ticks
- ACK Tx Time : 1 tick
- SIFS : 1 tick
- DIFS : 3 ticks
- Contention Window Min : 7
- Contention Window Max : 31
- MAX_RETRY : 5
- Total Tick Time : 100
- 每組參數模擬執行次數:3 次(取平均)
| Case | #STA | NewFrame% | Throughput | Collisions | Busy(%) | Idle(%) | Success/STA | Tx/STA | SuccessRate |
|---|---|---|---|---|---|---|---|---|---|
| Case A | 3 | 50% | 8.66 | 2.33 | 45.33% | 54.67% | 2.89 | 3.67 | 80.03% |
| Case B | 3 | 90% | 7.67 | 3.33 | 43.33% | 56.67% | 2.55 | 3.78 | 67.90% |
| Case C | 10 | 50% | 5.67 | 13.67 | 40.33% | 59.67% | 0.57 | 1.97 | 29.20% |
| Case D | 10 | 90% | 4.67 | 18.00 | 38.00% | 62.00% | 0.47 | 2.27 | 20.77% |
- Case A (3 STA, 50%) throughput 最高(8.66),顯示在低負載、小規模網路下,整體傳輸效率最佳,且碰撞機率低。
- Case B (3 STA, 90%) throughput 雖略降為 7.67,但仍維持良好水準,代表在小規模網路中,即使傳送需求高,也不會立即造成效能崩潰。
- Case C、D (10 STA) throughput 明顯下降,尤其是 Case D(4.67),表明大規模網路下,即便有更高的 frame 產生率,也無法補償因碰撞頻率過高所導致的效能損耗。
- 碰撞數從 Case A(2.33) 穩定地升高至 Case D(18.00),顯示隨著 STA 數增多,channel 競爭變得劇烈。
- 成功率(Success Rate)對應下降:
- Case A:80.03%
- Case D:20.77%
- 即便 Case D 的總傳送次數最多(22.7 次),但平均每次傳送成功的比例卻最低(僅 20.77%), 顯示在高密度 + 高流量下,碰撞損失非常嚴重,多數傳送都沒有成果。
- Busy Tick 比例 最高為 Case A(45.33%),表示小規模網路中的傳送行為較集中、頻率穩定。
- Case D 反而 Busy Tick 降至 38.00%,說明傳送雖多,但碰撞造成了大量「無效佔用」與時間浪費。
- ✅ 正確實作 DIFS → Backoff → TX → SIFS → ACK
- ✅ 傳送需等待媒介 idle 並倒數 DIFS
- ✅ 失敗會重傳並調整 contention window
- ✅ 傳送後會依據是否收到 ACK 進行流程切換
- ✅ Slot-based 倒數與碰撞處理皆符規範
- RTS/CTS 避免 hidden node 問題
- 支援多通道與多基地台
- 模擬 PIFS 與 PCF 模式
- 實作 queue buffer 模型(非單一封包)
- 整合 throughput/collision 隨時間變化圖表
- 視覺化模擬
- 模擬更細緻時間單位與干擾(noise)
- 加入距離衰減、傳輸速率變動等物理層參數
本實作已提供 VS Code 的建置設定,使用者只需以下步驟即可執行模擬器:
- 下載並開啟本實作於 VS Code
- 按下
Ctrl + Shift + B- VS Code 將自動呼叫
tasks.json中的gcc編譯指令,將所有程式編譯成wifi_sim執行檔。
- VS Code 將自動呼叫
- 在終端機執行:
./wifi_sim
[0] STA 0 enter DIFS (wait 3)
[0] STA 1 enter DIFS (wait 3)
[0] STA 2 enter DIFS (wait 3)
[3] STA 0 starts BACKOFF (retry = 0, slot = 2)
[3] STA 1 starts TRANSMIT (retry = 0, slot = 0)
[3] STA 2 starts BACKOFF (retry = 0, slot = 2)
[6] Receiver got frame from STA 1, wait SIFS (1 tick) resend ACK
[8] STA 1 received ACK successfully!
[8] STA 0 enter DIFS (wait 3)
[8] STA 2 enter DIFS (wait 3)
[9] STA 1 has a new frame to send
[9] STA 1 enter DIFS (wait 3)
[11] STA 0 resumes BACKOFF (slot = 2)
[11] STA 2 resumes BACKOFF (slot = 2)
[12] STA 1 starts BACKOFF (retry = 0, slot = 7)
[13] STA 0 starts TRANSMIT
[13] STA 2 starts TRANSMIT
STA 0 COLLISION!!!
STA 2 COLLISION!!!
[16] STA 1 enter DIFS (wait 3)
[18] STA 0 enter DIFS (wait 3)
[18] STA 2 enter DIFS (wait 3)
[19] STA 1 resumes BACKOFF (slot = 6)
[21] STA 0 starts BACKOFF (retry = 1, slot = 10)
[21] STA 2 starts BACKOFF (retry = 1, slot = 11)
[25] STA 1 starts TRANSMIT
...
===== Simulation Summary =====
Simulation Parameters:
- Total STA : 3
- Total Tick Time : 100
- New Frame Prob (%) : 50
...
Aggregate Results:
- Total throughput : 8
- Total collisions : 2
- Total busy ticks : 46 (46.00%)
- Total idle ticks : 54 (54.00%)
- Overall success rate : 72.7%
==============================
