Bitcoind
bitcoind 是否在 P2P 協議中分別發送消息頭和有效負載?
我正在使用 TCP 連接到我的本地 bitcoind 並觀察到以下行為:
我看到許多消息只給出了標頭或僅附加了部分有效負載。當然,這也可能是我的程式碼的錯誤。
字節是分塊發送的嗎?以下哪項是有效的?
|header1|payload1| (as per documentation, this is valid) |header1| (no payload, even though required. Have seen this) |payload1| (no header, have seen this) |header1|partPayload1| (incomplete payload, not sure if seen these) |partPayload1| (part earlier header's payload, not sure if seen these) |header1|payload1|header2|payload2| |header1|payload1|header2|partPayload2| |header1|partPayload1|header2| |partPayload1|header2|payload2|
注意:我使用的是版本號 70002,relay = 1 和 services = 0。
編輯:通常我會等待剩餘的字節,並且大多數時候它們會到達,但在極少數情況下,大約 2% 會到達其他一些標頭。這只發生在
tx
消息中。EDIT2:根據下面的評論,我的程式碼中似乎存在錯誤。我會檢查並恢復。
EDIT3:是我的程式碼中的一個錯誤。我假設部分數據包對應於單個標頭。數據完成後(在同一個數據包中)可以有多個標頭。一旦我將其視為流,這是有道理的。
TCP 是一種流協議。即使在網路上,流是作為一系列 IP 消息送出的,但從語義上講,它只是一個字節流。
這意味著在應用程序級別您不應該關心消息邊界。路由器和其他網際網路基礎設施可以任意將數據拆分為數據包以適應其底層協議(例如乙太網的幀最多為 1500 字節)。