HTTP:流水线、保持事件和服务器发送事件之间的关系是什么?

标签 http keep-alive server-sent-events http-pipelining

我试图了解什么是 HTTP 流水线和 HTTP keep-alive 连接,并试图在这两个主题和 Server Sent 事件技术之间建立联系。

据我了解, HTTP keep-alive connection 是 HTTP 1.1 使用 TCP 的默认方式,当一次建立的 TCP 连接用于一个接一个地发送多个 HTTP 请求时。 HTTP 流水线 是客户端向服务器发送请求的能力,同时尚未使用相同的 TCP 连接收到对先前请求的响应,通常不用作浏览器中的默认方式。

我的问题:

1) 如果可以使用一个 TCP 连接一个接一个地向服务器发送多个请求 - 客户端如何区分响应?我猜客户端正在使用服务器发送响应的 FIFO 顺序?

2) 为什么不应该对 POST 请求等非幂等请求进行流水线处理(根据维基百科)?

3) Web 服务器的局限性如何:可能打开的 TCP 连接数是否受限?如果是,那么如果一些客户端保持连接,其他客户端无法建立连接,这会导致问题,对吗?

4) 服务器发送的事件正在使用保持连接,但据我所知,SSE 没有使用流水线。相反,他们设法处理对一个请求的多个响应,或者他们可能只是在下一个事件响应到达时发送另一个请求。哪个猜对了?

5) 一个 TCP 连接意味着一个套接字?一个套接字意味着一个 TCP 连接?关闭/打开套接字是否意味着关闭/打开 TCP 连接?

最佳答案

  1. 是的,先进先出。 TCP/IP 保证按顺序传送数据,因此响应不能以不同的顺序到达(如果服务器/代理有问题并且以错误的顺序发送响应那么你就完蛋了)。

  2. 根据 HTTP 规范,我不记得有任何原因。这可能只是谨慎,因为流水线在某些代理/服务器中实现不佳。

  3. HTTP 规范建议每台服务器 2 个连接,浏览器已确定每台服务器 6-8 个连接,但没有固定限制。连接耗尽对于 Apache 来说是一个真正的问题,对于高负载情况,建议在 Apache 中禁用 KeepAlive 并使用可以廉价地为客户端提供 Keep-Alive 功能的代理(例如 HAProxy)。
    代理的好处是一个代理可以将连接分发到多个服务器(有助于扩展),或者可以修改流量(例如 gzip 压缩所有内容,即使服务器端软件没有压缩)。

  4. SSE 不依赖于 Keep-Alive。它没有使用多重响应。这是一个永远需要“下载”的单一响应,因此流水线或保持事件与 SSE 无关。发送 SSE 响应时,TCP/IP 连接无法再返回任何响应。
    只要连接处于打开状态,SSE 就会使服务器保持忙碌(因此通常对每个用户来说都是如此)。这就是为什么最好将 SSE 与可以处理数十万个连接的 Node.js/Tornado 一起使用,而不是将 PHP/Apache 用于一次处理几个连接。

  5. 套接字是 TCP/IP 连接的编程接口(interface)。通常是的,一个套接字就是一个连接。

关于HTTP:流水线、保持事件和服务器发送事件之间的关系是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17295939/

相关文章:

java - jetty 服务器 : keep alive timeout for HTTP connection

grails - 如何避免客户端防火墙关闭连接,因为在 Grails 上处理数据时不活动

javascript - 有没有办法让每个用户而不是每个选项卡运行一个服务器发送事件?

.net - 通过身份验证自动从网站下载图片,第二部分

rest - 使用一次性密码来保护 REST 应用程序是个好主意吗?

iOS:如何正确安装保持事件处理程序?

cURL - 构造请求以验证服务器发送的事件

apache - HTML5 服务器发送事件原型(prototype)制作 - 模棱两可的错误和重复轮询?

http - Flutter - 向我的服务器发出 HTTP 发布请求时出错

json - Symfony2 - 检查接受 HTTP header 是否支持 "application/json"