为什么tcp连接终止需要4路握手?

tou*_*one 14 tcp

连接设置时,有:

客户端------ SYN ----->服务器

客户端<--- ACK/SYN ----服务器----①

客户端------确认----->服务器

终止时,有:

客户端------ FIN ----->服务器

客户端<----- ACK ------服务器----②

客户端<----- FIN ------服务器----③

客户端------确认----->服务器

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

tou*_*one 14

在google之后,我认识到四方实际上是两对双向握手.

如果终止是一个真正的四向动作,则2和3确实可以在同一个包中设置为1.

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

客户端------ FIN ----->服务器

客户端<----- ACK ------服务器

此时客户端已处于FIN_WAIT_2状态,等待来自服务器的FIN.作为双向和全双工协议,目前一个方向已经崩溃,客户端必须等待另一个"半双工"终止.

当来自服务器的FIN被发送到客户端时,客户端响应ACK以终止连接.

总结一下,2和3不能合并成一个包,因为它们属于不同的状态.

祝我英语不好.大声笑.

参考:

http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm

http://www.tcpipguide.com/free/t_TCPConnectionEstablishmentProcessTheThreeWayHandsh-3.htm

http://www.tcpipguide.com/free/t_TCPOperationalOverviewandtheTCPFiniteStateMachineF-2.htm

  • 哦!因此,这意味着当客户端处于 FIN_WAIT_2 状态时,服务器可以向客户端发送更多“实际”数据。因为连接现在是单工的?那么当它发送完所有数据后,它可以向客户端发送第二个FIN吗? (4认同)

Was*_*son 14

我认为当然 2 和 3 可以在技术上合并,但不够灵活,因为不是原子的。
第一个 FIN1 C 到 S 表示且仅表示:我将关闭我的通信方式。到 C 的第一个 ACK​​1 S 表示对 FIN1 的响应。好的,我知道您的频道已断开连接,但对于我的 S(服务器)方式连接,我还不确定。也许我的接收缓冲区还没有完全处理好。我需要的时间不确定。因此2和3不适合合并。只有服务器有权决定何时可以断开其连接方式。


小智 -2

  • 三向握手连接设置)中:服务器必须确认 ( ACK ) 客户端的SYN,并且服务器还必须发送自己的SYN,其中包含服务器将在连接上发送的数据的初始序列号。
    这就是服务器在单个数据段中发送其SYN和客户端SYN的ACK的原因。
  • 在连接终止中:由于每个方向都需要 FINACK ,因此需要四个段来终止连接。(2) 表示接收到的FIN (第一个段)由 TCP 确认 ( ACK ) (3) 表示稍后接收到文件结尾的应用程序将关闭其套接字。这会导致其 TCP 发送FIN然后最后一个段将意味着接收此最终FIN的系统上的 TCP 确认 ( ACK ) FIN


  • 你只是在问题中解释了他的形象。这仍然没有“解释”原因,但它仅解释了 TCP 终止。 (32认同)
  • @deppfx但是,我认为一段时间后这句话对我来说解释得很清楚。 (2认同)