tcp - 为什么 tcp 终止需要 4 次握手?

标签 tcp

当连接建立时,有:

Client ------SYN-----> Server

Client <---ACK/SYN---- Server ----①

Client ------ACK-----> Server

当终止到来时,有:

Client ------FIN-----> Server

Client <-----ACK------ Server ----②

Client <-----FIN------ Server ----③

Client ------ACK-----> Server

我的问题是为什么②和③不能像①一样设置在同一个包中,就是ACK和SYN设置在一个包中???

最佳答案

经过大量谷歌搜索后,我认识到四次实际上是两对双向握手。

如果终止是一个真正的四向 Action ,那么 2 和 3 确实可以在同一个数据包中设置为 1。

但这是一个两阶段的工作:第一阶段(即第一次双向握手)是:

Client ------FIN-----> Server

Client <-----ACK------ Server

此时client一直处于FIN_WAIT_2状态等待Server的FIN。作为一种双向全双工协议(protocol),目前一个方向已经中断,不再发送数据,但接收仍然有效,客户端必须等待另一个“半双工”终止。

Server 发送 FIN 给 Client,Client 响应 ACK 终止连接。

结束语:2和3不能合并为一个包,因为它们属于不同的状态。但是,如果服务器在收到来自客户端的 FIN 时没有更多数据或根本没有数据要发送,则可以将 2 和 3 合并到一个包中。

引用资料:

  1. http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm
  2. http://www.tcpipguide.com/free/t_TCPConnectionEstablishmentProcessTheThreeWayHandsh-3.htm
  3. http://www.tcpipguide.com/free/t_TCPOperationalOverviewandtheTCPFiniteStateMachineF-2.htm

关于tcp - 为什么 tcp 终止需要 4 次握手?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46212623/

相关文章:

ios - BSD UDP 套接字能否与 iOS 的 VoIP 后台模式一起使用?

c - 带有信号捕捉器的套接字程序

c# - 如何像很多游戏一样快速发送信息?

c# - 为什么我的网络流下载 0 字节?

java - 多线程服务器随机抛出java.net.SocketTimeoutException : Read timed out

linux - 如果很多socket连接处于TIMEWAIT状态,是否会影响服务器的性能

php - 这是使用 PHP 连接到 TCP 端口的正确方法吗?

linux - linux 中终止 tcp 连接或 session 的命令是什么?

c - 如何在TCP客户端中使用write函数验证ACK包?

command-line - 为什么 Windows 命令外壳告诉我使用不同的命令然后说该命令不存在?