当用TCP/IP协议进行通信时,在发送端,send首先会将数据copy到协议的缓存区,然后协议会将数据发送到接收端,接着会等待接收端协议收到数据的ack,如果没有收到ack,协议就会重发数据,在这一过程中send一直在等待,直到收到ack,当协议收到ack后才将协议缓存中的数据删除,因此从协议上来说是不会丢失数据的。
但是协议没有丢失数据并不能保证接收端应用程序就一定会处理了数据,因此,在接收端的应用层增加ack是有必要的,因为有可能因为某些原因(比如:接收端机器配置低),应层没来得及处理数据,这也是TCP协议应用层加ack的意义所在。
而同样,对于在实际应用中设计应用层协议的时候,合适的ACK机制很重要。即使是基于TCP/IP的应用层,也要实现自己的ACK机制。因为TCP/IP的ACK是传输层的ACK,并不一定表示应用层已经处理了收到的消息,因为数据可能还在内核中没有被应用层读取。所以,应用层协议要有自己的ACK,进行应用层的消息确认。
因为很多时候消息由tcp层交给应