4

アプリケーションプロトコルを解析する従来の方法は何ですか?

既に設計されたプロトコル (SMTP など) のソケットからのストリームが与えられた場合、プロトコルを処理する通常の方法は何ですか。それは yacc ベースのパーサーですか、正規表現ベースのアプローチですか、それとも他の方法ですか?

4

1 に答える 1

2

アプリケーション層のプロトコルはたくさんありますが、主な違いはバイナリベースかテキストベースかだと思います。どちらも広く使われています。

テキストベースのプロトコルの場合、入力をトークン化してから のようなもので解析するのが非常に一般的yaccです。一部のテキストベースのプロトコルは、それよりも解析が容易なため、入力を分割して、意味があるかどうかを確認することができます。エンコーディングを考慮に入れる必要がありますが、組み込みメソッドまたはライブラリを介して言語で既にルーチンを持っているものでなければなりませんUTF-8。たとえば、HTTP はテキスト プロトコルであり、非常に簡単に解析できます (例はこちら)。

リクエスト:

GET /path/file.html HTTP/1.0
From: someuser@jmarshall.com
User-Agent: HTTPTool/1.0
[blank line here]

応答:

HTTP/1.0 200 OK
Date: Fri, 31 Dec 1999 23:59:59 GMT
Content-Type: text/html
Content-Length: 1354

<html>
<body>
<h1>Happy New Millennium!</h1>
(more file contents)
  .
  .
  .
</body>
</html>

ほとんどのプログラマーは、十分にテストされた完全なライブラリー実装に依存した方がよいとしても、そのためのパーサーを作成できます。

ただし、バイナリ プロトコルは多少異なります。最初に、 ASN.1 (テレコムで非常によく使用される)、プロトコル バッファなどを使用してメッセージをエンコード/デコードします。可能であれば、独自のバイナリ形式を発明しないでください。テスト済みで試行済みのライブラリに依存してください。これを正しく行うのは困難です。たとえば、ASN.1ほとんどのツールが高価であることは不思議ではありません。

これは、たとえば単純な要素を定義することです(ここASN.1 UPERからの例):

myQuestion FooQuestion ::= {
    trackingNumber     5,
    question           "Anybody there?"
}

そして、次のようにエンコードされます。

01 05 0e 83 bb ce 2d f9 3c a0 e9 a3 2f 2c af c0

すべてのビットシフトとマスキングにより、実装は非常に簡単ではありません。サポートされているオープンソースASN.1ライブラリPERが非常にまれなのはそのためです。

どちらのアプローチにも長所と短所があります。テキストベースのプロトコルは、正しく理解し、デバッグし、理解するのがいくらか簡単です。ただし、彼らは通常かなりおしゃべりであり、特定の状況下ではこれが非常に重要になります。これは、ASN.1 PER実装やデバッグが非常に困難ですが、非常にコンパクトな例を選択した場合です。

于 2013-02-18T11:11:22.530 に答える