11

そのため、私は Boost::Asio (または単に Asio) を使用して多くの高性能ネットワーク プログラミングを行っており、TCP と UDP プロトコルの両方の本質をかなりしっかりと把握しています。私は自分の知識にもかかわらず、自分自身をネットワークの専門家とはまだ考えていないので、特に大規模なネットワークベースのパフォーマンスを押し上げようとしているネットワークプログラマーが知っておくべきことの要点を組み立てる良い方法は何ですか?アプリケーション?

プログラマーがメモリについて知っておくべきことに関する優れたエッセイがあります (以下を参照)。

すべてのプログラマーがメモリについて知っておくべきこと

4

1 に答える 1

14

あなたが知っておくべきことの私の頭の上からのいくつかの箇条書き:

  • TCP の仕組みと理由... 3 ウェイ ハンドシェイク、確認応答、遅延 ACK、ナグリング、スライディング ウィンドウ プロトコル。これらの機能にはそれぞれ明確な理由があります...そして、不適切に処理すると、アプリケーションのパフォーマンスを損なう可能性があります。
  • UDP マルチキャスト... 使用するつもりがなくても、システムを設計する際に知識に基づいた決定を下せるように、なぜそれが存在するのかを知る必要があります。
  • IP フラグメンテーション、および MTU の影響。
  • バイナリ シリアライゼーションとネットワーク バイト オーダー (Google プロト バッファを使用するだけの場合でも、それらが効率的である理由を理解しておくとよいでしょう)。
  • Ascii シリアライゼーションとメッセージ フレーミング ( \r\n\r\nHTTP での意味は?)
  • さまざまな I/O ディスパッチ モデル: Apache スタイルのプリフォーク、接続ごとのスレッド、イベント ベースのシングル スレッド、イベント ベースのワーカー スレッドなど。
  • ネットワーク化されたアプリにおけるバッファ オーバーフローの脆弱性の影響
  • APIまたはライブラリベースの設計とは対照的に、プロトコルベースの設計
  • 非同期プロトコルと同期プロトコル。多くの高性能システムは非同期です。パイプラインを使用しない限り、HTTP は同期です。その場合でも、可能なことには多くの制限があります。たとえば、順不同の応答はありません。

更新: プロトコルベースの設計とはどういう意味ですか?

Web のプロトコルである HTTP について考えてみましょう。Apache、IIS、Lighttpd、Firefox、Opera、WebKit など... これらのソフトウェアはすべて HTTP を話します。そのためのコードを共有している人がいない可能性は十分にあります。もちろん、欠点は、コードの正味量が原因でバグが発生する可能性が高くなることです。多くの利点があります。

  • 実装言語に関係なく、どのプログラムも HTTP 経由で通信できます。
  • 軽量/組み込み環境は、すべてを使用するのではなく、プロトコルのサブセットを選択して選択できます
  • 特定の状況に合わせてプロトコル ハンドラーを最適化することができます。一般性を犠牲にすることなくライブラリを最適化することはできません。
  • さまざまな実装が存在するため、ライブラリ プロバイダーはバグに対処する必要があります (誰もが同じライブラリを使用しているためにバグを吹き飛ばすのではなく)。
  • HTTP のユーザーには、組織上または契約上の負担はなく、ライセンス料もありません。

ネットワーク プロトコルを設計する場合、それぞれが特定のユース ケースに合わせて調整されたいくつかの API を独自に構築できます。または、それを構築することもできます。それはあなた次第です。ネットワーク化されたソフトウェア コンポーネントは、互いに独立してアップグレードできます。基本的に、Java/C# インターフェースと C++ 抽象クラスについてよく耳にすることはすべて、プログラミング言語層ではなくネットワーク層に適用されます。

于 2008-12-14T07:25:01.350 に答える