在跨进程通信中,明确一个消息被接收者正确接受的方式是接收者在收到该消息后给发送者发送确认,即ACK机制。但是这种机制也存在问题,因为确认消息可能会丢失或者接收者在发送确认前崩溃。此外ACK机制还会引入额外的通信成本以及增加发送者时延(发送者只有在收到上一个消息的ACK后才会发送下一个消息)。特别是在广播的时候,这种副作用会更明显(发送者需要等待多个ACK),这种现象有时候被叫做反馈风暴。目前有几种策略来优化ACK机制来减少副作用。
流水线技术(Pipeling):发送者无需等待消息确认而可以连续发送一系列消息。ACK是异步接收的。这要求发送者有发送缓存来暂存每一条已发送但还未确认的消息,待到收到消息确认后可以将消息从缓存删除,或确认接受者已死亡。
累计确认:接受者可以不立即发送确认,而是等待一段时间看是否还有其它消息来自该发送者。而后接收者可以发送一条消息来确认收到几个消息。
捎带确认:接收者不单独发送确认包给发送者,而是将确认消息附加到接受者需要发送的响应数据包中发送。捎带确认基于通信是双向的这一事实。
被动确认:被动确认是指只有当接收者错过消息时才向发送者发送确认来获取丢失的消息。在被动确认协议中发送者对发送的消息维护单调递增消息序列号,接收者通过消息序列号空洞来检查消息是否丢失。被动确认问题在于接收者崩溃的情况,发送者无法感知。
tcp协议中采用了前三个优化策略。