7

HTTPサーバーが複数のパケットを介してデータを送信する正しい方法は何ですか?

たとえば、ファイルを転送したい場合、最初に送信するパケットは次のとおりです。

HTTP/1.1 200 OK
Content-type: application/force-download
Content-Type: application/download
Content-Type: application/octet-stream
Content-Description: File Transfer
Content-disposition: attachment; filename=test.dat
Content-Transfer-Encoding: chunked

400
<first 1024 bytes here>

400
<next 1024 bytes here>

400
<next 1024 bytes here>

送信するだけの場合は、新しいパケットを作成する必要があります。

400
<next 1024 bytes here>

すべてのクライアントが私の接続を閉じ、ファイルが短くなります。

データストリームを続行するために、2番目のパケットにどのヘッダーを入れますか?

4

5 に答える 5

3

HTTPにはパケットの概念がありません。HTTPストリームを1バイトのパケットに分割することもできます。

チャンクエンコーディングの場合、RFCで指定されているように、各チャンク(パケットとは関係ありません)に必要なヘッダーを指定する必要があります。

于 2010-05-06T23:35:03.910 に答える
3

担当者が不足しているため、質問にコメントすることはできず、答えるだけでよいようです。そのため、「パケットを含む組み込みデバイスのWebサーバーにHTTP1.1を実装しようとしている」と想定しています。ストリーム指向のネットワークスタックではなく、指向のネットワークスタック」が当てはまるか、パケットについて話しているのではありません。(チャンクについて話している場合は、他の回答を参照してください。)

可能であれば、ソケットを使用してください。パケットで考える必要はありません。おそらく、ネットワークスタックのどこかにラッパーがあります。ない場合は、パフォーマンスをそれほど悪くしないものを作成してください。

なんらかの理由でできない場合は、おそらく最初のパケットのサイズを吹き飛ばしています。MTUはおそらく1500または1492(またはそれ以下)のようなものであり、「最初のパケット」に+ 5 + 1024 + 5 + 1024 + 5+1024バイトがリストされています。あなたのネットワークスタックはあなたにエラーコードを与えないほど十分に吸うかもしれません、あるいはあなたのコードはそれらをチェックしていないかもしれません-あるいはそれは同様に役に立たない何かをしているかもしれません。

于 2010-05-06T23:46:55.343 に答える
2

まず、必要なヘッダーは

Transfer-Encoding: chunked

ではありませんContent-Transfer-Encoding

また、なぜ3つの異なるContent-Typeヘッダーを送信するのですか?

于 2010-05-06T23:45:53.177 に答える
2

通常、サーバー側のヘッダーAccept-Rangesとヘッダーを使用して、サーバーが再開を受け入れることをクライアントに通知します。Content-Range次に、クライアントはRangeヘッダーを送り返して、部分的なダウンロードを要求します。

ヘッダーには完全なファイル長の概念が必要であり、これContent-Rangeはここでは不明であるように見えるため(そうでない場合、エンコードを選択する理由はまったくありませんでしたchunked)、標準のHTTP仕様に関しては失われます。別のプロトコルを選択するか、独自の仕様を独自に作成するか、いずれにせよ、コンテンツの長さを事前に確認する別の方法を探します。


とはいえ、3つのContent-Typeヘッダーは意味がありません。いずれかを選択してください。また、Content-Transfer-Encoding間違っている、それはされているはずTransfer-Encodingです。

于 2010-05-07T00:03:24.683 に答える
0

あなたは本当にrfcを参照する必要があります:http ://www.w3.org/Protocols/rfc2616/rfc2616.html

具体的には:http ://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.6.1

于 2010-05-06T23:16:11.297 に答える