アプリケーションプロトコルを解析する従来の方法は何ですか?
既に設計されたプロトコル (SMTP など) のソケットからのストリームが与えられた場合、プロトコルを処理する通常の方法は何ですか。それは yacc ベースのパーサーですか、正規表現ベースのアプローチですか、それとも他の方法ですか?
アプリケーションプロトコルを解析する従来の方法は何ですか?
既に設計されたプロトコル (SMTP など) のソケットからのストリームが与えられた場合、プロトコルを処理する通常の方法は何ですか。それは yacc ベースのパーサーですか、正規表現ベースのアプローチですか、それとも他の方法ですか?
アプリケーション層のプロトコルはたくさんありますが、主な違いはバイナリベースかテキストベースかだと思います。どちらも広く使われています。
テキストベースのプロトコルの場合、入力をトークン化してから のようなもので解析するのが非常に一般的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
実装やデバッグが非常に困難ですが、非常にコンパクトな例を選択した場合です。