HTTP:流水线、持久连接和服务器推送事件之间有什么关系?

9
我正在尝试了解HTTP pipelining和HTTP keep-alive连接,以及试图在这两个主题和服务器发送事件技术之间建立联系。
据我所知,HTTP keep-alive连接是在HTTP 1.1中使用TCP的默认方式,一旦建立TCP连接,就可以使用该连接依次发送多个HTTP请求。HTTP pipelining是客户端在使用同一TCP连接时,在未收到先前请求的响应的情况下向服务器发送请求的能力,通常不作为浏览器的默认方式。
我的问题如下:
1)如果可以使用一个TCP连接依次发送多个请求到服务器 - 客户端如何区分响应?我猜客户端使用服务器按FIFO顺序发送响应?
2)为什么不幂等的请求,例如POST请求不应该进行pipelining(根据维基百科)?
3)Web服务器的限制如何?可能打开的TCP连接数量是否有限制?如果是,那么如果某些客户端保持keep-alive连接,则其他客户端无法建立连接,这可能会导致问题,对吗?
4)服务器发送事件正在使用keep-alive连接,但据我所知,SSE并没有使用pipelining。相反,它们设法处理一个请求的多个响应,或者当下一个带有事件的响应到达时,它们只是发送另一个请求。哪种猜测是正确的?
5)一个TCP连接意味着一个套接字吗?一个套接字意味着一个TCP连接吗?关闭/打开套接字意味着关闭/打开TCP连接吗?
1个回答

6
  1. 是的,FIFO。TCP/IP保证按顺序传递数据,所以响应不能以不同的顺序到达(如果服务器/代理有错并发送了错序的响应,则你完全无法处理)。

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

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

  4. SSE不依赖Keep-Alive。它不使用多个响应。它是一个需要“下载”很长时间的单个响应,因此对于SSE,管道处理或keep-alive都是无关紧要的。当SSE响应正在发送时,TCP/IP连接无法返回更多的响应。
    SSE会让服务器忙碌,只要连接处于打开状态(因此对于每个用户通常始终如一)。这就是为什么最好使用具有处理数十万连接能力的Node.js/Tornado等技术来使用SSE,而不是设计用于同时处理少量连接的PHP/Apache。

  5. 套接字是TCP/IP连接的编程接口。通常情况下,一个套接字就是一个连接。


感谢porneL!1)如果某些响应与发送顺序不一致怎么办?3)使用代理的好处是什么?它必须与服务器建立相同的连接吗?4)因此,使用SSE意味着+1个连接,从而增加了服务器负载? - KutaBeach
@KutaBeach 我已经扩展了我的回答。 - Kornel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接