使用HTTP Keep-Alive让服务器与客户端进行通信

16

最近在一次面试中,我被问到如何设计在线聊天客户端应用程序的问题。我谈到了标准的“轮询”解决方案,但被打断了,因为面试官想了解“HTTP 1.1 keep-alive”方法。我使用HTTP已经有一段时间了,记得HTTP的整个初衷就是“无状态”,所以这从未发生过(还有,不要忘记“keep-alive”并没有一致地实现)。

我的问题是,当设置“keep-alive”标头时,Web服务器是否可以向客户端广播和/或发送信息?

3个回答

9
使用HTTP 1.1时,保持连接是默认行为。(在HTTP 1.0中,默认行为是关闭连接。)服务器必须发送“Connection: close”头以终止与第一个响应的连接。因此,仍然有一个TCP套接字可用于推送数据,但仅从服务器推送数据将严重违反HTTP协议。即使使用keep-alive,客户端仍然需要轮询服务器。
重要的是要区分HTTP Keepalive和TCP Keepalive。HTTP keepalive防止服务器或客户端关闭连接。当连接可能长时间处于空闲状态并可能被NAT代理或防火墙丢弃时,使用TCP keepalive。通过setsockopt()调用激活TCP keepalive的每个套接字。
在进行“长轮询”以消除重新轮询的需要时,可能需要使用TCP keepalive。

8
保持连接只是保持TCP套接字打开,因此每次轮询时,您可以节省TCP设置/拆除数据包的开销,但仍然需要轮询。
然而,“长轮询”是一种策略,用于向客户端广播通知。实质上,客户端发出GET请求,但是服务器不会立即响应,而是等待直到有通知要发送时,才对GET请求进行响应。这消除了任何需要通过网络进行轮询目的的数据包,并保持连接无状态,正如您正确提到的协议的目的之一。

5
你可以阅读更多关于Comet服务器的资料。这基本上就是面试官所问的方法。某些人对其有效性存在争议,但在几个类似情况下已被使用。
例如,我相信Gmail在某些方面使用了comet技术(但请勿引用我)。
另一个看起来相关的例子是BOSH,这是一种使用HTTP和XMPP传输聊天信息的协议。但我不认为使用keep-alive与此有关。

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