【问题标题】:In tcp connection termination在 tcp 连接终止
【发布时间】:2015-01-05 10:45:46
【问题描述】:

如果它没有在两个方向上关闭,它是否永远不会关闭 - 无论到期计时器如何? - 可以半关闭,但是如果只有一个启动close(),tcp连接会终止吗?

换句话说: 在 TCP 连接终止中 - 当只有客户端启动关闭但服务器没有时,您是否可以完全关闭连接。 或者可以通过两种方式独立关闭一个tcp连接?

【问题讨论】:

  • 请详细说明,我不清楚。
  • 您使用了很多在上下文中不清楚的术语。例如,当你说“双向关闭”时,你的意思是每一方都调用close吗?或者你的意思是 TCP 连接的两个方向中的每一个(它是一个双向流,对吗?)关闭?当您说“半关闭”时,您的意思是一侧已经关闭了流的两个方向吗?还是您的意思是一侧已关闭其发送方向但接收方向仍处于打开状态?您的问题充满了模糊的术语,使您无法理解您在问什么。
  • 而且,更模糊的术语,“启动关闭”是否意味着它调用close?或者它是否意味着它调用shutdown 表示它不会再发送了?还是别的什么?

标签: tcp


【解决方案1】:

每个对等点都可以独立于另一个对等点关闭 TCP 连接,对等点在尝试从对等点读取时将简单地获得一个 EOF(例如,没有更多字节),或者如果它尝试写入连接,则获得一个 ECONNRESET 或 EPIPE它已被对等方关闭,但前提是套接字知道对等方不想接收更多数据,请参见下文。

关闭连接实际上由两部分组成:

  • 应用程序将不再发送任何数据:shutdown(sock,SHUT_WR)。在这种情况下,内核将向对等方发送一个 FIN,以表明不会有更多数据跟随。从对等方读取将返回 EOF。
  • 应用程序不想接收更多数据:shutdown(sock,SHUT_RD)。在这种情况下,最初不会向对等方发送任何信息,但如果从对等方接收到数据,它们将被 RST 拒绝。

因此,调用close() 相当于同时关闭两端的连接 (SHUT_RDWR)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-07
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 2022-08-15
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多