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

为什么tcp连接终止需要4路握手?,tcp,Tcp,建立连接时,会出现以下情况: 客户端------同步------->服务器 客户端服务器 当终止时,有: 客户端-------FIN------>服务器 客户 在三向握手(连接设置)中:服务器必须确认(ACK)客户端的SYN,并且服务器还必须发送自己的SYN,其中包含服务器将在连接上发送的数据的初始序列号。 这就是服务器在单个段中发送其SYN和客户端SYN的ACK的原因 连接终止:由于每个方向都需要一个FIN和一个ACK,因此需要四个段来终止连接。 (2) 表示接收到的FIN(第一段)由TCP确

建立连接时,会出现以下情况:

客户端------同步------->服务器

客户端服务器

当终止时,有:

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

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

在谷歌搜索了很多之后,我发现四向握手实际上是两对双向握手

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

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

客户端-------FIN------>服务器
客户端来自Wikipedia-“当主机a发送FIN,主机B回复FIN&ACK(仅将两个步骤合并为一个步骤)并且主机a回复ACK时,也可以通过三方握手终止连接。[14]”

资料来源:

维基百科-


[14] -安德鲁·坦恩鲍姆(2003-03-17)。计算机网络(第四版)。普伦蒂斯大厅。ISBN 0-13-066102-3。

如果从编码角度来看,4路比3路更合理,尽管两者都是可能的使用方式

当连接由一端终止时,对等方可能具有多种可能性或状态。至少有一个是正常的,一个是在发送或接收,一个是在这个启动之前突然处于断开状态

终止方式应至少考虑上述三种情况,因为它们在现实生活中发生的概率都很高

因此,更自然的是,我们可以根据上述情况找出原因。如果对等方处于脱机状态,则客户端很容易通过深入研究过程中捕获的数据包内容来推断对等方的状态,因为无法从对等方接收到第一个ack消息。但是,如果将这两条消息组合在一起,那么客户端就很难知道对等方为什么不响应,因为脱机状态不仅可能导致数据包丢失,而且服务器端处理过程中的各种异常也可能导致这种情况。更不用说客户端需要等待很长时间直到超时。有了额外的1条消息,这两个问题可能会变得更容易 从客户端处理


它看起来像是编码,因为消息中包含的信息就像是代码日志。

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

允许半开放连接吗?@Someprogrammerdude我从这个链接中了解到:最上面的答案是ACK和SYN设置在同一个包中,然后我想为什么termination不能在一个包中设置ACK和FIN以减少一次握手。它可以,有时候确实如此。试着回答:你只是在问题中解释了他的形象。这仍然不能“解释”为什么,但它只解释了TCP终止。@deppfx但是,我认为这句话在一段时间后解释得很清楚。@deppfx有时服务器需要休息才能结束。我认为4路更灵活。虽然设置阶段不需要等待时间。这并不能解释太多,只是重新表述问题,请在回答中明确。为什么没有FIN-ACK?像SYN-ACK,但用于结束。这很特别。。。嗯,在这种情况下,FIN和ACK位都设置在一个数据包中?那么,身份转移应该是什么呢??我的意思是还有FIN_WAIT2 phaze(客户端)和CLOST_WAIT phaze(服务器端)存在吗???哦!因此,这意味着当客户端处于FIN_WAIT_2状态时,服务器可以向客户端发送更多实际数据。。由于连接现在是单工的??一旦发送完所有数据,它就可以向客户端发送第二个FIN?为什么没有FIN-ACK?类似SYN-ACK,但用于结束。目前为止最好的解释。通过一个明确的例子,真正理解“为什么”。
Client ------FIN-----> Server

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