3

http パーサーを実装しています。http データの指標として、「HTTP/1.?」を検索しています。ストリーム内の CRLF'。TCP レイヤーは、アプリケーションが提供するバッファーを、ネットワーク経由での転送に適したチャンクに分割する場合があります。TCP ヘッダーの直後にhttp データ (例: GET http://www.google.com/index.html HTTP/1.1 CRLF) が続かないことは可能ですか? また、たとえば「GET ..」クエリを TCP セグメントに分割することは可能ですか?

ありがとう。

マーク

4

2 に答える 2

3

TCP では、基本的に、セグメンテーションがどこでも発生する可能性があると想定する必要があります。解析スタックを設計する際には、これを考慮する必要があります。1 つのセグメントを読むことができず、何かを読むのに十分であると想定します。したがって、賢明な方法は、TCP をストリームとして表示し、レクサーの下に配置することです。パーサー/レクサーへの呼び出しに少し時間がかかるか、エラーが発生する可能性があるという事実に対応する必要があります。

于 2013-04-04T13:16:59.227 に答える
3

TCP ヘッダーの直後にhttp データ (例: GET http://www.google.com/index.html HTTP/1.1 CRLF) が続かないことは可能ですか?

可能です はい。HTTP パイプラインにより、1 つのセグメントに複数のリクエストを含めることができます。

また、たとえば「GET ..」クエリを TCP セグメントに分割することは可能ですか?

はい。リクエスト サイズは、セグメント サイズよりも大きくなる場合があります。さらに、IP 層で TCP セグメントの断片化が発生する可能性があります。

これはまれな自然発生ですが、意図的な回避の一部である可能性があります。

確実にする唯一の方法は、ストリームを再アセンブルすることですが、これは処理とメモリの点でコストがかかります。そんなに気にするなら、透過的な HTTP プロキシを使用したほうがよいかもしれません。

于 2013-04-04T14:41:47.300 に答える