1

ブラウザと Google の間の HTTP 交換の一部を調べていたところ、この質問が表示されました。

つまり、私のブラウザ (Firefox 36.0.4) は HTTP/1.1 リクエストを作成し、Google は HTTP/2.0 で応答しています。要求されたプロトコルで応答しようとはしません。HTTP/2.0 仕様の多くがすでに SPDY を介してでたらめな方法で実装されていることは承知していますが、これはクライアントとの不十分な交渉のように思えます。

ヘッダーでプロトコルを宣言する目的は、サーバーがクライアントへの応答方法を決定できるようにすることだと思いました。これは、次の 3 つの方法のいずれかです。

1.クライアントがサーバーの優先プロトコルを要求したため、サーバーは通常どおり要求を続行します。

2.クライアントは、サーバーがサポートする別のプロトコル バージョンを要求しました。サーバーは要求プロトコルで応答しますが、優先プロトコルを示すアップグレード ヘッダーが含まれています。クライアントは、サーバーが 101 Switching Protocols 応答を送信し、優先プロトコルに切り替える時点でアップグレードを要求することができます。

3.クライアントがサポートされていない、または古いプロトコルを要求した場合、サーバーはアップグレード ヘッダーでサポートされているプロトコル (優先順位の降順) を含む 426 Upgrade Required 応答を送信します。クライアントは、サポートされているプロトコルを使用して要求を繰り返す必要があります。

4.クライアントは、完全にサポートされていないメジャー プロトコル バージョンを再要求しました。たとえば、サーバーは HTTP/1.x のみをサポートしていますが、HTTP/2.x です。サーバーが 505 HTTP Version Not Supported で応答する

Google とのやり取りはこれを行っていません。これは悪い習慣ですか、それとも何か不足していますか?

ランダムに選択された例:

https://plus.google.com/u/0/_/notifications/frame?querystring=blahblahblah

GET /u/0/_/notifications/frame?querystring=blahblahblah HTTP/1.1
Host: plus.google.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-GB,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: https://www.google.co.uk/?gfe_rd=cr&ei=Lc8bVcXFOKbj8we_uIKYDg&gws_rd=ssl
Cookie: NID=67=iZxcMVTvg-6PsQIUpZ5tSPL-7-uJdls3vdci3afLmoLCpD5JOq0NfzhTnnpcCW9ymbXsn3GRGxfSgYlXGEk9XmnbUne0LCPrUc_ahhpc5wV6n-GZ8F7s-JS-JWgZWEwri-GaWXK1vgyRw7jMbqEiAUSRCzs1Fr1K6ZUIH0EpJdlwZD-K26MJNazpyHL_vZ5k4m8NrtFDkAoYPw; OTZ=2759671_52_56_123900_52_436380; SID=DQAAAP0AAAAqKgGz5aFNESd464Z_jUsmTi7JQfEKsuWkGZVJe8QvdbOPTZpL5ZNjKSsSSg9QvJglP-aMNLrgn2b7MsDF_4Z7Ebe1X347Cd3-j3ktLedgmq9nRO92hxEseqf974VNumrst-XqMj9Oq_xf-KDz-CDEJ1XiqWZYVHurV-IrXib5ei7x9dqlLF2NSPYLaCxlrwKdjCQX-FDDB03FWEuE7dIMYs3BQ-_NU5fG9os6I6r6ABy9mkiy84rraZFVthd38VJF5z2WYmgQ55QJPr9EDpSA5VKH1tbW6XyLjZLt5EEEj1xoqRF4EguRkIOiG8IiqRs49GnwqQSCpTw3ROW-jNDI; HSID=A7u8vyQI-v7jJSEbS; SSID=AOojY4hDLYgnSjUrK; APISID=z23KH1a0VsBukvMu/ARaOeOni08HfbGg6R; SAPISID=5iTgyxKDRPP7fNtF/AdiFbKNYN04h7n6cu; PREF=ID=cc54787f58f50d42:U=8e10581450dbe3b5:FF=0:LD=en:TM=1416091562:LM=1418086819:GM=1:S=0KVfl2hqkG8Psvwv; OGP=-5061451:-5061492:; OGPC=4061155-1:
Connection: keep-alive

HTTP/2.0 200 OK
Alternate-Protocol: 443:quic,p=0.5
Cache-Control: private, max-age=0
content-security-policy-report-only: script-src 'unsafe-inline' 'unsafe-eval' 'self' https://*.googleapis.com https://*.gstatic.com https://apis.google.com https://www.google-analytics.com https://www.googletagmanager.com https://*.talkgadget.google.com https://pagead2.googleadservices.com https://pagead2.googlesyndication.com https://tpc.googlesyndication.com https://s.ytimg.com https://www.youtube.com https://clients1.google.com https://www.google.com;report-uri /_/cspreport/es_oz_20150330.18_p0
Content-Type: text/html; charset=utf-8
Date: Wed, 01 Apr 2015 10:57:55 GMT
Expires: Wed, 01 Apr 2015 10:57:55 GMT
Server: GSE
x-content-type-options: nosniff
x-ua-compatible: IE=edge, chrome=1
X-XSS-Protection: 1; mode=block
X-Firefox-Spdy: h2-15
4

2 に答える 2

1

これは https リクエストです。クライアントは、SSL ハンドシェイクで ALPN (以前の NPN) 拡張を使用した HTTP/2.0 のサポートを発表しました。したがって、サーバーは、クライアントが HTTP/2.0 を実行できることを認識しています。この拡張子が指定されていない場合、サーバーは、クライアントの要求よりも高いメジャー HTTP バージョンで応答することはできません。

于 2015-04-01T19:00:29.993 に答える
0

応答の HTTP バージョンは、サーバーの機能を通知するものであり、応答の実際のプロトコル バージョンではありません。応答のプロトコル バージョンは、要求と共に送信されたものです。

過去には (おそらく今日でも)、古いクライアントが HTTP/1.0 リクエストを送信し、サーバーに次のように応答させるのが一般的でした:

GET / HTTP/1.0
User-Agent: Netscape/1.0

HTTP/1.1 200 OK
Content-Length: 0

<connection closed>

サーバーは、HTTP/1.1 を話すことができることをアドバタイズしましたが、応答では (接続を閉じることによって) HTTP/1.0 として動作しました。

あなたのケースでも同じことが起こっています: HTTP/1.1 リクエストを行うと、サーバーは HTTP/2.0 を話すことができることをアドバタイズし、HTTP/1.1 レスポンス形式で応答します。

その応答を受信したスマート クライアントは、そのサーバーに対して HTTP/2.0 の通信を開始できます。

于 2015-04-01T12:14:39.720 に答える