V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
httpbin - 协议调试工具
httpstatuses - 协议状态码查询
httpie - cURL-like tool for humans
Fiddler
xcc7624
V2EX  ›  HTTP

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

  •  
  •   xcc7624 · 2016-06-16 15:13:16 +08:00 · 5516 次点击
    这是一个创建于 3082 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    至于『无连接』 这个是哪里说得?
    xcc7624
        6
    xcc7624  
    OP
       2016-06-16 16:11:27 +08:00
    @clino
    @bearice
    上网搜索,“ http 无状态”一大堆文章说“无连接”
    ss098
        7
    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
        8
    shyling  
       2016-06-16 16:22:56 +08:00 via Android
    无状态就是不像 ssh,ftp 之类的先登录然后.....
    xcc7624
        9
    xcc7624  
    OP
       2016-06-16 16:36:57 +08:00
    @ss098 《 HTTP 权威指南》第 11 章说了 cookie 但是没提到过 session ,整本书好像都没有提到过 session 。这里不得不提一个问题, session 到底是什么,有什么用?有没有 RFC 提到?
    @bearice
    @clino
    mornlight
        10
    mornlight  
       2016-06-16 16:39:57 +08:00
    @xcc7624 session 是上层抽象出的概念, HTTP 协议里本身没有所谓的 session ,只有 Cookie
    具体的讨论你搜一下本站的帖子
    clino
        11
    clino  
       2016-06-16 16:42:05 +08:00
    @xcc7624 session 一般翻译成"会话","连接"一般是 connection,比如 tcp connection
    xcc7624
        12
    xcc7624  
    OP
       2016-06-16 16:48:09 +08:00
    @clino
    @mornlight
    我觉得 session 还是主要用来在服务器中不同的 HTTP 请求之间共享数据,毕竟各个 HTTP 请求之间是无状态的。
    但是如果符合这个作用的机制都能叫 session 了吗?
    clino
        13
    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
        14
    xcc7624  
    OP
       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
        15
    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
        16
    xcc7624  
    OP
       2016-06-16 18:24:37 +08:00
    @clino 那么到底什么是 session ,又没有比较正式的文档说明?
    session 的作用大概就是
    1 、识别 HTTP 客户端
    2 、在 HTTP 请求间共享数据。
    clino
        17
    clino  
       2016-06-16 19:58:43 +08:00
    @xcc7624 我不知道哪里有,因为比较自由所以估计都是自己实现的,但大体上差不多,就是存一个 session id,从 session id 能查到会话相关的信息,最常见的就是用户的 id
    "在 HTTP 请求间共享数据"可以有这个作用,但是你要弄清楚一般是怎么达到这个目的的
    SoloCompany
        18
    SoloCompany  
       2016-06-16 23:23:08 +08:00
    无状态基本上就等价于无连接
    有连接就代表需要建立握手之后才能传输 payload ,可以理解为相当于 tcp
    无连接就是随时都可以传输 payload 不需要握手,相当于 udp

    TCP 是有连接有状态的
    这不影响建立在 TCP 之上的 HTTP 无连接无状态
    因为同一个 TCP 连接上所传输的每个 HTTP 请求都是完全独立无关的
    HTTP 的无连接无状态也不影响其衍生出来的 websocket 协议是有状态有连接的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2977 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 00:15 · PVG 08:15 · LAX 16:15 · JFK 19:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.