
LinuxのTCP受け入れキューが先入れ先出しなのか、後入れ先出しなのか、それとも別のタイプのキューなのかを知りたいです。
異なる角度で同じ質問をしてください。accept()
接続がホストに到着するのと同じ順序で作成されますか?
答え1
引用するman 2 accept
:
保留中の接続キューから最初の接続要求を取得します。
したがって、先入先出原則が適用されます。「キュー」は実際にこう言います。;この用語は常にFIFOデータ構造を表します(郵便局のキューなどのサービスを受けるには、まずそこにある必要があります)。
接続がホストに到着する順序と同じですか?
接続が「到着」していない!これがまさにこの陳述の問題であり、曖昧さの根源である。
単純化された内容を見てみましょうTCPステータスマシンの表示:
寄稿者: スキル100,源泉、CC-BY-SA 3.0
これで、キューで誰が「最初」になるべきかを直感的に明確にすることはできません。つまり、SYNを受ける最初の人になります。 SYN-ACKを送信できる最初のターゲットは何ですか?それとも最初に確認を受けた人ですか?
しかし考えてみてください。accept
カーネルがソケットが何かを返す準備ができていることを知っている瞬間は、それを受け取った瞬間ですACK
。これが受け入れキューに挿入される順序です。
しかし、これは非常にランダムであることに注意してください。両端がSYN、SYN-ACKパケットにどれだけ早く応答するか、そしてこれらのパケットを送信するのにかかる時間に依存します。
通常、承認キューの最初のエントリが接続を開始した最初のクライアントであるとは考えられません。これは過去に多くのネットワークプロトコル設計者にとって問題であり、中継メッセージに接続するために複数の当事者が必要な状況で回避することが最も重要です(実際に後で接続されているノードに対してメッセージを保存する必要があるかどうかを知る方法はありません)。論理がなければならない)遅く参加する人質問)。
この回答歴史的な古典であり、おそらくあなたが知りたいものよりも多くの内部を持っているでしょう。