問題タブ [network-protocols]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
language-agnostic - TCP での connect() の動作
クライアントで connect() を呼び出します。クライアントは SYN_SENT 状態に入り、SYN を送信します。ここで、ACK を含まない SYN を取得するため、クライアントは SYN_RCVD 状態に入ります。
この時点で connect() は戻りますか? 技術的には、ソケットで send() および recv() を呼び出すのに十分な情報があります。RFC 自体は、SYN_RCVD 状態のソケットで SEND を呼び出すと、次のように述べています。
そして、RECEIVE を呼び出すと、次のようになります。
したがって、私の質問は次のとおりです: SYN を取得した後に connect() が返され、recv() の呼び出しがブロックされるか、接続が完全に確立されるまで connect() 自体がブロックされますか?
xna - 利用可能なゲーム ネットワーク プロトコル定義言語とコード生成
リアルタイム ゲーム サーバーとクライアント (World Of Warcraft や Quake III など) を複数の言語 (Java バックエンド サーバーと iPhone フロントエンドなど) で作成する方法を提供する、優れた汎用バイナリ ネットワーク プロトコル定義フレームワークを探していました。 Objective-C と Cocoa で書かれたクライアント)。
Java Flash クライアント、iPhone クライアント、および Windows 上の C# クライアント (および XBOX 上の XNA クライアント) をサポートしたいと考えています。
TCP/IP または UDP ソケット ストリーム接続を介してメッセージを効率的に送受信する方法を探しています。JSON や XML マーシャリング オブジェクトなど、HTTP Web サービス経由で送信できるものを探しているわけではありません。Hessian のバイナリ Web サービス プロトコルは非常に興味深いソリューションですが、
クライアントがサーバーに接続し、定義されたプロトコルでメッセージを送信し、ある種の RPC エンドポイントにバインドすることなくプロトコルでメッセージを受信できるようにする、ネットワーク プロトコル形式とクライアント/サーバーの基本的な実装が必要です。プロトコルの着信および発信のメッセージの汎用ストリームが必要です。これは、サーバーがすべてのクライアントにゲーム内のさまざまなエンティティの位置を 100 ミリ秒ごとに送信するようなことをサポートできるようにするためです。
http - HTTP プロトコルで使用されるエンコーディングはどれですか?
ブラウザが HTTP リクエストを Web サーバーに送信するとき、回線上で HTTP プロトコルをエンコードするためにどのエンコーディングが使用されますか? アスキーですか?UTF8? またはUTF16?それとも、事前定義された形式で使用するエンコーディングを指定しますか (デコードが行われる前に?)
PS リクエスト/レスポンスの実際のペイロード (HTML など) について質問しているわけではありません。GET /index.html HTTP/1.1
リクエスト行 (つまり) とヘッダー (つまりHost: google.com
)について質問しています
c# - このデータ解析の問題をどのように解決しますか?
同時に開発中のハードウェアのエミュレーターを実装しています。アイデアは、サード パーティにクライアント ソフトウェアをテストするためのソフトウェア ソリューションを提供し、ハードウェア開発者にファームウェアを実装するための基準点を提供することです。
ハードウェアのプロトコルを作成した人々は、INCA_XDR と呼ばれる SUN XDR のカスタム バージョンを使用しました。メッセージをシリアライズおよびデシリアライズするツールです。これは C で書かれており、ネイティブ コードを避けたいので、プロトコル データを手動で解析しています。
プロトコルは本質的にかなり複雑で、データ パケットはさまざまな構造を持つことができますが、常に同じグローバル構造を持ちます。
[頭] [イントロ] [データ] [尾]
ご覧のとおり、多くのオーバーヘッド データがありますが、これはプロトコルが RS232 (ポイントツーマルチポイント) と TCP/IP (p2p) の両方で動作する必要があるためです。
または、まったく異なる構造を持つ可能性があります。
場合によっては、DRCode のみで追加データがない場合もあります。
グループとタイプ フィールドに基づいて、エミュレータは特定のアクションを実行する必要があります。そのため、最初にこれら 2 つのフィールドを見て、それに基づいて、データに何が期待できるかを把握し、適切に解析する必要があります。
次に、多くの異なるデータ構造を持つ応答データを生成する必要があります。単純に ACK または NACK メッセージを生成するメッセージもあれば、データを含む実際の応答を生成するメッセージもあります。
私たちは物事を細かく分割することにしました。
まず第一に、IDataProcessor があります。
このインターフェイスを実装するクラスは、生データの検証と Message クラスのインスタンスの生成を担当します。それらは通信を担当せず、単純に byte[] が渡されます。
生データの検証とは、チェックサム、crc、および長さのエラーについてヘッダーをチェックすることを意味します。
結果のメッセージは、IMessageProcessor を実装するクラスに渡されます。生データが無効と見なされたとしても、IDataProcessor には応答メッセージなどの概念がないため、生データを検証するだけです。
IMessageProcessor にエラーを通知するために、いくつかのプロパティが Message クラスに追加されました。
これらはプロトコルとは関係なく、IMessageProcessor 用にのみ存在します。
IMessageProcessor は、実際の作業が行われる場所です。メッセージ グループとメッセージの種類がさまざまであるため、F# を使用して IMessageProcessor インターフェイスを実装することにしました。(F# や、LINQ と SQL 以外の関数型言語の経験はありません)
IMessageProcessor はデータを分析し、IHardwareController で呼び出す必要があるメソッドを決定します。IHardwareController を持つのは冗長に思えるかもしれませんが、F# の使用を強制されないように、別の実装と交換できるようにしたいと考えています。現在の実装は WPF ウィンドウですが、たとえば Cocoa# ウィンドウまたは単にコンソールである可能性があります。
IHardwareController は、開発者がユーザー インターフェイスを介してハードウェア パラメーターとエラーを操作できる必要があるため、状態の管理も担当します。
したがって、IMessageProcessor が IHardwareController で正しいメソッドを呼び出したら、応答メッセージを生成する必要があります。繰り返しますが、これらの応答メッセージのデータは、さまざまな構造を持つことができます。
最終的には、IDataFactory を使用して Message を生のプロトコル データに変換し、通信を担当するクラスに送信できるようにします。(たとえば、データの追加のカプセル化が必要になる場合があります)
このコードを書くのは「難しい」ことではありませんが、さまざまなコマンドとデータ構造のすべてが非常に多くのコードを必要とし、再利用できるものはほとんどありません。(少なくとも今見る限りでは、誰かが私が間違っていることを証明してくれることを願っています)
F# を使うのはこれが初めてなので、実際に学んでいます。以下のコードは完成にはほど遠いもので、おそらく大混乱のように見えます。プロトコル内のすべてのメッセージのほんの一握りを実装しているだけで、非常に多くのメッセージがあることがわかります。したがって、このファイルは巨大になります。
知っておくべき重要事項: バイト順は回線上で逆になっています (歴史的な理由)
(実際のソースでは、クラスは「ハードウェア」よりも具体的な名前が異なることに注意してください)
提案、コードを改善する方法、または問題を処理するためのさまざまな方法を期待しています。たとえば、IronPython などの動的言語を使用すると物事が簡単になるでしょうか? 私は間違った方向に進んでいますか? このような問題を経験したことはありますか?何を変更し、何を回避しますか?...
アップデート:
ブライアンの回答に基づいて、次のことを書き留めました。
すべての DR タイプ (かなりの数) に対してこれを続けることもできますが、それがどのように役立つかはまだわかりません。Wikibooks と Foundations of F# でそれについて読んだことがありますが、まだ頭の中で何かがクリックされていません。
更新 2
だから、私は次のことができることを理解しています:
しかし、メッセージが IMessageProcessor に入ると、メッセージの種類が選択され、適切な関数が呼び出されます。上記は単なる追加のコードであり、少なくともそれが理解できる方法であるため、ここでのポイントを本当に見逃しているに違いありません...しかし、私にはわかりません。
tcp - tcp チェックサムとしてのアプリケーション レベルのチェックサムが弱すぎる可能性がありますか?
この論文 ( CRC と TCP チェックサムが一致しない場合) は、TCP チェックサム アルゴリズムがかなり弱いため、TCP を使用する 1600 万から 100 億パケットごとに検出されないエラーが発生することを示唆しています。
アプリケーション レベルでチェックサムを追加することによって、この種のエラーからデータを保護するアプリケーション開発者はいますか?
EJB リモート メソッド呼び出し (Java EE 5) の実行中に、このようなエラーから保護するために使用できるパターンはありますか? または、Java はすでにシリアル化されたオブジェクトを自動的にチェックサムしますか (さらに、基礎となるネットワーク プロトコルに加えて)?
エンタープライズ ソフトウェアは、メモリ ECC だけでなく、レジスタなど (SPARC など) で CPU 内のエラー チェックを実行するコンピューター上で実行されています。ストレージ システム (ハード ドライブ、ケーブルなど) でのビット エラーは、Solaris ZFS を使用することで防ぐことができます。
その記事を見るまでは、TCP によるネットワーク ビット エラーを恐れたことはありませんでした。
一部の非常に少数のクライアント サーバー リモート インターフェースに対してアプリケーション レベルのチェックサムを実装するのは、それほど大変な作業ではないかもしれません。しかし、単一のデータセンター内の多数のマシンで実行される分散エンタープライズ ソフトウェアはどうでしょうか。非常に膨大な数のリモート インターフェイスが存在する可能性があります。
SAP、Oracle などのすべてのエンタープライズ ソフトウェア ベンダーは、この種の問題を無視しているのでしょうか? 銀行はどうですか?証券取引所のソフトウェアはどうですか?
フォローアップ:たくさんの回答ありがとうございました! そのため、検出されないネットワーク データの破損をチェックすることはほとんどないように思われますが、それらは存在するようです。
MD5 または SHA1 を使用するように構成された TLS で RMI over TLS を使用するように Java EE アプリケーション サーバー (または EJB デプロイメント記述子) を構成し、同じことを行うように Java SE クライアントを構成するだけで、この問題を解決できませんでしたか? これは、アプリケーションレベルでこれを実装する必要がないように、信頼できる透過的なチェックサムを取得する方法でしょうか (やり過ぎではありますが)? それとも、ネットワークスタックに関して完全に混乱していますか?
java - Java で UDP クライアントに到達できない
接続時にIPとクライアントのポートを収集し、情報をデータベースに保存する単純なUDP Javaサーバーを実行しています。
クライアントはまだサーバーをリッスンしています。サーバーが停止します。
後で、サーバーはデータベース情報を再利用してクライアントに到達したいと考えています。クライアントはまだサーバーの同じポートをリッスンしているため、クライアントは通信を受信する必要があると思います。
私はUDPを初めて使用します。上記の目的を達成する方法を教えてください。ありがとうございました。
Stackoverflowのメンバーが提案した方法を試したので、質問を言い換えましょう。
サーバーは短時間でクライアントに接続できますが、たとえば 10 分後にはクライアントに到達できません。クライアントは常にサーバーをリッスンする準備ができているように見えますが、サーバーは何度か試行してもクライアントに到達できません。これの原因は何ですか?これの対処法を教えてください
networking - ブラウザー以外のアプリケーションでこの URL に接続できないのはなぜですか?
この URL がブラウザ以外のアプリケーション (wget、curl、elinks!) から送信された接続要求を拒否する理由は誰でも知っています: http://sube.garanti.com.tr
https://sube.garanti.com.tr/isube/login/ja
これは私の銀行口座であり、スクリプトを使用して送金しようとしていますが、ご覧のとおり、この非常に安全なサーバーでは許可されていません。
助言がありますか?
アゼル
c# - C# での信頼できるマルチキャスト
c#/.Net 3.5 での信頼できるマルチキャストのオプションは何ですか?
MSMQ を使用したくありません。
私は商用およびオープンソースのオプションを受け入れています。
ありがとう