TCP握手可靠性

5

我想知道,在TCP握手中,为什么客户端需要回复ACK才能完成握手呢?在SYN和SYN-ACK之后,双方已经有足够的信息开始传输数据了,但TCP仍要求客户端发送ACK以进入已建立状态。

问题是,为什么这个三向握手过程是实现可靠性的必要和充分条件,即使我们在第二个消息之后同步序列号。

有什么见解吗?

1个回答

4
服务器如何知道客户端已经收到SYN-ACK呢?除非客户端显式地发送ACK以确认它收到了syn-ack,否则服务器没有办法知道这一点。
如果第三个ACK被丢弃了,服务器将重新发送SYN-ACK。当客户端收到重复的SYN-ACK时,它会说“哦,我的先前的ACK可能被丢弃了,所以我将重新发送ACK”。这将继续进行,直到服务器收到ACK为止。

1
正确,并且服务器实际上并不需要知道,对吗?为什么客户端不能在不实际确认syn-ack的情况下开始发送数据呢? - Varun
客户端在发送SYN时分配资源,服务器在发送SYN-ACK时进行分配,那么第三个ACK在这里出现了吗?我的问题是,第三个ACK真的需要吗?我的分析表明,在第二个消息之后,双方已经同步了所有参数,如果他们想要的话,他们可以简单地开始发送流量。而且,如果我正确的话,第三个ACK甚至不能成为数据的附带信息。希望我已经很清楚地解释了这个问题。 - Varun
想象一下SYN-ACK被丢弃了,那么这些资源会发生什么?在这种情况下,客户端可能不知道服务器同意连接。这意味着服务器不能只发送一个SYN-ACK并假设客户端会收到它,然后一切都会好起来。服务器必须等待直到它通过第三个ACK从客户端获得明确的确认,然后才能安全地完成连接。这第三个ACK确保双方都知道连接的存在。 - Oleksi
从服务器的角度来看,SYN-ACK被丢弃与ACK被丢弃是相同的。此外,SYN-ACK被丢弃实际上并不会影响客户端,因为它会自动重试。 - Varun
@Varun:我认为TCP堆栈会在客户端应用程序有机会提供任何数据之前发送第三个数据包,但如果该数据包在传输到服务器的途中丢失,并且应用程序在服务器请求重新传输之前提供了数据,则我认为重新传输将包括该数据。 - supercat
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接