假设服务器和客户端同时执行send()——据我所知,它们都将发送数据,接下来都开始等待 Ack 消息,没有人会发送。
但是这样的问题从来没有出现过,那么实际上会发生什么呢?
假设服务器和客户端同时执行send()——据我所知,它们都将发送数据,接下来都开始等待 Ack 消息,没有人会发送。
但是这样的问题从来没有出现过,那么实际上会发生什么呢?
TCP是双向的。 实际上,在客户端和服务器之间创建了两半管道;将此视为全双工操作,因为对话双方可以同时发送和接收。
但是在任何真正的通信发生之前,客户端需要首先使用 TCP SYNchronize(标志)数据包启动到服务器的连接,并且服务器应该使用附带 ACK 的 TCP SYN 向客户端响应,最后是客户端确认服务器 TCP SYN。这是TCP SYN-SYN/ACK-ACK 3 次握手。 然后数据包可以在任一方向自由流动,直到连接断开。
为什么说双方都不发送ACK?每一方都将确认它接收到的所有数据(按顺序)。每一方都维护自己的发送和接收数据计数——序列号。这个问题“从未出现”,因为它不存在;每个方向都保持状态,因此谁何时发送什么都没有关系。
如果A和B同时发送一个数据包,比如 seq:0 的 5 个字节,那么他们将各自独立地确认他们收到的 5 个字节。该连接是全双工双向流。A发送给B的内容与B发送给A 的内容无关。