使用HTTP使服务器保持活动状态以与客户端通信

使用HTTP使服务器保持活动状态以与客户端通信,http,chat,keep-alive,Http,Chat,Keep Alive,最近在一次采访中,我被问及如何使用在线聊天客户端应用程序。我使用了标准的“轮询”解决方案,但由于面试官正在寻找“HTTP 1.1保持活力”方法,所以被打断了。在使用HTTP很长一段时间后,我还记得整个要点是“无状态的”,但我从来没有想到过这一点(更不用说keep alive没有得到一致的实现) 我的问题是,当设置了“保持活动”标头时,web服务器是否可以向客户端广播和/或发送信息?对于HTTP 1.1,保持活动是默认行为。(在HTTP 1.0中,默认行为是关闭连接。)服务器必须发送“连接:关闭”

最近在一次采访中,我被问及如何使用在线聊天客户端应用程序。我使用了标准的“轮询”解决方案,但由于面试官正在寻找“HTTP 1.1保持活力”方法,所以被打断了。在使用HTTP很长一段时间后,我还记得整个要点是“无状态的”,但我从来没有想到过这一点(更不用说keep alive没有得到一致的实现)


我的问题是,当设置了“保持活动”标头时,web服务器是否可以向客户端广播和/或发送信息?

对于HTTP 1.1,保持活动是默认行为。(在HTTP 1.0中,默认行为是关闭连接。)服务器必须发送“连接:关闭”“标头终止与第一个响应的连接。因此,仍然有一个TCP套接字可用于推送数据,但仅仅从服务器推送数据在很大程度上会违反HTTP协议。即使使用keep-alive,客户端仍然必须轮询服务器

区分HTTP Keepalive和TCP Keepalive很重要。HTTP keepalive阻止服务器或客户端关闭连接。TCP keepalive在连接可能长时间处于空闲状态并且可能被NAT代理或防火墙丢弃时使用。TCP keepalive是通过setsockopt()调用在每个套接字上激活的

在执行“长轮询”以消除重新轮询的需要时,可能需要TCP keepalive。

您可能会阅读有关服务器的更多信息。这听起来基本上就像面试官所问的方法。有些人对其有效性存在争议,但在一些类似的情况下也使用过

例如,我相信gmail在某些方面使用了comet技术(但不要引用我的话)


另一个似乎相关的例子是,这是一个使用HTTP和XMPP传输聊天信息的协议。但是我不相信使用keep-alive与此有关。

keep-alive只是打开一个TCP套接字,因此每次轮询时,您都可以节省TCP设置/拆卸数据包的开销,但您仍然需要轮询

然而,“长轮询”是web服务器向客户端广播通知的一种策略。本质上,客户机发出GET请求,但web服务器不是立即响应,而是等待它们收到要发送的通知,然后响应GET请求。这消除了出于轮询目的对数据包进行跨线传输的任何需要,并保持连接无状态,正如您正确提到的,这是协议的目的之一