HTTP 1.1 消息协议和服务器发送的事件

HTTP 1.1 message protocol and server sent events

据我了解,在 1.1 中通常浏览器发出请求,服务器进行单个消息响应。浏览器在收到对先前消息的响应之前不会发出新的请求。所以它收到的任何响应总是被解释为对最后一条消息的响应。 我的理解正确吗?

当我在 Firefox 中打开一个页面时,服务器应用程序解析以下请求:

HGet / http/1.1
HeaderField(Host, localhost:8080)
HeaderField(User-Agent, Mozilla/5.0 (X11; Ubuntu; Linux x86_64;rv:41.0)     Gecko/20100101 Firefox/41.0)
HeaderField(Accept, text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8)
HeaderField(Accept-Language, en-GB,en;q=0.5)
HeaderField(Accept-Encoding, gzip, deflate)
HeaderField(Connection, keep-alive)

在页面响应后,通常会跟随一个 /favicon.ico 请求,并且事情如预期的那样在前面。但现在我已将以下行插入到我的 javascript 中以启用服务器发送的事件:

var evtSource = new EventSource("/");

产生第二个请求:

HGet / http/1.1
HeaderField(Host, localhost:8080)
HeaderField(User-Agent, Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:41.0) Gecko/20100101 Firefox/41.0)
HeaderField(Accept, text/event-stream)
HeaderField(Accept-Language, en-GB,en;q=0.5)
HeaderField(Accept-Encoding, gzip, deflate)
HeaderField(Referer, http://localhost:8080/)
HeaderField(Connection, keep-alive)
HeaderField(Pragma, no-cache)
HeaderField(Cache-Control, no-cache

那么我现在可以随时从服务器发送多条消息吗?(撇开超时问题不谈)如果是这样的话浏览器如何知道发送给哪个消息?请求,消息(来自服务器)是响应? 是否依赖于 contentType header 字段?我应该在事件源中使用不同的 uri 吗?因为我正在学习让事情变得简单,所以我没有使用加密,这使我无法使用 HTTP 2。但后来我打算使用 https。我更喜欢对正常的 get 和 post 请求使用与服务器发送事件相同的 uri,因为我不想在未加密的响应行中放置不必要的信息。

编辑:我的困惑来自忘记 http 1.1 浏览器会在需要时打开多个连接。因此,在我的简单设置中,浏览器只打开一个连接,它将那个连接转换为服务器发送事件连接,然后在具有不同客户端端口号的新连接上发出未来请求。

那么我现在可以随时从服务器发送多条消息吗?

是的。

浏览器如何知道消息(来自服务器)是对哪个请求的响应

这不是请求。它是一个开放的 HTTP 连接。所以浏览器只在它保持打开的打开连接上接收事件。

有道理吗?