ソケットの so_reuseport と so_reuseaddr の違いについて詳しく説明します
次の記事では、ソケットの so_reuseport と so_reuseaddr の違いについて詳しく説明します。これは参考になるものであり、皆さんのお役に立てれば幸いです。一緒に見てみましょう
Socket の基本的な背景
これら 2 つのオプションの違いについて議論するとき、知っておく必要があるのは、BSD 実装がすべてのソケット実装の起源であるということです。基本的に他のすべてのシステムは、BSD ソケット実装 (または少なくともそのインターフェイス) をある程度参照し、その後独自の進化を開始しました。明らかに、BSD 自体は時間の経過とともに常に進化し、変化しています。したがって、後で BSD を参照するシステムには、以前に BSD を参照するシステムよりも多くの機能があります。したがって、BSD ソケット実装を理解することは、他のソケット実装を理解するための基礎となります。 BSD ソケットの実装を分析してみましょう。
その前に、まず TCP/UDP 接続を一意に識別する方法を理解する必要があります。 TCP/UDP は、次の 5 つのタプルによって一意に識別されます:
{<protocol>, <src addr>, <src port>, <dest addr>, <dest port>}
これらの値の一意の組み合わせにより、接続を一意に識別します。したがって、どのような接続においても、これら 5 つの値がまったく同じになることはありません。そうしないと、オペレーティング システムがこれらの接続を区別できなくなります。
ソケットのプロトコルは、socket()で初期化されるときに設定されます。送信元アドレスと送信元ポートは、bind() を呼び出すときに設定されます。宛先アドレスと宛先ポートは、connect() を呼び出すときに設定されます。 UDP はコネクションレス型であり、宛先ポートに接続しなくても UDP ソケットを使用できます。ただし、場合によっては、宛先アドレスとポートで接続を確立した後、UDP を使用することもできます。コネクションレス UDP を使用してデータを送信する場合、bind() が明示的に呼び出されない場合、初めてデータを送信するときに、システムは自動的に UDP ソケットをローカル アドレスと特定のポートにバインドします (そうしないと、プログラムは、によって応答されたデータを受け入れることができません)リモートホスト)。同様に、バインドされたアドレスのない TCP ソケットは、接続が確立されると自動的にローカル アドレスとポートにバインドされます。
ポートを手動でバインドする場合、ソケットをポート 0 にバインドできます。ポート 0 にバインドするということは、使用するポートをシステムに決定させることを意味します (通常は、事前に範囲が決定されたオペレーティング システム固有のポート番号のセットから)。任意のポートを意味します。同様に、ワイルドカードを使用して、どの送信元アドレスをバインドするかをシステムに決定させることもできます (ipv4 ワイルドカードは 0.0.0.0、ipv6 ワイルドカードは::)。ポートとは異なり、ソケットはホスト上のすべてのインターフェイスに対応する任意のアドレスにバインドできます。このソケットに接続されている宛先アドレスとルーティング テーブル内の対応する情報に基づいて、オペレーティング システムはこのソケットをバインドする適切なアドレスを選択し、このアドレスを使用して以前のワイルドカード IP アドレスを置き換えます。
デフォルトでは、2 つのソケットを同じ送信元アドレスと送信元ポートの組み合わせにバインドすることはできません。たとえば、socketA をアドレス A:X にバインドし、socketB をアドレス B:Y にバインドします。ここで、A と B は IP アドレス、X と Y はポートです。したがって、A==B の場合は X!=Y が満たされ、X==Y の場合は A!=B が満たされる必要があります。特定のソケットがワイルドカード IP アドレスにバインドされている場合、実際にはローカル マシンのすべての IP がシステムによってそのソケットにバインドされているとみなされることに注意してください。たとえば、ソケットは 0.0.0.0:21 にバインドされます。この場合、どの特定の IP アドレスが選択されても、他のソケットはポート 21 にバインドできなくなります。ワイルドカード IP0.0.0.0 はすべてのローカル IP と競合するためです。
上記はすべて、主要なオペレーティング システム間で基本的に同じです。各 SO_REUSEADDR は異なる意味を持ちます。まず、BSD 実装について説明します。 BSD は他のすべてのソケット実装メソッドのソースだからです。
BSD
SO_REUSEADDR
特定のアドレスとポートにバインドする前にソケットの SO_REUSEADDR 属性が設定されている場合、そのソケットがまったく同じソースアドレスに別のソケットにバインドしようとしない限り、それ以外の場合、ソケットはこのアドレス ポートのペアを正常にバインドできます。これは以前と同じように聞こえるかもしれません。しかし、そこにあるキーワードは完成しています。 SO_REUSEADDR は主に、システムがワイルドカード IP アドレスの競合を処理する方法を変更します。
SO_REUSEADDR が使用されていない場合、socketA を 0.0.0.0:21 にバインドすると、ローカル マシン上の他のソケットのポート 21 へのバインド (192.168.1.1:21 へのバインドなど) によって EADDRINUSE エラーが発生します。 0.0.0.0 はワイルドカード IP アドレス、つまり任意の IP アドレスを意味するため、このマシン上の他の IP アドレスはシステムによって占有されているとみなされます。 SO_REUSEADDR オプションが設定されている場合、0.0.0.0:21 と 192.168.1.1:21 はまったく同じアドレス ポート ペアではないため (そのうちの 1 つはワイルドカード IP アドレスで、もう 1 つはローカル マシンの特定の IP アドレスです)、このような結合は間違いなく成功することができます。ソケット A とソケット B が初期化される順序に関係なく、SO_REUSEADDR が設定されている限りバインディングは成功しますが、SO_REUSEADDR が設定されていない限りバインディングは成功しないことに注意してください。
以下の表は、考えられるいくつかのシナリオとその結果を示しています。 68 .1.1:21192.168.1.1:21
エラー (EADDRINUSE)
10.0.1.1:21 | OK | オン/オフ | |
---|---|---|---|
OK | オフ | 192.168.1.1:21 | |
エラー(EADDRINUSE) | オフ | 0.0.0.0:21 | |
エラー(耳鳴り) | ON | 192.168.1.1:21 | |
OK | ON | 0.0.0.0:21 | |
OK | オン/オフ | 0.0.0.0: 21 | |
OK |
以上がソケットの so_reuseport と so_reuseaddr の違いについて詳しく説明しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











このチュートリアルでは、Pythonを使用してZIPFの法則の統計的概念を処理する方法を示し、法律の処理時にPythonの読み取りおよび並べ替えの効率性を示します。 ZIPF分布という用語が何を意味するのか疑問に思うかもしれません。この用語を理解するには、まずZIPFの法律を定義する必要があります。心配しないでください、私は指示を簡素化しようとします。 ZIPFの法則 ZIPFの法則は単に意味します。大きな自然言語のコーパスでは、最も頻繁に発生する単語は、2番目の頻繁な単語のほぼ2倍の頻度で表示されます。 例を見てみましょう。アメリカ英語の茶色のコーパスを見ると、最も頻繁な言葉は「thであることに気付くでしょう。

この記事では、Pythonライブラリである美しいスープを使用してHTMLを解析する方法について説明します。 find()、find_all()、select()、およびget_text()などの一般的な方法は、データ抽出、多様なHTML構造とエラーの処理、および代替案(SEL

ノイズの多い画像を扱うことは、特に携帯電話や低解像度のカメラの写真でよくある問題です。 このチュートリアルでは、OpenCVを使用してPythonの画像フィルタリング手法を調査して、この問題に取り組みます。 画像フィルタリング:強力なツール 画像フィルター

PDFファイルは、クロスプラットフォームの互換性に人気があり、オペレーティングシステム、読み取りデバイス、ソフトウェア間でコンテンツとレイアウトが一貫しています。ただし、Python Plansing Plain Text Filesとは異なり、PDFファイルは、より複雑な構造を持つバイナリファイルであり、フォント、色、画像などの要素を含んでいます。 幸いなことに、Pythonの外部モジュールでPDFファイルを処理することは難しくありません。この記事では、PYPDF2モジュールを使用して、PDFファイルを開き、ページを印刷し、テキストを抽出する方法を示します。 PDFファイルの作成と編集については、私からの別のチュートリアルを参照してください。 準備 コアは、外部モジュールPYPDF2を使用することにあります。まず、PIPを使用してインストールします。 ピップはpです

このチュートリアルでは、Redisキャッシングを活用して、特にDjangoフレームワーク内でPythonアプリケーションのパフォーマンスを向上させる方法を示しています。 Redisのインストール、Django構成、およびパフォーマンスの比較をカバーして、Beneを強調します

この記事では、深い学習のためにTensorflowとPytorchを比較しています。 関連する手順、データの準備、モデルの構築、トレーニング、評価、展開について詳しく説明しています。 特に計算グラップに関して、フレームワーク間の重要な違い

データサイエンスと処理のお気に入りであるPythonは、高性能コンピューティングのための豊富なエコシステムを提供します。ただし、Pythonの並列プログラミングは、独自の課題を提示します。このチュートリアルでは、これらの課題を調査し、グローバルな承認に焦点を当てています

このチュートリアルでは、Python 3にカスタムパイプラインデータ構造を作成し、機能を強化するためにクラスとオペレーターのオーバーロードを活用していることを示しています。 パイプラインの柔軟性は、一連の機能をデータセットに適用する能力にあります。
