为什么说 HTTP 协议是无连接、无状态的?

2016-06-16 15:13:16 +08:00
 xcc7624

简略的看了一下《 HTTP 权威指南》好像在这里面根本就没有总结出这样的说法。

如果有的话请帮忙指明一下章节

5369 次点击
所在节点    HTTP
18 条回复
bearice
2016-06-16 15:26:50 +08:00
"It (HTTP) is a generic, *stateless*, protocol which can be used for many tasks beyond its use for hypertext"

-- RFC2616, Page 0, Abstract
xcc7624
2016-06-16 15:42:23 +08:00
@bearice https://tools.ietf.org/html/rfc6265
HTTP State Management Mechanism
并且《 HTTP 权威指南》中文版第 11 章第 1 节开头就说 HTTP 协议最初是被设计为一种无状态的协议,但是现在被扩展了,还算不算是一种无状态的协议?
xcc7624
2016-06-16 15:50:58 +08:00
@bearice 无状态这个词还在《 HTTP 权威指南》里出现过,**无连接**这个词好像在前 4 章都没出现过。
clino
2016-06-16 15:52:20 +08:00
"无状态"是对的,但是"无连接"是谁说的?
bearice
2016-06-16 15:59:20 +08:00
@xcc7624 HTTP 协议本身是无状态的,主要意思是指后一个报文(请求)和前一个报文没有必然的联系,但是在无状态的协议上模拟状态是上层应用的事儿,比如 IP 协议就是无状态的, TCP 是有状态的一样。

至于『无连接』 这个是哪里说得?
xcc7624
2016-06-16 16:11:27 +08:00
@clino
@bearice
上网搜索,“ http 无状态”一大堆文章说“无连接”
ss098
2016-06-16 16:13:27 +08:00
> 无状态服务器是指一种把每个请求作为与之前任何请求都无关的独立的事务的服务器。

摘自 https://zh.wikipedia.org/wiki/%E6%97%A0%E7%8A%B6%E6%80%81%E5%8D%8F%E8%AE%AE

> 并且《 HTTP 权威指南》中文版第 11 章第 1 节开头就说 HTTP 协议最初是被设计为一种无状态的协议,但是现在被扩展了,还算不算是一种无状态的协议?

我认为:即使现在的应用使用 Session 等方法来辨别用户,这个也不是在 HTTP 协议层面来实现的,而是由后端服务器来实现的,所以现在依然是无状态协议。

拿 Google 搜了一下关键字“ http 无连接”,搜出来这个:

http://blog.csdn.net/tennysonsky/article/details/44562435

但是没有其他相关的资料,我认为“无连接”这个概念是错的。
shyling
2016-06-16 16:22:56 +08:00
无状态就是不像 ssh,ftp 之类的先登录然后.....
xcc7624
2016-06-16 16:36:57 +08:00
@ss098 《 HTTP 权威指南》第 11 章说了 cookie 但是没提到过 session ,整本书好像都没有提到过 session 。这里不得不提一个问题, session 到底是什么,有什么用?有没有 RFC 提到?
@bearice
@clino
mornlight
2016-06-16 16:39:57 +08:00
@xcc7624 session 是上层抽象出的概念, HTTP 协议里本身没有所谓的 session ,只有 Cookie
具体的讨论你搜一下本站的帖子
clino
2016-06-16 16:42:05 +08:00
@xcc7624 session 一般翻译成"会话","连接"一般是 connection,比如 tcp connection
xcc7624
2016-06-16 16:48:09 +08:00
@clino
@mornlight
我觉得 session 还是主要用来在服务器中不同的 HTTP 请求之间共享数据,毕竟各个 HTTP 请求之间是无状态的。
但是如果符合这个作用的机制都能叫 session 了吗?
clino
2016-06-16 16:56:32 +08:00
想起 uliweb 文档里对 session 有简单的介绍: http://limodou.github.io/uliweb-doc/zh_CN/session.html#title_1-2
xcc7624
2016-06-16 17:26:40 +08:00
@clino 我说一下我对这介绍的理解看对不, session 在这个 web 框架里是作为一个组件实现,实现了这个 RFC 的部分功能 https://tools.ietf.org/html/rfc6265 ,识别 HTTP 请求头里的 cookie 带的 session_id 的 HTTP 请求是否已经在有效时间访问过了。
一句话总结就是” session"就是 RFCC6265 HTTP State Management Mechanism 的服务器端实现?
clino
2016-06-16 17:50:56 +08:00
@xcc7624 我觉得这样不准确, rfc6265 是 "defines the HTTP Cookie and Set-Cookie header fields." ,而 Set-Cookie 的主要实现是在客户端如浏览器上做的
session 在 web 里会利用这个机制来实现用户会话, rfc6265 没细看,但应该没有写服务端如何利用 Set-Cookie 来达到实现用户会话的功能,这部分在服务端除了要按照 rfc 在 http header 里加上相关的字段以外,其实应该是比较自由的
xcc7624
2016-06-16 18:24:37 +08:00
@clino 那么到底什么是 session ,又没有比较正式的文档说明?
session 的作用大概就是
1 、识别 HTTP 客户端
2 、在 HTTP 请求间共享数据。
clino
2016-06-16 19:58:43 +08:00
@xcc7624 我不知道哪里有,因为比较自由所以估计都是自己实现的,但大体上差不多,就是存一个 session id,从 session id 能查到会话相关的信息,最常见的就是用户的 id
"在 HTTP 请求间共享数据"可以有这个作用,但是你要弄清楚一般是怎么达到这个目的的
SoloCompany
2016-06-16 23:23:08 +08:00
无状态基本上就等价于无连接
有连接就代表需要建立握手之后才能传输 payload ,可以理解为相当于 tcp
无连接就是随时都可以传输 payload 不需要握手,相当于 udp

TCP 是有连接有状态的
这不影响建立在 TCP 之上的 HTTP 无连接无状态
因为同一个 TCP 连接上所传输的每个 HTTP 请求都是完全独立无关的
HTTP 的无连接无状态也不影响其衍生出来的 websocket 协议是有状态有连接的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/286179

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX