質問

いう UNIXネットワークプログラミング 1巻によるリチャード-スティーブンスする試み書TCPエコーのクライアントのTelnetプロトコルです。まだ初期の段階を書の読み取り/書き込みます。

書いていこうと思いなかで活用することができI/O多重化方式の選択機能が必要でマルチクライアントという取り組む学習C++のスレッドがいを学習しようとしている、バークレーのソケット図書館でも同時に行います。末のI/O多重スティーブンスは小さな部DOS攻撃がることにあるという方法にした企画用やDOS攻撃を受けるとき、これを単に送信するシングルバイトに接続後、それが掛かります。彼は述の3つの解決策、その後-nonblocking IOスレッド(out)のところ、タイムアウトのI/Oます。

私の質問は、他の方のを避けるような攻撃?なることが最良でしょうか。I振りむ上部にタイムアウトの操作などのように見えたしていきたいと思います。にあたるため、その見た目や聞こえの良さだ複雑なんなのかどうかを持っています。私だけに振りむの章NIOもなっているように見えますが、うがいがある場合その他の方法で周辺のこの前の宿探しのお得な情報満別カップルの時間に還による。

そのアイデア?

役に立ちましたか?

解決

...その他の方法を回避するような攻撃?

あり 非同期I/O 他の一般的なアプローチ.

お問い合わせの前にこのブロッキング read() 停止実行を無期限に、一般の対策とします。

  1. 複数のスレッドの実行

    マルチスレッド形式のマルチプロセスによるプロセスです。

  2. 時間制限にブロック操作

    例えば、瞬時(非ブロッキングI/O)又は(SO_RCVTIMEO, alarm(), 等)

  3. 非同期で動作し

    例えば、 aio_read

...るのが最良でしょうか。

のための新しい提案を非ブロッキングI/Oを組み合わせの時間制限 select()/poll().お申し込み可能かどうか追跡な接続が発生する"十分なデータ"(例えば、全体のライン)"を短くす。"

これは、主に携帯型と共通。

しかし、より良い答えは、"それはその時々です。" プラットフォームのサポートとしてより重要なこととして、デザインの影響から選択する評価はケースバイケースです。

他のヒント

となる見込み: のC10K問題

使用スレッド(プロセス)は接続するための非常に簡単なコードです。に制限はな接続数に制限の数のスレッドで快適に多い。

を用いた非同期IO入れるすべてのソケットを単一のスレッドがないので簡単なコードブッlibeventは、 libev2 もはるかにスケーラブル-その制限の数のファイルを扱うシステムにより可能になる操作、および-最近のlinuxの構築事例を用いた測定可能な単位百万!多くのwebサーバーやその他のサーバー使用の非同期IOいます。

しかし、サーバは有限な資源でき尽くし、さまざまnastier攻撃だけの容量を取扱います。

ファイアウォールや損害の制限などバックアップ、DMZsなどに不可欠な要素により、リアルインターネットに直面す。

あなただけのソケットプログラミングを学び始めたばかりしている場合は、

は、おそらくほうが良いでしょう ソケットの基本的な機能に集中し、まだセキュリティ問題についてあまり心配はありません。あなたは、いくつかのクライアント・サーバー・アプリケーションを書かれて、徹底的に彼らがどのように動作するかを理解したら、あなたは彼らがをどのように理解するために、より良い立場になるだろう破る

悪意のあるクライアントに対して、インターネット向けのネットワーク・アプリケーションをセキュアに全く些細なことではない、おそらくあなたが言及したすべての高度な技術を必要とし、その後いくつか! 例えば、それは、ルータやファイアウォールのレベルにアプリケーションコードからいくつかの責任を移動するのが一般的です。あなただけの信頼できるホストへのアクセスを制限する、または過度の接続試行とスロットルを検出したり、トラフィックがあなたのアプリケーションを打つ前に、それらをブロックすることができます。

私の質問は、他の方のを避けるような攻撃?

サーバの思いでタイマーのアプリケーションレベルの:

  • 入力データバッファに接続
  • ダムソケットの読み込みコードを読み込みデータからのソケットの入力バッファ
  • 用途別コードを解析し、コンテンツの入力バッファ

の応用-特定のコードを終了することができるものとの接続に伴う入力バッファーをすることが許されていイページへのアクセスにはログイ'長すぎると'.

これasynch I/Oまたは専用のI/Oスレッド[s].

これを助けるために私は、前に行っている(1997年ごろ:)マジックナンバーが、接続が閉じられた他の一定の時間内に送信されることを要求しました。

あなたが非同期接続を持っている場合は、

その後、ソケットがブロックされないだろう、とあなたは、有効なコマンドを送信していない現在の接続のリストをポーリングすることができ、スレッドを必要とし、もしメッセージwasnが20ms程度の後でしょう「Tは、その接続を閉じて、あなたがする必要がどのようなクリーンアップを行い、その後、それが有効なコマンドを示し受けています。

これは完璧ではありませんが、あなたの現在の懸念のためにそれを解決するのに役立ち、およびリソースがあまりにも多くの接続を行うことによって消費されないことを可能にする。

それはメインスレッドとクリーンアップのための第二のスレッドを必要としませんので、シングルスレッドではありませんので。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top