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

时间:2013-06-25 11:19:47

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

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

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

我的问题:

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

2)为什么非幂等请求(如POST请求)不应该被流水线化(根据维基百科)?

3)Web服务器的局限性是什么:可能的开放TCP连接数量是多少?如果是,那么如果某些客户端持有保持活动连接,则其他客户端无法建立连接,这可能会导致问题,对吧?

4)Server Sent Events正在使用keep-alive连接,但据我所知,SSE没有使用流水线技术。相反,他们设法处理对一个请求的多个响应,或者他们只是在下一个事件响应到达时发送另一个请求。哪种猜测是正确的?

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

1 个答案:

答案 0 :(得分:4)

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