まず、「LISTENING」状態の TCP ソケットには 2 つの独立したキューがあることを理解する必要があります。
これら 2 つの用語は、「reqsk_queue」、「ACK バックログ」、「listen バックログ」、または「TCP バックログ」と呼ばれることもありますが、混乱を避けるためにこの記事では上記の 2 つの用語を使用します。 SYN キュー SYN キューには、SYN パケットを受信する接続が格納されます (カーネル コード構造 struct inet_request_sock に対応)。その役割は、SYN+ACK パケットに応答し、タイムアウトするまで ACK パケットが受信されない場合は再送信することです。 Linux では、再送信回数は次のようになります。
ドキュメントにおける tcp_synack_retries の説明は次のとおりです。
SYN+ACK を送信した後、SYN キューはクライアントから送信された ACK パケット (つまり、3 ウェイ ハンドシェイクの最後のパケット) を待機します。 ACK パケットを受信すると、まず対応する SYN キューが見つかり、次に対応する SYN キュー内の関連データが一致しているかどうかがチェックされます。一致した場合、カーネルは接続に関連するデータを SYN キューから削除し、完全な接続 (カーネル コード構造 struct inet_sock に対応) を作成し、この接続を Accept キューに追加します。 キューを受け入れる Accept キューには、確立された接続、つまり上位レベルのアプリケーションによって削除されるのを待機している接続が格納されます。プロセスが accept() を呼び出すと、ソケットはキューから取り出され、上位レベルのアプリケーションに渡されます。 これは、Linux が SYN パケットを処理する方法の簡単な説明です。ちなみに、ソケットで TCP_DEFER_ACCEPT と TCP_FASTOPEN が有効になっている場合、動作方法が若干異なりますが、この記事では紹介しません。 キューサイズの制限 アプリケーションは、listen(2) システムコールを呼び出して backlog パラメータを渡すことによって、SYN キューと Accept キューの最大サイズを設定します。たとえば、次に示すように、SYN キューと Accept キューの両方の最大サイズは 1024 に設定されています。 聞く(sfd, 1024) 4.3 より前のカーネルでは、SYN キューのサイズは別の方法で計算されることに注意してください。 SYN キューの最大サイズは以前は net.ipv4.tcp_max_syn_backlog を使用して設定されていましたが、現在は使用されなくなりました。現在、net.core.somaxconn は、SYN キューと Accept キューの両方の最大サイズを表すために使用されます。私たちのサーバーでは、これを 16k に設定しています。
上記の情報を知った後、適切なキューのサイズはどれくらいなのかと疑問に思うかもしれません。適切なキューのサイズはどれくらいですか? 答えは「それは場合による」です。ほとんどの TCP サービスでは、これはそれほど重要ではありません。たとえば、Go 言語バージョン 1.11 より前では、キュー サイズを設定するメソッドはありませんでした。 ただし、キューのサイズを増やす正当な理由がいくつかあります。
ただし、バックログを大きくしすぎると、SYN キューの各スロットにメモリが必要になるため、悪影響が出る可能性があります。 SYN フラッド攻撃に遭遇した場合、これらの攻撃パケットにリソースを浪費する必要はありません。 SYN キュー内の inet_request_sock 構造体は、4.14 カーネルではそれぞれ 256 バイトのメモリを占有します。 Linux では、SYN キューの現在のステータスを表示する場合、ss コマンドを使用して SYN-RECV 状態のソケットを照会できます。たとえば、次の実行結果は、ポート 80 の SYN キューに現在 119 個の要素があり、ポート 443 の SYN キューに 78 個の要素があることを示しています。
プログラムが accept() を十分な速さで呼び出さない場合はどうなるでしょうか?このデータはSystemTapスクリプトresq.stpでも確認できます。 プログラムが accept() を十分な速さで呼び出さない場合はどうなりますか?
このような状況が発生した場合、プログラムの処理パフォーマンスが後で正常に戻り、サーバーによって破棄されたパケットをクライアントが再送信することを期待するしかありません。 カーネルのこの動作は、ほとんどのサービスで許容されます。ちなみに、グローバルパラメータ net.ipv4.tcp_abort_on_overflow を調整することでこの動作を変更できますが、このパラメータは変更しない方がよいでしょう。 nstat のカウントを表示することで、Accept キューのオーバーフローの状態を観察できます。
しかし、これは世界全体の数です。観察するのは直感的ではありません。たとえば、成長していることが観察されることもありますが、すべてのサービス プログラムは正常であるように見えます。この時点で、ss コマンドを使用して、単一のリスニング ポートの Accept キュー サイズを観察できます。
Recv-Q 列には Accept キュー内のソケットの数が表示され、Send-Q にはキューの最大サイズが表示されます。上記の例では、プログラムによって accepted() されていないソケットはないことがわかりますが、ListenDrops カウントは増加していることがわかります。 これは、プログラムが処理を永久に停止するのではなく、短時間だけ停止して新しい接続を処理しないためです。しばらくすると、プログラムは正常に戻ります。この場合、ss コマンドを使用してこの現象を観察することは難しいため、カーネルにフックして破棄された SYN パケットを出力する SystemTap スクリプトを作成しました。 $ sudo stap -v acceptq.stp 時間 (us) acceptq qmax ローカルアドレス リモートアドレス 1495634198449075 1025 1024 0.0.0.0:6443 10.0.1.92:28585 1495634198449253 1025 1024 0.0.0.0:6443 10.0.1.92:50500 1495634198450062 1025 1024 0.0.0.0:6443 10.0.1.92:65434 ... 上記の操作により、どの SYN パケットが ListenDrops の影響を受けるかを観察できます。この方法では、どのプログラムが接続を失っているかを知ることもできます。 以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: HTML テーブルタグチュートリアル (32): セルの水平方向の配置属性 ALIGN
1. 原因: SQL ファイルをインポートする必要があるのですが、インポートできません。この文を実行...
インデックス定義: ディスク上に保存される個別のデータベース構造であり、データ テーブル内のすべての...
以前は、スクリプトは HTML 内のどこにでも配置できると思っていましたが、今日、要件に取り組んでい...
1. まずデータベースサーバーを停止しますサービスmysqld停止2.vim /etc/my.cnf...
証明書チェーンを生成するスクリプトを使用して、ルート証明書、中間証明書、および 3 つのクライアント...
これらの 3 つのタグを間違った方法で使用して、タイトルを表に沿わせたり、tbody の高さを固定し...
目次dnsmasq をインストールして設定するChinaDNS をインストールして設定するshado...
序文この記事では、docker-compose の構成をいくつか紹介します。これらを参考にして、独自...
MySQL のメンテナンスを容易にするために、エラー情報を収集するためのインターフェースを提供するス...
<br />英語アドレス: http://developer.yahoo.com/per...
最初のパラメータ渡し方法は、動的ルーティングパラメータ渡しです。リンクのパス属性を設定することで、ル...
環境要件: IPホスト名192.168.1.1ノード1プロジェクト計画:コンテナネットワークセグメン...
以下では、SQL クエリ ステートメントを使用して、Mysql データベース内のテーブルのテーブル名...
<br />記事と同様に、Web ページにも明確な段落と重要度の異なるタイトルが必要です...
画像をダウンロード docker プル mysql:5.7 docker pull php:7.2-...