停止等待TCP是否会在ACK中发送数据?

4
假设我有一个简单的TCP连接,其中包含客户端和服务器。客户端向服务器发送一些数据,服务器在处理原始数据后向客户端发送一些数据。
我不确定使用停止等待协议时数据包的流程如何。当客户端将原始数据发送到服务器时,服务器是否同时发送ACK和新数据(同一数据包?),还是分别发送?
从我在网上看到的例子来看,我无法完全理解服务器何时向客户端发送数据以及何时发送ACK。
谢谢!
1个回答

2
如果服务器已经有一些数据排队等待发送给客户端,它可以使用TCP piggybacking,这样(服务器对客户端数据包的确认)和(服务器的部分回复数据)可以共享一个数据包。这使得协议更加高效,因为需要向客户端发送的数据包更少。
如果服务器在想要发送ACK数据包时没有自己的应用层数据要发送,则ACK数据包将作为独立的数据包返回到客户端。(在停止等待协议中,服务器可能还没有准备好任何应用层数据要发送回来,因为ACK应该尽快返回到客户端,而在这种情况下,服务器应用程序只有在处理接收到的客户端数据后才生成数据)。

那么,您是否只需要为数据包制定一些约定的格式,以便客户端/服务器都知道如何查看ACK? - ryhmaxd
TCP的ACK数据包由TCP栈内部处理,应用程序代码根本看不到它们。当然,如果你愿意,也可以实现自己的应用层ACK。但这并不是必须做的。 - Jeremy Friesner
请注意,在使用TCP时,TCP连接的两端的用户程序不应该考虑数据包。TCP模拟字节流(例如类似于双向管道),并将所有数据包细节隐藏在字节流抽象之后。 - Jeremy Friesner
我明白了。所以我们在收到数据包后立即发送ACK。因此,在停止和等待算法中,我们很可能会单独发送ACK,然后在服务器端进行一些处理,最后将服务器数据发送给客户端。再有一个问题:既然服务器向客户端发送数据,那么我应该让客户端也向服务器发送ACK,对吗? - ryhmaxd
我会说:除非你有充分的理由,否则你的程序不应该显式地发送任何ACK。两台计算机的TCP堆栈将在适当的时间自动发送ACK,因此您的代码没有必要这样做。客户端程序只需要发送其请求数据,然后等待服务器的回复数据。服务器程序只需要等待请求数据,然后发送回复数据即可。 - Jeremy Friesner

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