Satoshi Client Node Connectivity

提供: tezos-wiki
移動先: 案内検索


概要
[編集]

Satoshi Bitcoinクライアントは、作成を管理するスレッドを作成します。 他のノードへの接続。そのスレッドのコードは net.cppのThreadOpenConnections2という名前の関数です。

また、クライアントは新しいインバウンド接続の受け入れを処理し、 必要に応じてノードを切断する。 ThreadSocketHandler2は、net.cppにもあります。

接続を確立しているスレッドは他のアドレスを検出しません ノード。その情報はさまざまな方法で収集されます(記事 ノード発見時)。接続スレッドは、使用可能な 必要に応じて接続を行い、ノードを切断します。 それがすべてです。

ノードアドレスは、以下のルールセットに基づいて選択されます。

接続ルール[編集]

アウトバウンドの静的アドレス[編集]

ユーザーが-connectを使用してアドレスを指定した場合、ノードは それらのアドレスのみ。各ノードへの接続を確立しようとします。 そして、半分の時間スリープ状態にしてから、それをループで繰り返します シャットダウンまで。コードは、呼び出しによって接続を確立します。 OpenNetworkConnection(addr)。接続が既に開いている場合は、 OpenNetworkConnectionはただ返します。


ユーザが-nodeでアドレスを指定した場合、接続は これらのノードに(それぞれの間に0.5秒の遅れで)作られた 起動。これらの接続が試行されると、コードは進行します 通常の接続処理コードに変換します。


アウトバウンドの制限[編集]

接続処理コードは、シャットダウンまでさまざまな機能を実行する1つのループです。ループが最初に行うことはカウントです アウトバウンド接続の数、最大接続数 到達した場合(8回または-max回の接続)、2秒の遅延になります カウントが最大値を下回るまでループします。

接続の数が制限を下回っていると仮定すると、ノードは、 別のノードに接続します。次のセクションを参照してください。


シードノード[編集]

おそらく、ノードが他のアドレスを知ることができなかったならば、 これらのメソッドが失敗したため、ノードは内部リストを使用します ハードウェアにコード化されたハードコードされた320ノードのアドレス 既知のノードアドレスのリスト

可能であればシードノードから離れるコードがあります。推定 シードノードのオーバーロードを避けるためです。ローカルノードに 十分なアドレス(おそらくシードノードから学んだこと)、 接続スレッドはシードノード接続を閉じます。


アウトバウンドランダム選択[編集]

最初にコードはアドレスをa.bc.c. *バケットに入れます。 各24ビットネットマスクされたネットワークに接続されます。

次に、すべてのアドレスをループし、「準備完了」かどうかを判断します。 複雑な計算を使用して、すべてのアドレスのスコアを計算します。 スコアが最も高いアドレスが勝ち、OpenNetworkConnectionは それを求めた。その後、コードはスレッドのメインループを完了し、 続行する。

準備が整っているかどうかを判断するために、コードはIPと他のエントロピー 1〜3600の確定乱数に変換します。アドレス 非標準ポートを指定すると、2時間(7200)のペナルティがその番号に追加されます。 これは再試行間隔の調整番号です。

メインの再試行間隔は、基本的には最後に見た時間の平方根です 前の段落の「ランダム」調整を加えたものです。ノード 最後の1時間に表示されていますが、再試行間隔は 10分。次の表がコードに含まれています:

 //最後に見たベース再試行頻度  // <1時間10分  // 1時間1時間  // 4時間2時間  // 24時間5時間  // 48時間7時間  // 7日間13時間  // 30日27時間  // 90日間46時間  // 365日93時間

インターバルを計算した後、アドレスが既に連絡されている場合 その間隔は、アドレスはスキップされます。

住所が1日以上経過している場合は、それをスキップすることがあります。我々が成功すれば IRCアドレスを取得し、ノード接続がある場合は、 アドレス広告が実際にあればそれが表示されるという前提 アクティブ。

最後に、再試行の準備ができているように見えるすべてのアドレスについて、 最も長く連絡されていないアドレスは、最大 24時間しかし、ひねりがあります。スコアの計算は次のとおりです。  int64 nScore = min(nSinceLastTry、(int64)24 * 60 * 60) - nSinceLastSeen - nRandomizer; したがって、アドレスは最後に表示されてから1秒ごとにペナルティが課せられます( ランダム調整)。


インバウンドの受け入れと切断[編集]

クライアントは、新しいインバウンド接続の受け入れと切断を処理します。 ThreadSocketHandler2というスレッドで適切な場合はノードを、 これはnet.cppにあります。 ソケットスレッドは、ソケットを切断する単なるループです。 fDisconnectフラグがセットされている(空のバッファがある) "select"のすべてのソケットを準備し、 "select"を呼び出します。 「選択」は 一連のソケットでの活動を待つシステムコール。その呼び出しが返ってくると、ノードは新しい接続を受け取り、レディソケットを受信して​​送信し、fDisconnectフラグを使って切断するために非アクティブなソケットをマークします。ソケットが60秒間経過し、データを送受信していない場合、ソケットは切断されます。最後の90分間にデータを送受信しなかった場合、ソケットは切断されます。現在の受信データがバッファ制限を超えた場合、ソケットは切断されます。 (Search for:net.cppのif(nPos> ReceiveBufferSize()))現在の送信データがバッファ限界。 (net.cppのif(vSend.size()> SendBufferSize())[[Category:Developer] ] Category:技術