【问题标题】:Conformant HTTP 1.1 Server and client-side connection half-close符合 HTTP 1.1 服务器和客户端连接半关闭
【发布时间】:2011-07-23 00:20:45
【问题描述】:

我观察到一个 HTTP 1.1 服务器实现,它会在检测到其传出通道的客户端连接关闭时立即终止客户端连接(或者更确切地说,在发送正确的 http 响应之前或之后)。这是符合 HTTP 1.1 的实现吗?

RFC 2616 第 8.1.4 节似乎表明这是正确的行为:

当客户端或服务器希望超时时,它应该发出一个优雅的 关闭传输连接。客户端和服务器都应该 时刻注意交通工具的另一侧,并且 酌情回应。

...

服务器不应在传输响应的过程中关闭连接,除非怀疑网络或客户端故障。

我的解释正确吗?在 HTTP 1.1 的上下文中是否有关于半关闭连接处理的更明确的参考?

【问题讨论】:

    标签: http sockets tcp rfc


    【解决方案1】:

    据我所知,这就是我们需要了解的关于半封闭连接的全部内容。

    服务器只有在检测到客户端关闭连接时才会关闭连接(它可以在服务器即将写入套接字时关闭)或在请求结束时,如果它不支持connection: keep-alive。

    客户端可以随时断开连接,但它应该告诉服务器为什么断开连接(time_out,请求取消)。但是编写套接字组件的人并不怎么使用它。他们只是在需要强制time_out 时关闭套接字。

    但客户端实现不是问题。您应该担心服务器实施,因为这些意外断开连接会遭受很多痛苦。

    编辑

    也许这些链接可以帮助你。

    Transmission Control Protocol - Functional Specification

    TRANSMISSION CONTROL PROTOCOL

    【讨论】:

    • ...所以你在说什么 w.r.t.对于最初的问题,是否允许符合 HTTP 1.1 的服务器在接收到来自客户端的 FIN 数据包时终止连接(通过发送 FIN)——在发送任何 HTTP 响应之前?
    • HTTP 客户端如何告诉服务器它断开连接的原因?这是 HTTP 规范的一部分,我在哪里可以找到更多相关信息?
    • 客户端没有说明为什么会断开连接。它只是开始断开握手(发送 fin、syn 等),然后断开连接。这是断开连接的正确方法,但有时它可以简单地断开连接而不向服务器发送任何内容。如果你想知道为什么客户端断开连接,你必须自己实现它(但它不是 HTTP 规范的一部分)。
    • 服务器可以通过一些方式断开连接。如您所说,它可以在向服务器发送响应之前,检测客户端发送的 FIN 并断开连接。它还可以在将要写入套接字时断开连接,并检测到客户端不再响应。最后,它可以在请求结束时检测到客户端不支持keep-alive。当然,如果你告诉它这样做,它可能会断开连接。
    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 2020-06-26
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多