其他 有关 "HTTP 协议是无状态的和 Connection: keep-alive 的区别" 的疑问

tsinghan · 2012年02月14日 · 最后由 hooopo 回复于 2012年02月15日 · 18366 次阅读

看到有篇帖子 有关 http 的以下介绍,有几个疑问, 1 HTTP 是一个无状态的面向连接的协议 这个连接是知的 TCP 连接吗? 2 保持连接性 是指的保持 TCP 连接吗? 3 HTTP 两次不同的请求 第一次请求之后,服务器端立即关闭连接、释放资源 这里的关闭连接 是指关闭哪个链接?如果此时 Connection: keep-alive 呢?

无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系 HTTP 是一个无状态的面向连接的协议,无状态不代表 HTTP 不能保持 TCP 连接,更不能代表 HTTP 使用的是 UDP 协议(无连接) 从 HTTP/1.1 起,默认都开启了 Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接 Keep-Alive 不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如 Apache)中设定这个时间

有无状态是和 ftp 相比的吧

随手翻《用 TCP/IP 进行网际互联:第三卷 客户端 - 服务器编程与应用》:

服务器所维护的与客户交互活动的信息称为状态信息。不保存任何状态信息的服务器称为无状态服务器(stateless server),反之则称为有状态服务器(stateful server)。

面向连接对应的是底层使用 TCP,无连接对应的是 UDP。

==========

HTTP 的无状态,指的就是在在应用层这个层次上,服务器没有保存客户端的状态信息吧,客户端必须每次带上自己的状态去请求服务器(比如 cookie、session 等)。面向连接,就是底层使用 TCP。

keep-alive 是连接层上的事情,上层不会有影响。只是为了节省建立多次 tcp 连接的成本. 具体见:http://en.wikipedia.org/wiki/HTTP_persistent_connection

需要 登录 后方可回复, 如果你还没有账号请 注册新账号