2017-11-16 10 views
0

私は最初からウェブサーバーを構築しています。私はChromeからいくつかの奇妙な動作に気付いています。私は/にGETリクエストのためにChromeから取得要求には、次のようになります。特別なChromeが接続を開いても何も送信しないのはなぜですか?

GET/HTTP/1.1 
Host: localhost:8000 
Connection: keep-alive 
Pragma: no-cache 
Cache-Control: no-cache 
Upgrade-Insecure-Requests: 1 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 
DNT: 1 
Accept-Encoding: gzip, deflate, br 
Accept-Language: en-US,en;q=0.9 

何もないが、それはまた、私のサーバーに別の要求を作成し、それを待っている私のサーバーにつながる何かを、送信しません着信メッセージは永遠に。

この現象はSafariでは見つかりません。私はすべての単一の要求に対して403で応答するようにサーバーを設定しましたが、永続的な接続は残ります。この接続の目的は何ですか?どうすれば対応できますか?私はHTTPプロトコルから何かを見逃していますか?

答えて

1

HTTP/1.1ブラウザは複数のTCP接続を開く傾向があります。サーバーが一度に1つの接続にしか対応できない場合、デッドロックが発生する可能性があります。要求の準備ができたら、スレッドまたは非ブロックIO(select)を使用して各接続を処理する必要があります。

Chromeはおそらく追加のソケットを開いているので、最初のソケットが閉じると準備が整いますが、わかりません。 HTTP/1.1はソケットを閉じる以外にリクエスト/レスポンスをキャンセルする方法がなく、応答が終了した後にサーバがConnection: closeを送信する可能性もあるので、ブラウザは将来のリクエストのために準備しています。

+0

前の方が効率的になる前にChroneが別の接続を開くのは合理的ですが、私のサーバーはすべての要求に 'Connection:close'を含めています。おそらくあなたは正しいと言えます。それは次の要求を待っているChromeですが、Chromeをもっと速く見せるためにサーバーの時間を無駄にしているようには思えません。 –

関連する問題