Muduo关闭连接

这张图展示了在 Muduo 网络库中,TCP 连接关闭时的一个序列图。这个过程展示了客户端和服务端在发送完数据后的连接关闭步骤,具体涉及到几个类和方法的调用。下面是详细解释:

  1. Client 发起关闭:

    • 客户端调用 TcpConnection 对象的 shutdown() 方法。
    • 该方法接着调用 shutdownInLoop(),这是在事件循环中执行关闭操作。
  2. TcpConnection 处理关闭:

    • shutdownInLoop() 方法进一步调用 Socket 对象的 shutdownWrite() 方法,表示写操作的关闭。
  3. Socket 发送 FIN 分节:

    • shutdownWrite() 方法内部会调用系统的 shutdown() 函数,发送一个 FIN 分节给对方(Peer),表示数据发送完毕,关闭写入操作。
  4. Peer 接收 FIN 分节:

    • 对方(Peer)接收到 FIN 分节后,会进行 ACK(确认)并发送自己的 FIN 分节(如果它也打算关闭连接),表示自己也关闭了写操作。
  5. 本地(Local)读取关闭事件:

    • 在本地,TcpConnection 会通过 handleRead() 方法处理读取事件。当对方的 FIN 分节到达时,读取操作返回 0 字节,这表明对方已经关闭连接。
  6. TcpConnection 处理关闭:

    • 读取到 0 字节后,TcpConnectionhandleClose() 方法会被调用,处理关闭连接的逻辑。
    • handleClose() 方法会触发 connectionCallback() 回调,通知上层应用连接已关闭。
  7. 资源清理:

    • 最终,TcpConnection 对象会被析构(dtor & close),并关闭底层的套接字资源,完成连接的完全关闭。

细节补充:

  • Half-Close:

    • 半关闭(Half-Close)指的是 TCP 连接的一端关闭其写操作,但仍然保持读操作开放。这样,对方仍然可以继续发送数据。
    • 在图中,当 shutdownWrite() 发送 FIN 分节后,虽然本地关闭了写操作,但仍然可以从对方接收数据直到对方也关闭连接。
  • 完整的关闭过程:

    • shutdownWrite() 发送 FIN 分节后,对方接收并返回 ACK,表示确认接收到 FIN 分节。
    • 对方也可以选择在发送完剩余数据后再发送自己的 FIN 分节,最终由本地 TcpConnection 处理读取到 0 字节的事件并关闭连接。

通过这个序列图,我们可以清晰地看到 Muduo 库是如何通过一系列方法调用和事件处理来优雅地关闭 TCP 连接的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值