最近,在一次面试中,我被问到如何处理在线聊天客户端应用程序。我通过了标准的“轮询”解决方案,但被切断了,因为面试官正在寻找"HTTP 1.1 keep-alive“方法。我已经使用HTTP很长一段时间了,并且记住整个要点是“无状态”的,我从来没有想到过这一点(而且,更不用说keep-alive并没有始终如一地实现)。
我的问题是,当设置了"keep-alive“头时,web服务器是否有可能向客户端广播和/或发送信息?
发布于 2009-01-04 18:55:07
对于HTTP 1.1,keep-alive是默认行为。(在HTTP 1.0中,默认行为是关闭连接。)服务器必须发送“connection : close”报头,以便在第一次响应时终止连接。因此,仍然有TCP套接字可用于推送数据,但仅从服务器推送数据在很大程度上违反了HTTP协议。即使使用keep-alive,客户端仍必须轮询服务器。
区分HTTP Keepalive和TCP Keepalive非常重要。HTTP keepalive可防止服务器或客户端关闭连接。当连接可能在较长时间内处于空闲状态并且可能被NAT代理或防火墙丢弃时,将使用TCP保持连接。通过setsockopt()调用以套接字为单位激活TCP keepalive。
在执行“长轮询”以消除重新轮询的需要时,可能需要TCP keepalive。
发布于 2009-01-04 19:25:07
Keep-alive只是将TCP套接字保持为打开状态,因此每次轮询时,都可以节省TCP setup/teardown数据包的开销--但仍然需要轮询。
但是,“长轮询”是web服务器向客户端广播通知的一种策略。本质上,客户端发出GET请求,但web服务器不是立即响应,而是等待,直到它们有通知要发送,在这一点上,它们响应GET请求。这样就不需要数据包通过线路进行轮询,并使连接保持无状态,正如您正确地提到的,这是协议的目的之一。
https://stackoverflow.com/questions/411460
复制相似问题