すべての Linux ネットワーク インターフェイスには、いわゆる qdis があります。 (キューイング規律)に添付されています。質問に対する答えは、使用している qdisc によって異なります。 pfifo や bfifo などの一部のキューイング規則には、優先度の概念がありません。したがって、それらが使用されている場合、答えは簡単です - 優先順位付けはありません
ただし、pfifo_fast (通常は Linux のデフォルトの qdisc) などの優先順位付けされた qdisc では、ソケットの優先順位が影響を与える可能性があります。
この画像は、pfifo_fast qdisc で何が起こっているかを説明しています:
優先度に応じてパケットがキューに配置されていることがわかります。インターフェイスが次のパケット (frame) を送信するとき 実際には、それには入りません)、常に最高の優先度でパケットを送信することを選択します。つまり、複数のパケットが待機している場合、優先度が最も高いパケットが最初に送信されます .これには、インターフェースが輻輳している必要があることに注意してください。インターフェースが輻輳しておらず、パケットが OS から到着するとすぐに送信される場合、キューイングは行われないため、優先順位付けは行われません。
他の qdisc には、異なる構造とポリシーがあります。たとえば、SFQ qdisc:
それを念頭に置いて、質問に戻りましょう:
<オール>
qdisc によっては、はい、socket_11
からのパケット 他のソケットからのパケットより先に送信される場合があります。 pfifo_fast
の場合 が使用され、 socket_11
の場合 アウトバウンド ネットワーク インターフェイスを飽和させるのに十分なトラフィックを送信すると、他のソケットからのパケットがまったく送信されないことさえあります。ワイヤレス インターフェイスでない限り、他のリソースを飽和させる前にネットワーク インターフェイスを飽和させることは通常難しいため、これは実際にはありそうにありません。
マシンのネットワーク インターフェイスからソケットまでのパケットの経路は、ネットワーク自体よりもはるかに高速です。そして、覚えているように、優先順位付けが効果を発揮するには、輻輳が必要です。典型的なシナリオでは、ネットワーク インターフェースまで到達したパケットは、ネットワーク上の移動のボトルネックをすでに通過しているため、輻輳は発生しません。
もちろん、ingress qdisc やその他のメカニズムを使用して人為的にボトルネックを作成し、着信トラフィックに優先順位を付けることができます。しかし、なぜですか?これは、トラフィック シェーパーまたは同様のネットワーク デバイスを構築している場合にのみ意味があります。さらに、この qdisc は (ブリッジングまたはルーティングの前であっても) 高レベルのソケットのかなり下で発生する低レベルのメカニズムであるため、ソケットの優先度が in に影響を与える可能性があるとは思えません。
私が知っていることではありませんが、私は喜んで学びます。このカーネル モジュールはかなり近いですが、優先度フラグを表示できず、通常のソケット オプションのみを表示できるようです。
質問への回答:
<オール>1 に関する詳細
優先順位、ネットワーク キュー、およびデバイス規則に関するいくつかの言葉。これらはすべて、サービスの品質、特に差別化サービス (DiffServ) に関連しています。
パケットが送信されると、ネットワーク デバイスによって処理されるインターフェイス「キュー」に入れられます。デフォルトでは、キューは実際のキューではなく、強く優先される 3 つの実際の fifo です。 fifo1 のパケット待ちよりも fifo0 のパケットがある場合。ソケットの優先度は、次のマッピングによってこの fifo にマッピングされます:
- 0 (ベスト エフォート) は fifo1 です
- 1-3 (フィラー、バルクなど) は fifo2 です
- 4 は fifo1 です
- 5 は fifo2 です
- 6-7 (インタラクティブ、コントロール) は fifo0
- 8-15 は fifo1 です
したがって、優先度 1 は優先度 0 の後にディスパッチされます。
デフォルトの動作を変更するには、「トラフィック制御」(tc) ユーティリティを使用します。それを使用すると、ネットワーク インターフェイスで優先キューを構成できます。これは、いわゆる「デバイス キューイング規則」です。特定のネットワーク デバイスによって優先順位がどのように提供されるかを定義できます (Malt の回答には、これに関する適切な説明があります)。
2 についての詳細
ソケットには「読み取り準備完了」/「読み取り準備ができていません」という状態があり、これは bool です。準備ができていないソケットにデータが到着すると、状態が「準備ができていない」から「準備ができている」に変わります。これは、select/poll などの関数によって、またはブロックされた recv 呼び出しから戻ることによって見られます。どのスレッドが起動されるかは、ソケットの優先度ではなく、スレッドの優先度によって異なります。
したがって、必要なソケットに優先順位を付けたい場合は
- 優先度の高いスレッドに入れる
- または、select/poll の後にコードで優先順位を付ける