web-dev-qa-db-ja.com

Wireshark-Wiresharkを使用してバイトオーダーのリトルエンディアンビッグエンディアンの違いを観察するにはどうすればよいですか?

UDPソケット(C)を使用して通信する簡単なアプリケーションを作成しました。アプリケーションは単純です。クライアントはサーバーに数値を送信し、サーバーはそれらの合計を計算します。

これで、クライアントとサーバーによって交換されたパケットをキャプチャする方法がわかりましたが、Wiresharkを使用して、パケットのリトルエンディアンとビッグエンディアンのバイト順序の違いをどのように観察できるのでしょうか。

6
mirx

Wiresharkで認識されないプロトコルでは、TCPまたは「解析されていない」ペイロードフィールドを持つUDPパケットのみが表示されます。プロトコルがWiresharkで「認識」されている場合(BOOTP、DHCP、DNS、SMB、 HTMLなど)WiresharkがTCP/UDPペイロード領域を「形成」し、対応する認識された高レベルのプロトコルフィールドを表示していることがわかります。

Wiresharkには、よく知られたプロトコル用に多くのdissectorsが含まれており、特定のプロトコルペイロードをフォーマットされた方法で表示する場合は、独自のプロトコルを作成できます。こちらをご覧ください。 https://www.wireshark.org/docs/wsdg_html_chunked/ChDissectAdd.html

あなたの場合、あなたの解剖学者は許可された値を扱う特定のフィールドの「エンディアン」を扱うことができます。

一方、「エンディアン」は、特定のバイトシーケンスをに変換する数値情報表現(バイトサイズ、符号付き/符号なし、整数/浮動小数点など)のいくつかのネストされたレイヤーの最初のものであると考えてください。数。

4
Pat

数値に非常に厳しい制約がない限り、数値がビッグエンディアンかリトルエンディアンかを識別する方法はありません。つまり、1つの方法でしか理解できないため、間違った道。

この種のことを行う標準的な方法は、ペイロードがビッグエンディアンまたはリトルエンディアンであるなど、その内容に関する情報を提供するヘッダーをパケットに追加することです。または、必要に応じて送信者と受信者が動的にバイトを交換して、パッケージを常にビッグエンディアンまたはリトルエンディアンで送信することもできます。

ユーザーデータグラムプロトコル についてウィキペディアが言っているように、覚えておいてください:

ハンドシェイクダイアログがないため、ユーザーのプログラムが基盤となるネットワークの信頼性にさらされます。配信、注文、または重複保護の保証はありません。

UDPは主にデータがストリーミングされるときに使用されますが、すべてのパッケージの配信は重要ではありません。たとえば、ビデオを送信する防犯カメラは、破損または故障して到着したときに数フレームが失われることが許容される場合に使用します。

パッケージが失われたり破損したりすると合計が間違っているため、数値の合計を行うサーバーはUDPの候補としては適していません。 [〜#〜] tcp [〜#〜] これは正しい配信がここで優先されることを保証します。 UDPストリームにフェイルセーフ対策を組み込むと、すぐにTCPを再発明することになります。

着信メッセージを追跡する最も簡単な解決策は、サーバーにオプションでコンソールに情報を出力させることです。これは、呼び出されたときに指定されたパラメーター、またはデバッグプリプロセッサーディレクティブ(C/C++の場合は#ifdef)によって制御できます。

2
harrymc

内訳を説明しているセクションの値を観察し、生のヘクスと比較します。 1バイトより大きいフィールドを見て、生のヘックスがリトルエンディアンかビッグエンディアンかを確認します。つまりval(16)の内訳とhexdump(2バイトフィールドであるため)では、ビッグエンディアンの場合は00 10、リトルエンディアンの場合は1000と表示されます。お役に立てば幸いです。

0
chris