首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多协议-正确的实现

多协议-正确的实现
EN

Stack Overflow用户
提问于 2015-04-01 10:39:01
回答 2查看 370关注 0票数 1

我正在检查浏览器和Google之间的一些HTTP交换,这引发了这个问题。

简而言之,我的浏览器(Firefox 36.0.4)发出HTTP/1.1请求,Google使用HTTP/2.0进行响应;在请求的协议中没有尝试响应。我知道很多HTTP/2.0规范已经通过SPDY随意地实现了,但这似乎是对客户端的一种糟糕的新发现。

我认为在报头中声明协议的目的是,服务器将能够确定它的应该如何响应客户机,这有三种方式之一:

1.客户机已请求服务器的首选协议,因此服务器继续正常地进行请求 2.客户端请求服务器支持的另一个协议版本,服务器在请求协议中进行响应,但是包含一个显示其首选协议的升级头。客户端可以请求升级,此时服务器将发送101交换协议响应并切换到首选协议。 3.客户端请求一个不受支持的或过时的协议,服务器在升级标头中发送一个支持的协议(按优先顺序降序)的426个升级所需的响应;客户端必须用支持的协议重复请求。 4.客户机重新设计了一个完全不受支持的主要协议版本,例如HTTP/2.x,而服务器只支持HTTP1.x。服务器响应时不支持505 HTTP版本

与谷歌的交流并没有做到这一点;这是糟糕的实践,还是我遗漏了什么?

一个随机选择的例子:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-01 19:00:29

这是一个https请求。客户端在SSL握手中宣布了对带有ALPN (以前的NPN)扩展的HTTP/2.0的支持。因此,服务器知道客户机可以执行HTTP/2.0。如果没有提供此扩展,则不允许服务器使用比客户端请求更高的主要HTTP版本进行答复。

票数 1
EN

Stack Overflow用户

发布于 2015-04-01 12:14:39

响应中的HTTP版本是服务器功能的公告,而不是响应的实际协议版本。响应的协议版本是与请求一起发送的协议版本。

在过去(但可能是现在),老客户端发送HTTP/1.0请求并让服务器以这种方式进行响应是很常见的:

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29388655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档