你可能以为TCP是可靠的,从发送端看,send
函数总是能把数据发送到接受端;而从接收端来看,总能把发送端接受的数据流完整传递给应用程序来处理。
可是我们认真分析过之后,发现“TCP是可靠的
”这个论断是不正确的。
若是使用send
发送信息的时候,send
函数只是把想要发送的信息放到TCP协议栈里边,并不是真的已经发送到网络上边,而是存储在当前套接字的发送缓冲区里边,由网络协议栈决定何时和如何发送。当相应的数据流发送给接收端,接收端回复ACK
,存储在发送端发送缓冲区的对应数据就可以删除了,但是,发送端并无法获取对应数据流的 ACK 情况,也就是说,发送端无办法判断对端的接收方是否已经接收发送的数据流,如果需要知道这部分信息,就应该由开发者自己在应用层添加处理逻辑,比如显式的报文确认机制。
从接收端这方面来说,也没有ACK 过的数据部分一定被应用程序处理的保证,因为数据需要接收端程序从接收缓冲区中拷贝到应用缓冲区,可能出现的状况是,已经 ACK 的数据存储在接收端缓冲区中,接收端处理程序突然崩溃了,这部分数据就没有办法被应用程序继续处理。
而TCP没有向上层反馈异常的能力偏弱,这是因为TCP刚开始是为美国军方服务,而军方希望TCP能够以无人值守的方式工作。
内容来源于极客时间《网络编程实战》。