跳至主要內容
進階

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 + 減少連接數
  • 平衡:減少流量可能影響網路貢獻
已複製連結
已複製到剪貼簿