進階
Network Traffic
深入了解 Bitcoin Core 的網路流量管理,頻寬限制和流量監控。
10 分鐘
網路流量概覽
Bitcoin Core 作為全節點需要與網路中的其他節點交換區塊和交易數據。 了解和管理網路流量對於運行穩定的節點至關重要,尤其是在頻寬受限的環境中。
典型流量消耗
| 場景 | 上傳 | 下載 |
|---|---|---|
| 初始同步(IBD) | ~1 GB | ~500 GB |
| 正常運行(每天) | 5-20 GB | 200-500 MB |
| Blocks-only 模式 | 1-5 GB | 150-300 MB |
流量監控
# 查看網路流量統計
bitcoin-cli getnettotals
# 輸出示例
{
"totalbytesrecv": 1234567890,
"totalbytessent": 9876543210,
"timemillis": 1700000000000,
"uploadtarget": {
"timeframe": 86400,
"target": 0,
"target_reached": false,
"serve_historical_blocks": true,
"bytes_left_in_cycle": 0,
"time_left_in_cycle": 0
}
}
# 格式化輸出
bitcoin-cli getnettotals | jq '{
received_gb: (.totalbytesrecv / 1073741824),
sent_gb: (.totalbytessent / 1073741824)
}'
# 查看每個節點的流量
bitcoin-cli getpeerinfo | jq '.[] | {
addr,
bytessent: .bytessent,
bytesrecv: .bytesrecv,
connection_type
}' 上傳限制
# bitcoin.conf
# 設置每日上傳限制(MB)
# 0 = 無限制(預設)
maxuploadtarget=5000
# 效果:
# - 達到限制後,停止服務歷史區塊
# - 仍然中繼新區塊和交易
# - 24 小時後重置計數器 maxuploadtarget 工作原理:
┌─────────────────────────────────────────────────────────────┐
│ 24 小時週期 │
│ │
│ 上傳流量 │
│ ▲ │
│ │ ┌──────────────────────────│
│ │ /│ 達到限制後: │
│ │ / │ - 不服務歷史區塊 │
│ │ / │ - 繼續中繼新數據 │
│ │ / └──────────────────────────│
│ │ / │
│ │ limit ───────────────/─────────────────────────────────│
│ │ / │
│ │ / │
│ │ / │
│ │__________________/____________________________________________▶
│ 0 時間 24h │
│ │
│ 下一個週期:計數器重置 │
└─────────────────────────────────────────────────────────────┘ # 查看上傳限制狀態
bitcoin-cli getnettotals | jq '.uploadtarget'
# 輸出示例
{
"timeframe": 86400, # 24 小時
"target": 5242880000, # 5 GB in bytes
"target_reached": false,
"serve_historical_blocks": true,
"bytes_left_in_cycle": 3000000000,
"time_left_in_cycle": 43200 # 秒
} 減少流量
# bitcoin.conf - 低頻寬配置
# 減少連接數
maxconnections=20
# 設置上傳限制
maxuploadtarget=1000
# 只接收區塊,不中繼交易
blocksonly=1
# 減少出站連接
# (不推薦低於 8,影響安全性)
# 啟用 pruning(減少提供歷史區塊的能力)
prune=550
# 禁用 bloom filters 服務
peerbloomfilters=0
# 禁用 block filters 服務
peerblockfilters=0 低頻寬模式效果
- • 大幅減少上傳流量
- • 仍然完整驗證
- • 保持網路安全性
注意事項
- • 對網路貢獻減少
- • blocksonly 無法廣播交易
- • 可能影響閃電網路節點
連接類型與流量
不同連接類型的流量特性:
┌─────────────────────────────────────────────────────────────┐
│ 連接類型 │ 流量用途 │
├─────────────────────────────────────────────────────────────┤
│ outbound-full-relay │ 區塊 + 交易 + 地址 │
│ (8 個) │ 雙向流量最高 │
├─────────────────────────────────────────────────────────────┤
│ block-relay-only │ 只有區塊 │
│ (2 個) │ 流量較低,增強隱私 │
├─────────────────────────────────────────────────────────────┤
│ inbound │ 服務其他節點 │
│ (最多 117 個) │ 主要是上傳流量 │
├─────────────────────────────────────────────────────────────┤
│ feeler │ 測試地址 │
│ (短暫連接) │ 流量極低 │
└─────────────────────────────────────────────────────────────┘ # 按連接類型查看流量
bitcoin-cli getpeerinfo | jq 'group_by(.connection_type) | .[] | {
type: .[0].connection_type,
count: length,
total_sent: (map(.bytessent) | add),
total_recv: (map(.bytesrecv) | add)
}' 消息類型分析
# 查看消息類型統計(需要 debug=net)
grep "received:" ~/.bitcoin/debug.log | awk '{print $NF}' | sort | uniq -c | sort -rn
# 典型輸出
# 10000 inv
# 5000 tx
# 2000 getdata
# 1500 headers
# 1000 block
# 500 addr
# 200 ping
# 200 pong
# 主要流量來源:
# - block: 區塊數據(最大)
# - tx: 交易數據
# - inv: 庫存消息
# - getdata: 數據請求 IBD 優化
# bitcoin.conf - IBD 優化配置
# 增加數據庫緩存(加速驗證,減少重複讀取)
dbcache=4096
# 增加連接數以加速下載
maxconnections=50
# 禁用錢包(減少 I/O)
disablewallet=1
# IBD 期間不監聽入站連接
listen=0 # 監控 IBD 進度和流量
watch -n 10 'bitcoin-cli getblockchaininfo | jq "{
blocks: .blocks,
progress: .verificationprogress,
size_gb: (.size_on_disk / 1073741824)
}"'
# 同時監控網路流量
watch -n 10 'bitcoin-cli getnettotals | jq "{
recv_gb: (.totalbytesrecv / 1073741824),
sent_gb: (.totalbytessent / 1073741824)
}"' 外部監控工具
# 使用 iftop 監控實時流量
sudo iftop -i eth0 -f "port 8333"
# 使用 nethogs 按進程監控
sudo nethogs -p 8333
# 使用 vnstat 長期統計
vnstat -i eth0 -d # 每日統計
vnstat -i eth0 -m # 每月統計
# 使用 ss 查看連接
ss -tnp | grep bitcoind 總結
- ✓ 監控:使用 getnettotals 追蹤流量
- ✓ 限制:maxuploadtarget 控制每日上傳
- ✓ 低頻寬:blocksonly + 減少連接數
- ⚠ 平衡:減少流量可能影響網路貢獻
已複製連結