高級
P2P 協議概覽
了解比特幣節點之間的點對點通訊協議,包括握手流程和連線類型。
18 分鐘
P2P 網路架構
比特幣使用去中心化的點對點(P2P)網路架構。每個節點都是平等的, 沒有「伺服器」和「客戶端」之分。節點之間直接通訊,交換區塊和交易。
~17,000
可達節點
8333
預設端口 (mainnet)
125
預設最大連線數
連線握手
當兩個節點建立連線時,需要進行握手交換版本信息:
節點 A 節點 B │ │ │──────── version ─────────────>│ A 發送版本訊息 │ │ │<──────── version ─────────────│ B 發送版本訊息 │ │ │──────── verack ──────────────>│ A 確認 B 的版本 │ │ │<──────── verack ──────────────│ B 確認 A 的版本 │ │ │ [握手完成,開始通訊] │
Version 訊息內容
| 欄位 | 說明 |
|---|---|
| version | 協議版本號(如 70016) |
| services | 支援的服務標誌 |
| timestamp | Unix 時間戳 |
| addr_recv | 接收方地址 |
| addr_from | 發送方地址 |
| nonce | 隨機數(防止自連) |
| user_agent | 軟體標識(如 /Satoshi:26.0.0/) |
| start_height | 節點的區塊高度 |
| relay | 是否中繼交易 |
連線類型
Bitcoin Core 區分不同類型的連線,以優化網路效能和安全性:
Outbound Full-Relay (8 個)
節點主動發起的連線,接收區塊和交易。這些連線最受信任。
Outbound Block-Relay-Only (2 個)
只同步區塊,不中繼交易。提供額外的區塊來源,增加抗審查能力。
Inbound (最多 115 個)
其他節點發起的連線。需要更謹慎處理,因為可能是攻擊者。
Feeler (短暫)
短暫連線,測試潛在節點是否可達,用於維護地址庫。
服務標誌 (Services)
| 標誌 | 值 | 說明 |
|---|---|---|
| NODE_NETWORK | 1 | 完整區塊鏈節點 |
| NODE_WITNESS | 8 | 支援 SegWit |
| NODE_COMPACT_FILTERS | 64 | 支援 BIP-157 區塊過濾器 |
| NODE_NETWORK_LIMITED | 1024 | 修剪節點(最近 288 區塊) |
| NODE_P2P_V2 | 2048 | 支援 BIP-324 加密傳輸 |
BIP-324:加密傳輸 (v2)
BIP-324 引入了加密的 P2P 傳輸協議,解決了傳統明文傳輸的隱私問題:
v1 (傳統) 問題
- • 所有流量明文傳輸
- • ISP 可識別比特幣流量
- • 中間人攻擊風險
- • 交易可被監控
v2 (BIP-324) 優點
- • ChaCha20-Poly1305 加密
- • 流量不可識別
- • 防止被動監聽
- • 可選的認證握手
v2 握手流程
1. 發起方發送 64 bytes 橢圓曲線公鑰 2. 響應方發送 64 bytes 橢圓曲線公鑰 3. 雙方使用 ECDH 計算共享金鑰 4. 之後所有通訊都加密
訊息格式
v1 訊息結構
┌──────────────────────────────────────────┐ │ Header (24 bytes) │ ├──────────────────────────────────────────┤ │ magic │ 4 bytes │ 網路識別符 │ │ command │ 12 bytes │ 訊息類型 │ │ length │ 4 bytes │ payload 長度 │ │ checksum │ 4 bytes │ payload 校驗和 │ ├──────────────────────────────────────────┤ │ Payload (variable) │ │ 訊息內容 │ └──────────────────────────────────────────┘
Magic 值
| 網路 | Magic 值 |
|---|---|
| Mainnet | 0xD9B4BEF9 |
| Testnet3 | 0x0709110B |
| Signet | 0x40CF030A |
| Regtest | 0xDAB5BFFA |
延伸閱讀: 查看 訊息類型 了解各種 P2P 訊息的詳細格式。
已複製連結