この記事は Rust Web Pattern の一部であり、reduce back を作成していません。 eブック内にあること。
ウェブキャリアのペアについて話すとき、私たちは、もはや合計で余分に、特定の IP をリッスンし、ポートを処理して HTTP メッセージに応答するデプロイされたコードを指摘します。 さまざまな人との会話に関連して、2 人を熱望する多くのステップがあります。 ユーティリティ開発者は主に、この方向の 2 つのオブジェクトに直面しています: TCP と HTTP. TCP は、2 つの当事者が接続を確立するためにつぶやくプロトコルです。 彼らは、特定のパターン (3 リーチ ハンドシェイク) を実践して、短いメッセージを送受信し、接続の詳細を交換します。 この接続を確立すると、多くの誕生日のお祝いに HTTP メッセージを送受信できるようになります。 HTTP は、すべての要求に対して応答を要求するステートレス プロトコルであり、さまざまな代替選択肢に加えて、送信する詳細の規模と構造を定義します。 TCP を使用した言葉による代用がどの程度正確に機能し、どのように HTTP が追加されるかを明らかにすることで、莫大な利益が得られる可能性があります。 このデータがあれば、サーバー アプリケーションのパフォーマンスを改善し、安定性を高めることができます。 なんらかの理由で、TCP または HTTP 以外のさまざまなプロトコルを購入する必要がある場合は、それを交換する方法についての知識とヒントを知っています。TCP対UDP
TCP は、いわゆる 3 リーチ ハンドシェイクを介して接続の作成を開始する接続指向のプロトコルです。 適切な範囲内でパケットを送信することを確認し、多くの側で失敗した場合は再送信を試みます。 このため、TCP ヘッダーは大きく (20 バイト) あり、UDP をつぶやく可能性があるため、合計方向が遅くなります。
UDPパケット ヘッダーは小さく (8 バイト)、プロトコル内に統合された適切な接続の作成として、この形式のものはありません。 パケットのフリルはもはや保護されておらず、1 つのメッセージが近くに失敗した場合、組み込みの再試行としてこの形式のものはありません。
アプリケーションの空想的な在庫割り当てまたはストリーミング サービス、ゲーム サーバー、または気候アプリケーションの UDP をつぶやく可能性があります。 場合によっては、合計で余分なデータを再送信する可能性があります。また、持ち上げると同時に、再試行メカニズムを有効にする必要があります。 さらに、データは急速に古くなり、同じ精巧な内部のすべてのパケットを気にしなくなったり、偏りがなくなったりする可能性があります。 さらに、UDP は複数のホストにブロードキャストできますが、TCP は継続的に単一のコンシューマー サーバー接続です。 持ち上げると同時に TCP を消費して、公式のデータ転送を吸収します。 例として、銀行のアプリケーションや電子商取引では、リーチに沿って平和なデータを失う必要がないか、消費者とサーバーの間の叫び声について話す必要があります。 さびとOSIマネキン
Web サービスは、Web に接続されたコンピューター プログラムに展開されます。 これらのコンピューター プログラムは、新しいメッセージをリッスンする IP アドレスと出生ポートを吸収します。 これらのマシンで実行されている目的は、特定のメッセージに関心を示しているため、これらを指示して解決します.
OSI マネキンCommence Systems Interconnection (OSI) マネキンは、A からB離れて。 サーバーから消費者に送信されたバイトは、ラップトップ自体を経由して、さまざまなルーターや、より大きなエンドポイントに接続されている物理的なワイヤに到達します。
OSI マネキンは、視覚化に役立ちます。ステージはバイトの送信に取りつかれ、さまざまなレイヤーのメソッドに取りつかれている成分をグループ化します。 マネキン内に記述されているレイヤーは、物理 (1)、ファイル リンク (2)、ネットワーク (3)、トランスポート (4)、セッション (5)、プレゼンテーション (6)、ユーティリティ (7) です。
サーバーに送信されたメッセージは、複数のレイヤーと地理的にさまざまな場所を通過する必要があります。それを近くに。 これらのさまざまなレイヤーの次の作業をキャッチするために、OSI マネキンが作成されました。 通信を標準化するための概念的なフレームワークとは少し離れています.サーバーに。 適切なサーバーを取得するために、多くのさまざまなルーターを通過することを望んでいます。 間違った場所をキャッチしないように、ユーザー アプリケーションとカーネルはいくつかのヘッダーと並んで配置されているため、言語置換方向のすべてのレイヤーは、ルーティング先のプットを認識しています。

パケットはこれらのさまざまなほとんどすべてのレイヤーが上部にさらにヘッダーを追加するため、次のレイヤーは詳細を処理する方法に関するヒントを認識しています. アプリケーションは、カーネルが TCP、IP、およびイーサネット ヘッダーを追加するよりも早く、送信したい詳細の上に HTTP ヘッダーを追加します。
受信サーバーはと同じ方向を通りますが、逆です。 内部の詳細を読み取れるようになるまで、すべてのヘッダーを解体する必要があります。
追加されたヘッダーのサイズは標準化されているため、実行中の描画とカーネルは、詳細を読み取るまでに取り除かなければならないバイト数を認識しています。 このデータをつぶやいて、受け取ったデータを次に把握するオプションを提供します。
前述の OSI 概要図では、イーサネットと IP ヘッダーは美しく交渉不可能です。 ただし、他のすべての部分は調整で追加されます。 たとえば、UDP を TCP の 1 つとして購入し、get プロトコルを HTTP のもう 1 つとして購入するオプションを提供します。 たとえば、セキュリティ上の理由を吸収して get プロトコル (get ヘッダー ディメンションを使用) を有効にするオプションを提供します。これにより、メッセージを調べている侵入者はそれらを理解できなくなります。
Rust はどこで活躍するのですか? Web キャリアは、接続の発明、メッセージの受信、および応答の送信に関連して、次のメカニズムを提供する必要があります:
他の 1 つのコンシューマーへの接続を開く 多くのレイヤー (TCP および HTTP) をサポートします サポート接続 受信メッセージの解析 実際の HTTP メッセージを送信する
多くのさまざまなプログラミング言語には、豊富な典型的なライブラリが含まれています。これらの HTTP サーバーを発明します。 さびはまた少し異なります。 システム プログラミング言語である Rust は、考えられる限り小さなものであり、さらに、友人と HTTP を介して継続的に話をしなければならないマイクロ コントローラー上で適切に機能することを望んでいます。
したがって、Rust は事実に基づいて、異常なライブラリ内に TCP の頻繁な作業を含めることを決定しました。 青色のコンポーネント (TCP/IP) は、Rust の典型的なライブラリ内に統合されています。 HTTP をサポートする Web サーバーを開発する必要がある場合でも、get を開発する可能性があります。 ありがたいことに、ここに全体的なシナリオがあるので、近所の人はすでにいくつかの戦闘テスト済みの Web サーバー実装を以前のバージョンで構築しています。 たとえば、crate hyper は、http サーバーとして広く使用されています。
Rust crates
Rustでは外部ライブラリやプログラムを「クレート」と呼びます。 それらは crates.io と呼ばれる Web ポジションでホストされており、Rust ミッションがコンパイルしたものを公平かつ穏やかに取得できます。 場合によっては、Cargo.toml ファイル内の Rust ミッションにクレートを追加することもできます。ターミナルで貨物製造または貨物ローミング ティーチのつぶやきの後、新しく追加されたクレートがダウンロードされ、ローカル ミッションに追加されます。
さらに、Web フレームワーク用のクレートがあり、その下に全レイヤー (HTTP、 TCP やその他多数) を提供し、URL の質問パラメーターを解析し、JSON などを調査して返すなど、現代の人間工学に基づいた全体的な機能を提供します
これはさらに、より大きな代替品を提示します: 1 つのことを行う前例のない肥大化なしでアプリケーション サーバーを機能させることができれば、必要ないくつかの機能を手動で発明し、後で軽量のソリューションを吸収できる可能性があります。
Hunch、NodeJS、または Java から来ている可能性がある場合でも、この方法は立場の転換です。 近所の人に手を貸すことを考えずに、もう1マイル行くには、生まれてからのあなたの欲求を助ける図書館を精査する必要があります.
HTTP で起動するには、さらに、コンシューマーとサーバー間の接続が安定していることを確認する必要があります。 ここでは、SSL の後継である TLS (Transport Layer Security) で対処します。 さらに、Rust には組み込みの TLS が役立ちませんが、アプリケーションで TLS を有効にするのに役立つ一対のプログラムが存在します。
接続を開く
Rustで書かれたWebキャリアにブラウザアプリケーションがHTTPデマンドを送信している例を考察します。 カーネルに近いバイトがどれだけ正確であるか、およびRustアプリケーションが実行中のアプリケーションに配信されたバイトをどのように取得しているかをすばやく調べるオプションを提供します。 ここでは、ライブラリを介してすべてが抽象化されていることを伝えますが、しばらくすると、そのようなライブラリについてつぶやくのではなく、Rust コア ライブラリ自体を介して 1 つのことを有効にすることができます。
起動するには、Web キャリアのバイトのフロートがどの程度正確に機能するかを知るか、少なくとも心に留めておくと効果的です。実行中のアプリケーションでしばらくの間、バグ、ボトルネック、およびさまざまな設定ミスを設定します。
パトロンが HTTP 要求を送信すると、カーネルは詳細をキットにラップします。それに接続された HTTP および TCP ヘッダー。 いわゆる NIC (コミュニティ インターフェイス カード) でサーバーに到着します。 コンシューマーはまず、サーバーに TCP 接続を確立する必要があります。 実行するとすぐに、私たちのカーネルは受信メッセージを処理するソケットを開きました。ネットワーキングのカーネル側については、Beej’s Files to Network Programming
を強く指摘します。 .

RustでWebサーバーをローミングするとき、さらにソケットを実行中のドロー側に吸収し、着信をリッスンする位置に置きますメッセージ。 カーネルの仕事は、着信 TCP メッセージの詳細を内部ソケットに繰り返し、新しいデータが到着したときに通知することです。そして、どの TCP 接続 (IP take care と port) が説明されているかを把握し、対応するソケットのように見え、詳細を受信バッファーにコピーします
新しいデータをリッスンしているメソッドにこのソケットに通知し、メソッドが関心を示したら、詳細を新しいバッファにコピーします。 サーバーアプリケーションがカーネルからプログラムにバイトをキャッチできるように、受信バッファーから読み取りバッファーに詳細をコピーします。
スクートから完全なメッセージを作成する
コンシューマーとサーバーが TCP を介して接続する場合、いわゆるスクートで物理回線を介してデータを送信します。 このデータには特に起動停止はありません。 接続が確立されるとすぐにデータを送信すると、カーネルはバッファがいっぱいになるタイミングを判断し、パトロンにデータを送信します。 「完全な」メッセージがいつ到着したかを伝えるために、メッセージと会話の開始、構造、および終了について、TCP 上のプロトコルを使用することをお勧めします。 ほとんどの場合、このプロトコルは HTTP です。
Rust が TCP を助けることを以前に発見しました。フィールドの外。 したがって、私たちは Rust 内で TCP ソケットを発明し、誕生させ、リッスンする立場にあります。 メッセージを受け取った人、私たちは さらに解決策を講じる立場で、同じソケットに手を貸してください。 ソケットに手を貸す任意のテキストを頻繁に送信するオプションを提供します。実際には、送信しているものを多くの側で説明できることに注意する必要があります.
ソケットを生成して、カーネルが着信要求を転送する put を認識できるようにします。 すべてのソケットは、古いプロトコル (この場合は TCP)、処理する IP、およびポートを認識している必要があります。 Rust では、TcpListener が私たちのために仕事を処理してくれます。私たちは、リッスンしているカーネルとポートを処理するためにバインドをつぶやく立場にあります.

つぶやく
std::catch::TcpListener;
fn 選考科目() { let リスナー=TcpListener::bind(" 127.0.0.1: 8080").アンラップ
(); ために スクートインリスナー.incoming() {
let スクート=スクート。
unwrap
();
println!("スクート電流 {:?}", スクート);
}
平あなたがたまたま 貨物をローミング
サーバーを生成し、ブラウザを生成して に移動します。 localhost: 8080
、あなたは私たちがこれを気の利いたものを印刷することを精査します:
scoot 現在の TcpStream { addr: 127.0.0.1: 8080, see: 127.0.0.1: 56931, fd: 4 }
適切な方向への一歩です。 しかし、データや HTTP ヘッダーを精査しないのはなぜでしょうか? これは、スクートを受け取ってコンソールに出力するためです。
起動時の失敗は想像できると思いますが、サーバー
ポートへの接続と接続の確立は、さまざまな理由で失敗する可能性があります。 したがって、TcpListener とフォーム TcpStream の scoot の両方が Result を返します。 )。 この例では、すべてのピースを持ち上げると正常に動作しますが、実稼働環境では、おそらく決定するポートは、他の 1 つのアプリケーションをリッスンするためにすでにビジー状態になっている可能性があります。 開かれるとすぐに、入ってくる scoot は、事実上接続の試みであり、たとえばバッファ制限のために失敗するように設定されています。
スクートファンシーから勉強するとき、私たちがクイズするベースラインはUTF8でエンコードされたテキストです。 このレベルでは、カーネルはすでに TCP ヘッダーを取り除いており、そこにカプセル化された詳細だけが残っています。 これは、HTTP ヘッダー + データ、または詳細に接続されたさまざまなヘッダーのいずれかである可能性があります。
セッション層にアスタリスクを付けましたというのは、技術的には、Linux カーネルは OSI マネキンで自分自身を壊すことはなく、get メカニズムを実装しているためです。 とはいえ、接続を維持する前提はカーネル内で処理されており、詳細を Rust アプリケーション用のソケットにコピーする際に、TCP ヘッダーは削除されます scoot 宣言を解析すると、おそらく偏りのない穏やかな方法でヘッダーと全体的なテキストの詳細を精査する可能性があります。メッセージの適切な種類のデータをキャッチするためにヘッダーを取り除くのは私たちの責任です。 ヘッダーは、ここでも重要な役割を果たします。ヘッダーは、受け取った詳細を説明するのに役立ちます。
いくつかのさまざまな HTTP ヘッダーがあり、適切な範囲内でそれらを説明し、それらを操作するのはサーバーの責任です。 しばらく Web フレームワークをつぶやくと、全体の詳細が抽象化されます。 それでも、データがアプリケーションにどのように到着するかを把握することは不可欠であるため、しばらくの間、最適化を精査するために非同期のアイデア、get プロトコル、put を購入する必要があります。 HTTPを含む
TcpListener はスクートを提供してくれました。これを読んで説明したいと思います。 ここで、メソッドまたは他のメソッドがこのスクートを把握し、その内容を参照する必要があります。 このために、私たちは一対の食材を好みます。 まず、入ってくる scoot を受け取り、近隣のバッファに手を貸すバイトを書き込む、まったく新しい機能を発明したいと考えています。 そこから、それに応じて詳細を解析し、解決策を提供する立場にあります。 それを正確に行うヘルパー機能を追加します.
…
fn
handle_stream
(
mut
scoot
: TcpStream) {
let mut バッファ=;
スクート読んで(&mutバッファ).
unwrap
();
println!("クイズ: {}", 文字列::from_utf8_lossy(&buffer[..]));
}
…
イテレータでこの機能に名前を付けるだけです.
つぶやく[0; 512] std::catch::{TcpListener, TcpStream}; つぶやく std::io::prelude::*;
…
fn
メジャー
() { させて
リスナー=TcpListener::bind("
127.0.0.1: 8080
").unwrap(); ために スクートインリスナー.incoming() {
let スクート=スクート。
unwrap
();
ハンドルストリーム
(スクート);
} }
カーゴローミングでアプリを再起動すると、新しいブラウザウィンドウが生まれ、キャッチ位置に移動できる可能性があります
localhost: 8080
そして、あなたのアプリケーションがコンソールに出力しているものを精査してください。 代替ブラウザによって異なりますが、現在のバージョンの Safari では、次のように見える複数のリクエストが送信されます:得る / HTTP/1.1 ホスト: ローカルホスト: 8080 )アップグレードを恐れるリクエスト: 1 受け入れる: text/html,application/xhtml+xml,application/xml; q=0.9,*/*;q=0.8
ユーザーエージェント:
) Mozilla/5.0 (Macintosh;
Intel Mac OS X 10_15_7) AppleWebKit/605.1.15
(KHTML, ファンシー Gecko)
バージョン/14.0 Safari/605.1.15
)Accept-Language:
en-us 以下が含まれます: 得る
: HTTP リーチ
/: サーバー上のコースHTTP/1.1: HTTPプロトコルのバージョン
ホスト
: データを要求したいサーバーのホスト/エリア Accept-Language: どの人間の言語を持ち上げて理解する
パターンワークフロー
ひょっとしたらまた一致して精査する Rust での Web サービスの作成には注意点があることを、この簡単な例で説明します。 コードをもう一度見直す前に、バイナリをそのままにして再コンパイルすることが重要です。 私たちは非常に厳密なコンパイラを持っているので、これはさまざまな言語よりも最も頻繁に理解することができます. VIM または IDE を使用して、記述と同時にコード アナライザーをローミングします。 これは、カーゴローミングでアプリケーションを再度作成するよりも早く、偏りのないスポットライトエラーが発生する可能性があります. Rust では未定義の動作がほとんど発生しなくなったため、さまざまな言語とは対照的に、後で無限の時間を費やします
スクートを実際に印刷するよりも適度に、私たちは HTTP 仕様を試して、宣言を配列に保存し、行ごとに反復し、そこから HTTP 構造体を発明する立場にあります。 . この作業は、HTTP ヘッダーからメッセージの長さを調べて、メッセージ全体を自分で作成する必要があるため、もはや簡単ではありません.
ありがたいことにRust エコシステム内で既に公開されている木枠は、この仕事を手伝ってくれます。 そのため、本番環境に http サーバーを展開することは、ここで手動で行うよりも前例のないほど少ない作業です。
なぜ完全な HTTP メッセージを精査するのですか?
特定の起動または停止を使用せずに、バイトがスクートの近くにあることを発見しました。 適用層プロトコル (HTTP) は、バイトスクートを構造化する罪を犯しています。 もう一度言いますが、HTTP デマンドが起動と停止を含む完全なメッセージとして表示されるのはなぜでしょうか? スクートから引き抜かれたときに、メッセージがオーバーラップしたり、失われたデータを吸収したりするべきではありませんか?
私たちは幸運です。 実際の一対のリクエストを含む簡単なアプリケーションをすぐに取得したので、カーネル バッファは事実上完全であり、HTTP メッセージ全体を空にして引き渡すのに十分です。 これに依存しないオプションを提供し、それを本番環境で使用するアプリケーションで再度提供します。
ブラウザを開いて localhost: 8080 に移動すると、web 宣言のエラーが表示されました。 これは、HTTP プロトコルが要求するソリューションをまだ返していないためです。 この不幸を解明するために、私たちはスクートに書き込み、支援者に手を貸すバイトを送る立場にあります.
... fn )
ハンドルストリーム
(
mut
scoot: TcpStream) { let mut バッファ=[0; 512]; スクート読んで(&mutバッファ).
unwrap
();
println!("{}", String::from_utf8_lossy(&buffer[..]));
)let
応答="
HTTP/1.1 200 OK
rnrn"; スクート書き込み(応答。as_bytes()).アンラップ(); スクートフラッシュ().unwrap();
}
...
たまたまブラウザを作成して localhost に移動したとしても、次のようになります。 8080 の場合、スムーズな Web 宣言をもう 1 つのエラーとしてキャッチする可能性があります。 わずか 2 行のコードで、HTTP を介して他の 1 つのアプリケーションと通信することに成功しました。
この記事Rust Web Pattern
の章の一部であり、電子ブック内に縮小されませんでした。
TCP対UDP
TCP は、いわゆる 3 リーチ ハンドシェイクを介して接続の作成を開始する接続指向のプロトコルです。 適切な範囲内でパケットを送信することを確認し、多くの側で失敗した場合は再送信を試みます。 このため、TCP ヘッダーは大きく (20 バイト) あり、UDP をつぶやく可能性があるため、合計方向が遅くなります。
UDPパケット ヘッダーは小さく (8 バイト)、プロトコル内に統合された適切な接続の作成として、この形式のものはありません。 パケットのフリルはもはや保護されておらず、1 つのメッセージが近くに失敗した場合、組み込みの再試行としてこの形式のものはありません。
アプリケーションの空想的な在庫割り当てまたはストリーミング サービス、ゲーム サーバー、または気候アプリケーションの UDP をつぶやく可能性があります。 場合によっては、合計で余分なデータを再送信する可能性があります。また、持ち上げると同時に、再試行メカニズムを有効にする必要があります。 さらに、データは急速に古くなり、同じ精巧な内部のすべてのパケットを気にしなくなったり、偏りがなくなったりする可能性があります。 さらに、UDP は複数のホストにブロードキャストできますが、TCP は継続的に単一のコンシューマー サーバー接続です。 持ち上げると同時に TCP を消費して、公式のデータ転送を吸収します。 例として、銀行のアプリケーションや電子商取引では、リーチに沿って平和なデータを失う必要がないか、消費者とサーバーの間の叫び声について話す必要があります。 さびとOSIマネキン
Web サービスは、Web に接続されたコンピューター プログラムに展開されます。 これらのコンピューター プログラムは、新しいメッセージをリッスンする IP アドレスと出生ポートを吸収します。 これらのマシンで実行されている目的は、特定のメッセージに関心を示しているため、これらを指示して解決します.
Commence Systems Interconnection (OSI) マネキンは、A からB離れて。 サーバーから消費者に送信されたバイトは、ラップトップ自体を経由して、さまざまなルーターや、より大きなエンドポイントに接続されている物理的なワイヤに到達します。
OSI マネキンは、視覚化に役立ちます。ステージはバイトの送信に取りつかれ、さまざまなレイヤーのメソッドに取りつかれている成分をグループ化します。 マネキン内に記述されているレイヤーは、物理 (1)、ファイル リンク (2)、ネットワーク (3)、トランスポート (4)、セッション (5)、プレゼンテーション (6)、ユーティリティ (7) です。
サーバーに送信されたメッセージは、複数のレイヤーと地理的にさまざまな場所を通過する必要があります。それを近くに。 これらのさまざまなレイヤーの次の作業をキャッチするために、OSI マネキンが作成されました。 通信を標準化するための概念的なフレームワークとは少し離れています.サーバーに。 適切なサーバーを取得するために、多くのさまざまなルーターを通過することを望んでいます。 間違った場所をキャッチしないように、ユーザー アプリケーションとカーネルはいくつかのヘッダーと並んで配置されているため、言語置換方向のすべてのレイヤーは、ルーティング先のプットを認識しています。
パケットはこれらのさまざまなほとんどすべてのレイヤーが上部にさらにヘッダーを追加するため、次のレイヤーは詳細を処理する方法に関するヒントを認識しています. アプリケーションは、カーネルが TCP、IP、およびイーサネット ヘッダーを追加するよりも早く、送信したい詳細の上に HTTP ヘッダーを追加します。
受信サーバーはと同じ方向を通りますが、逆です。 内部の詳細を読み取れるようになるまで、すべてのヘッダーを解体する必要があります。
追加されたヘッダーのサイズは標準化されているため、実行中の描画とカーネルは、詳細を読み取るまでに取り除かなければならないバイト数を認識しています。 このデータをつぶやいて、受け取ったデータを次に把握するオプションを提供します。
前述の OSI 概要図では、イーサネットと IP ヘッダーは美しく交渉不可能です。 ただし、他のすべての部分は調整で追加されます。 たとえば、UDP を TCP の 1 つとして購入し、get プロトコルを HTTP のもう 1 つとして購入するオプションを提供します。 たとえば、セキュリティ上の理由を吸収して get プロトコル (get ヘッダー ディメンションを使用) を有効にするオプションを提供します。これにより、メッセージを調べている侵入者はそれらを理解できなくなります。
Rust はどこで活躍するのですか? Web キャリアは、接続の発明、メッセージの受信、および応答の送信に関連して、次のメカニズムを提供する必要があります:
多くのさまざまなプログラミング言語には、豊富な典型的なライブラリが含まれています。これらの HTTP サーバーを発明します。 さびはまた少し異なります。 システム プログラミング言語である Rust は、考えられる限り小さなものであり、さらに、友人と HTTP を介して継続的に話をしなければならないマイクロ コントローラー上で適切に機能することを望んでいます。
したがって、Rust は事実に基づいて、異常なライブラリ内に TCP の頻繁な作業を含めることを決定しました。 青色のコンポーネント (TCP/IP) は、Rust の典型的なライブラリ内に統合されています。 HTTP をサポートする Web サーバーを開発する必要がある場合でも、get を開発する可能性があります。 ありがたいことに、ここに全体的なシナリオがあるので、近所の人はすでにいくつかの戦闘テスト済みの Web サーバー実装を以前のバージョンで構築しています。 たとえば、crate hyper は、http サーバーとして広く使用されています。
Rust crates
Rustでは外部ライブラリやプログラムを「クレート」と呼びます。 それらは crates.io と呼ばれる Web ポジションでホストされており、Rust ミッションがコンパイルしたものを公平かつ穏やかに取得できます。 場合によっては、Cargo.toml ファイル内の Rust ミッションにクレートを追加することもできます。ターミナルで貨物製造または貨物ローミング ティーチのつぶやきの後、新しく追加されたクレートがダウンロードされ、ローカル ミッションに追加されます。
さらに、Web フレームワーク用のクレートがあり、その下に全レイヤー (HTTP、 TCP やその他多数) を提供し、URL の質問パラメーターを解析し、JSON などを調査して返すなど、現代の人間工学に基づいた全体的な機能を提供します
これはさらに、より大きな代替品を提示します: 1 つのことを行う前例のない肥大化なしでアプリケーション サーバーを機能させることができれば、必要ないくつかの機能を手動で発明し、後で軽量のソリューションを吸収できる可能性があります。
Hunch、NodeJS、または Java から来ている可能性がある場合でも、この方法は立場の転換です。 近所の人に手を貸すことを考えずに、もう1マイル行くには、生まれてからのあなたの欲求を助ける図書館を精査する必要があります.
HTTP で起動するには、さらに、コンシューマーとサーバー間の接続が安定していることを確認する必要があります。 ここでは、SSL の後継である TLS (Transport Layer Security) で対処します。 さらに、Rust には組み込みの TLS が役立ちませんが、アプリケーションで TLS を有効にするのに役立つ一対のプログラムが存在します。
接続を開く
Rustで書かれたWebキャリアにブラウザアプリケーションがHTTPデマンドを送信している例を考察します。 カーネルに近いバイトがどれだけ正確であるか、およびRustアプリケーションが実行中のアプリケーションに配信されたバイトをどのように取得しているかをすばやく調べるオプションを提供します。 ここでは、ライブラリを介してすべてが抽象化されていることを伝えますが、しばらくすると、そのようなライブラリについてつぶやくのではなく、Rust コア ライブラリ自体を介して 1 つのことを有効にすることができます。
起動するには、Web キャリアのバイトのフロートがどの程度正確に機能するかを知るか、少なくとも心に留めておくと効果的です。実行中のアプリケーションでしばらくの間、バグ、ボトルネック、およびさまざまな設定ミスを設定します。
パトロンが HTTP 要求を送信すると、カーネルは詳細をキットにラップします。それに接続された HTTP および TCP ヘッダー。 いわゆる NIC (コミュニティ インターフェイス カード) でサーバーに到着します。 コンシューマーはまず、サーバーに TCP 接続を確立する必要があります。 実行するとすぐに、私たちのカーネルは受信メッセージを処理するソケットを開きました。ネットワーキングのカーネル側については、Beej’s Files to Network Programming
を強く指摘します。 .
RustでWebサーバーをローミングするとき、さらにソケットを実行中のドロー側に吸収し、着信をリッスンする位置に置きますメッセージ。 カーネルの仕事は、着信 TCP メッセージの詳細を内部ソケットに繰り返し、新しいデータが到着したときに通知することです。そして、どの TCP 接続 (IP take care と port) が説明されているかを把握し、対応するソケットのように見え、詳細を受信バッファーにコピーします
新しいデータをリッスンしているメソッドにこのソケットに通知し、メソッドが関心を示したら、詳細を新しいバッファにコピーします。 サーバーアプリケーションがカーネルからプログラムにバイトをキャッチできるように、受信バッファーから読み取りバッファーに詳細をコピーします。
スクートから完全なメッセージを作成する
コンシューマーとサーバーが TCP を介して接続する場合、いわゆるスクートで物理回線を介してデータを送信します。 このデータには特に起動停止はありません。 接続が確立されるとすぐにデータを送信すると、カーネルはバッファがいっぱいになるタイミングを判断し、パトロンにデータを送信します。 「完全な」メッセージがいつ到着したかを伝えるために、メッセージと会話の開始、構造、および終了について、TCP 上のプロトコルを使用することをお勧めします。 ほとんどの場合、このプロトコルは HTTP です。
Rust が TCP を助けることを以前に発見しました。フィールドの外。 したがって、私たちは Rust 内で TCP ソケットを発明し、誕生させ、リッスンする立場にあります。 メッセージを受け取った人、私たちは さらに解決策を講じる立場で、同じソケットに手を貸してください。 ソケットに手を貸す任意のテキストを頻繁に送信するオプションを提供します。実際には、送信しているものを多くの側で説明できることに注意する必要があります.
ソケットを生成して、カーネルが着信要求を転送する put を認識できるようにします。 すべてのソケットは、古いプロトコル (この場合は TCP)、処理する IP、およびポートを認識している必要があります。 Rust では、TcpListener が私たちのために仕事を処理してくれます。私たちは、リッスンしているカーネルとポートを処理するためにバインドをつぶやく立場にあります.
つぶやく
std::catch::TcpListener;
fn 選考科目() { let リスナー=TcpListener::bind(" 127.0.0.1: 8080").アンラップ
(); ために スクートインリスナー.incoming() {
let スクート=スクート。
unwrap
();
println!("スクート電流 {:?}", スクート);
}
平あなたがたまたま 貨物をローミング
サーバーを生成し、ブラウザを生成して に移動します。 localhost: 8080
、あなたは私たちがこれを気の利いたものを印刷することを精査します:
scoot 現在の TcpStream { addr: 127.0.0.1: 8080, see: 127.0.0.1: 56931, fd: 4 }
適切な方向への一歩です。 しかし、データや HTTP ヘッダーを精査しないのはなぜでしょうか? これは、スクートを受け取ってコンソールに出力するためです。
起動時の失敗は想像できると思いますが、サーバー
ポートへの接続と接続の確立は、さまざまな理由で失敗する可能性があります。 したがって、TcpListener とフォーム TcpStream の scoot の両方が Result を返します。 )。 この例では、すべてのピースを持ち上げると正常に動作しますが、実稼働環境では、おそらく決定するポートは、他の 1 つのアプリケーションをリッスンするためにすでにビジー状態になっている可能性があります。 開かれるとすぐに、入ってくる scoot は、事実上接続の試みであり、たとえばバッファ制限のために失敗するように設定されています。
スクートファンシーから勉強するとき、私たちがクイズするベースラインはUTF8でエンコードされたテキストです。 このレベルでは、カーネルはすでに TCP ヘッダーを取り除いており、そこにカプセル化された詳細だけが残っています。 これは、HTTP ヘッダー + データ、または詳細に接続されたさまざまなヘッダーのいずれかである可能性があります。
セッション層にアスタリスクを付けましたというのは、技術的には、Linux カーネルは OSI マネキンで自分自身を壊すことはなく、get メカニズムを実装しているためです。 とはいえ、接続を維持する前提はカーネル内で処理されており、詳細を Rust アプリケーション用のソケットにコピーする際に、TCP ヘッダーは削除されますscoot 宣言を解析すると、おそらく偏りのない穏やかな方法でヘッダーと全体的なテキストの詳細を精査する可能性があります。メッセージの適切な種類のデータをキャッチするためにヘッダーを取り除くのは私たちの責任です。 ヘッダーは、ここでも重要な役割を果たします。ヘッダーは、受け取った詳細を説明するのに役立ちます。
いくつかのさまざまな HTTP ヘッダーがあり、適切な範囲内でそれらを説明し、それらを操作するのはサーバーの責任です。 しばらく Web フレームワークをつぶやくと、全体の詳細が抽象化されます。 それでも、データがアプリケーションにどのように到着するかを把握することは不可欠であるため、しばらくの間、最適化を精査するために非同期のアイデア、get プロトコル、put を購入する必要があります。 HTTPを含む
TcpListener
はスクートを提供してくれました。これを読んで説明したいと思います。 ここで、メソッドまたは他のメソッドがこのスクートを把握し、その内容を参照する必要があります。 このために、私たちは一対の食材を好みます。 まず、入ってくる scoot を受け取り、近隣のバッファに手を貸すバイトを書き込む、まったく新しい機能を発明したいと考えています。 そこから、それに応じて詳細を解析し、解決策を提供する立場にあります。 それを正確に行うヘルパー機能を追加します.
…
fn
handle_stream
(
mut
scoot
: TcpStream) {
let mut バッファ=;
スクート読んで(&mutバッファ).
unwrap
();
println!("クイズ: {}", 文字列::from_utf8_lossy(&buffer[..]));
}
…
イテレータでこの機能に名前を付けるだけです.
つぶやく[0; 512] std::catch::{TcpListener, TcpStream}; つぶやく std::io::prelude::*;
…
fn
メジャー
() { させて
リスナー=TcpListener::bind("
127.0.0.1: 8080
").unwrap(); ために スクートインリスナー.incoming() {
let スクート=スクート。
unwrap
();
ハンドルストリーム
(スクート);
} }
カーゴローミングでアプリを再起動すると、新しいブラウザウィンドウが生まれ、キャッチ位置に移動できる可能性があります
localhost: 8080
得る / HTTP/1.1 ホスト: ローカルホスト: 8080 )アップグレードを恐れるリクエスト: 1 受け入れる: text/html,application/xhtml+xml,application/xml; q=0.9,*/*;q=0.8
ユーザーエージェント:
) Mozilla/5.0 (Macintosh;
Intel Mac OS X 10_15_7) AppleWebKit/605.1.15
(KHTML, ファンシー Gecko)
バージョン/14.0 Safari/605.1.15
)Accept-Language:
en-us 以下が含まれます: 得る
: HTTP リーチ
/: サーバー上のコースHTTP/1.1: HTTPプロトコルのバージョン
ホスト
: データを要求したいサーバーのホスト/エリア Accept-Language: どの人間の言語を持ち上げて理解する
パターンワークフロー
ひょっとしたらまた一致して精査する Rust での Web サービスの作成には注意点があることを、この簡単な例で説明します。 コードをもう一度見直す前に、バイナリをそのままにして再コンパイルすることが重要です。 私たちは非常に厳密なコンパイラを持っているので、これはさまざまな言語よりも最も頻繁に理解することができます. VIM または IDE を使用して、記述と同時にコード アナライザーをローミングします。 これは、カーゴローミングでアプリケーションを再度作成するよりも早く、偏りのないスポットライトエラーが発生する可能性があります. Rust では未定義の動作がほとんど発生しなくなったため、さまざまな言語とは対照的に、後で無限の時間を費やします
スクートを実際に印刷するよりも適度に、私たちは HTTP 仕様を試して、宣言を配列に保存し、行ごとに反復し、そこから HTTP 構造体を発明する立場にあります。 . この作業は、HTTP ヘッダーからメッセージの長さを調べて、メッセージ全体を自分で作成する必要があるため、もはや簡単ではありません.
ありがたいことにRust エコシステム内で既に公開されている木枠は、この仕事を手伝ってくれます。 そのため、本番環境に http サーバーを展開することは、ここで手動で行うよりも前例のないほど少ない作業です。
なぜ完全な HTTP メッセージを精査するのですか?
特定の起動または停止を使用せずに、バイトがスクートの近くにあることを発見しました。 適用層プロトコル (HTTP) は、バイトスクートを構造化する罪を犯しています。 もう一度言いますが、HTTP デマンドが起動と停止を含む完全なメッセージとして表示されるのはなぜでしょうか? スクートから引き抜かれたときに、メッセージがオーバーラップしたり、失われたデータを吸収したりするべきではありませんか?
私たちは幸運です。 実際の一対のリクエストを含む簡単なアプリケーションをすぐに取得したので、カーネル バッファは事実上完全であり、HTTP メッセージ全体を空にして引き渡すのに十分です。 これに依存しないオプションを提供し、それを本番環境で使用するアプリケーションで再度提供します。
ブラウザを開いて localhost: 8080 に移動すると、web 宣言のエラーが表示されました。 これは、HTTP プロトコルが要求するソリューションをまだ返していないためです。 この不幸を解明するために、私たちはスクートに書き込み、支援者に手を貸すバイトを送る立場にあります.
... fn )
ハンドルストリーム
(
mut
scoot: TcpStream) { let mut バッファ=[0; 512]; スクート読んで(&mutバッファ).
unwrap
();
println!("{}", String::from_utf8_lossy(&buffer[..]));
)let
応答="
HTTP/1.1 200 OK
rnrn"; スクート書き込み(応答。as_bytes()).アンラップ(); スクートフラッシュ().unwrap();
}
...
たまたまブラウザを作成して localhost に移動したとしても、次のようになります。 8080 の場合、スムーズな Web 宣言をもう 1 つのエラーとしてキャッチする可能性があります。 わずか 2 行のコードで、HTTP を介して他の 1 つのアプリケーションと通信することに成功しました。
この記事Rust Web Pattern
の章の一部であり、電子ブック内に縮小されませんでした。
: サーバー上のコースHTTP/1.1: HTTPプロトコルのバージョン
ホスト
: データを要求したいサーバーのホスト/エリア Accept-Language: どの人間の言語を持ち上げて理解する
パターンワークフロー
ひょっとしたらまた一致して精査する Rust での Web サービスの作成には注意点があることを、この簡単な例で説明します。 コードをもう一度見直す前に、バイナリをそのままにして再コンパイルすることが重要です。 私たちは非常に厳密なコンパイラを持っているので、これはさまざまな言語よりも最も頻繁に理解することができます. VIM または IDE を使用して、記述と同時にコード アナライザーをローミングします。 これは、カーゴローミングでアプリケーションを再度作成するよりも早く、偏りのないスポットライトエラーが発生する可能性があります. Rust では未定義の動作がほとんど発生しなくなったため、さまざまな言語とは対照的に、後で無限の時間を費やします
スクートを実際に印刷するよりも適度に、私たちは HTTP 仕様を試して、宣言を配列に保存し、行ごとに反復し、そこから HTTP 構造体を発明する立場にあります。 . この作業は、HTTP ヘッダーからメッセージの長さを調べて、メッセージ全体を自分で作成する必要があるため、もはや簡単ではありません.
ありがたいことにRust エコシステム内で既に公開されている木枠は、この仕事を手伝ってくれます。 そのため、本番環境に http サーバーを展開することは、ここで手動で行うよりも前例のないほど少ない作業です。
なぜ完全な HTTP メッセージを精査するのですか?
特定の起動または停止を使用せずに、バイトがスクートの近くにあることを発見しました。 適用層プロトコル (HTTP) は、バイトスクートを構造化する罪を犯しています。 もう一度言いますが、HTTP デマンドが起動と停止を含む完全なメッセージとして表示されるのはなぜでしょうか? スクートから引き抜かれたときに、メッセージがオーバーラップしたり、失われたデータを吸収したりするべきではありませんか?
私たちは幸運です。 実際の一対のリクエストを含む簡単なアプリケーションをすぐに取得したので、カーネル バッファは事実上完全であり、HTTP メッセージ全体を空にして引き渡すのに十分です。 これに依存しないオプションを提供し、それを本番環境で使用するアプリケーションで再度提供します。
ブラウザを開いて localhost: 8080 に移動すると、web 宣言のエラーが表示されました。 これは、HTTP プロトコルが要求するソリューションをまだ返していないためです。 この不幸を解明するために、私たちはスクートに書き込み、支援者に手を貸すバイトを送る立場にあります.
... fn )
ハンドルストリーム
(
mut
scoot: TcpStream) { let mut バッファ=[0; 512]; スクート読んで(&mutバッファ).
unwrap
();
println!("{}", String::from_utf8_lossy(&buffer[..]));
)let
応答="
HTTP/1.1 200 OK
rnrn"; スクート書き込み(応答。as_bytes()).アンラップ(); スクートフラッシュ().unwrap();
}
...
たまたまブラウザを作成して localhost に移動したとしても、次のようになります。 8080 の場合、スムーズな Web 宣言をもう 1 つのエラーとしてキャッチする可能性があります。 わずか 2 行のコードで、HTTP を介して他の 1 つのアプリケーションと通信することに成功しました。
この記事Rust Web Pattern
の章の一部であり、電子ブック内に縮小されませんでした。