9

我试图了解什么是 HTTP 管道和 HTTP 保持连接,并试图在这两个主题和服务器发送事件技术之间建立连接。

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

我的问题:

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

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

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

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

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

4

1 回答 1

5
  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 连接的编程接口。通常是的,一个套接字是一个连接。

于 2013-09-01T18:51:07.250 回答