このncコマンドはHTTPサーバーとしてどのように機能しますか?

このncコマンドはHTTPサーバーとしてどのように機能しますか?

持つ回答HTTP経由でファイルを提供nc

{ echo -ne "HTTP/1.0 200 OK\r\n\r\n"; cat some.file; } | nc -l -p 8080
{ echo -ne "HTTP/1.0 200 OK\r\nContent-Length: $(wc -c <some.file)\r\n\r\n"; cat some.file; } | nc -l -p 8080

コメント説明する:

2番目のncコマンドを使用しない限り、Chromeは凍結を停止しません。

また、応答後に nc コマンド show が終了するわけではありません。次のコマンドを使用して再起動できますwhile :; do { echo -ne "HTTP/1.0 200 OK\r\nContent-Length: $(wc -c <some.file)\r\n\r\n"; cat some.file; } | nc -l -p 8080; done。 Ctrl + Zを使ってスリープモードに切り替えます。

バウンスが発生すると、Webブラウザが自動的にURLを再ロードすることを意味しますか?

Chromeがジャンプするのを防ぐために、最初のncコマンドに追加された2番目のncコマンドの目的はありますかContent-Length: $(wc -c <some.file)

URLhttp://IP:8080/の後に何も追加しない場合、または何も追加しない場合は、Webブラウザからファイルをインポートできます。これらの柔軟性はncHTTPプロトコルで提供されますか、それともWebブラウザで提供されますか?

ありがとうございます。

答え1

Chromeは転送されるファイルのサイズがわからないため、コマンドの最初のバージョンを引き続き使用するため、いつファイルがすべて受信されたのかわかりません。 。

2 番目のバージョンでは、ファイル コンテンツの前にペイロード サイズとともに HTTP ヘッダーが追加されるため、Chrome は必要なデータ量を認識し、ファイルの終わりに達するとトランザクションが完了したとマークします。

ncHTTP/1.0 200 OK\r\nHTTPプロトコルを介してコンテンツを転送するために必要な絶対最小値(そうではありませんが、許容できるコンテンツは非常に寛大です)を実装することと組み合わせて、仕様Content-Lengthに近い作業が追加されました。 HTTPプロトコルには詳細なドキュメントがありますので、お読みください。RFカード

編集する:

  1. バウンスは、ブラウザがページの読み込みが完了していないと思うことを意味します。したがって、Chromeはすべてのファイルがあると判断するまでホッピングし続けます。
  2. URLのコンポーネントを理解する必要がありますが、ポート番号の後ろの部分はサーバーが提供するリソースを指します。この場合、サーバーはユーザーが要求した内容を気にせず、常に返します。some.file
  3. この質問には本当に答えることはできません。タイプミスだと思いますnotenot

答え2

HTTP/1.0 では、応答に Content-Length ヘッダーがない場合は、ソケットを閉じて応答の終わりを示します。ncこれはデフォルトでは行われないため、Chrome(または他のブラウザ)はこれが発生するまで「永久に」(「フラッター」)待ちます。

最初のコマンドにパラメータを追加すると-N正常に動作します。nc

{ echo -ne "HTTP/1.0 200 OK\r\n\r\n"; cat some.file; } | nc -N -l -p 8080

HTTP / 1.0ではContent-Lengthヘッダーは必要ありません(rfc1945 セクション 7.2.2)本文が必要なく空白の場合(セクション7.2)。

URL をhttp://IP:8080/使用すると、ブラウザは IP およびポート以降のすべてのエントリをサーバーに送信します。この場合、/サーバーが期待する内容を示す最後の項目のみを送信します。例ncコマンドでは、/ブラウザが送信するもの(または実際には他のもの)は完全に無視され、応答は常に同じです。したがって、http://IP:8080/hello/world.png同じ結果を使用できます。

関連情報