四次挥手的步骤:(抽象派)

  1. 主动方:给你发FIN了,我这里要断开连接
  2. 被动方:收到你的FIN,但我还要发点东西,等我的FIN发了你再关
  3. 被动方:我发完所有数据了,发给你FIN,我也准备好断开连接了
  4. 主动方:收到FIN,合作愉快,结束联系吧

5. TCP四次挥手 - 图1

为什么连接的时候是三次握手,关闭的时候却是四次握手?

  • 服务器端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文
  • 但关闭连接时,当服务器端收到FIN报文时,很可能并不会立即关闭链接(还有最后的东西要发送),所以只能先回复一个ACK报文,告诉客户端:”你发的FIN报文我收到了”,只有等到服务器端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送,故需要四步握手。

    长连接 Connection: keep-alive (再连接通道建立好后,保持在一段时间内长时间连接,不关闭通道,超过时间会关闭)

    首先看 tcp/ip 层面的定义:

  • 长连接

    • 一个 tcp/ip 连接上可以连续发送多个数据包,
    • 在 tcp 连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持(类似于心跳包)
  • 短连接
    • 通信双方有数据交互时,就建立一个 tcp 连接,数据发送完成后,则断开此 tcp 连接