问题来源于一次面试。
我们知道,在tcp编程中,使用send套接字IO函数时,此次 send 成功返回时候(返回0),并不代表data已经全部发送到了对端,只是代表了 data 全部由用户态拷贝到了内核态的协议栈发送缓冲区中,而具体的发送工作,其实是由协议栈来完成。
那么,当send成功返回时,如果data并未全部成功发送,即假设还有 100KB 的data,在传输过程中因为网络原因,未能传输到对端,此时在对端通过 recv 就不能完全收到所有的data。
面对这种情况,该怎么办呢?
--------------------------------------------------华丽的分割线---------------------------------
针对上面的问题,我在此给出我的看法
1)发送端是可以感知到 send 的数据是否发送完全的。 即使此次使用 send 时候,成功返回了,但是如果在传输过程中,data 未能发送完全,那么必然是会产生错误的,而这个错误,在此次使用 send 时是无法获得,但是在下一次使用网络IO接口(send/recv等)时,会返回这个错误。
所以根据这个,发送端是可以知道data是否正确到达对端。但是,仍然还有疑问,发送端发送不完全,可以选择重发,但是接收端接收不完全,难道选择丢弃?
2)接收端是否可以知道,自己接收的data是完整的?还是缺失的?
以下是我在知乎的提问:
https://www.zhihu.com/questio...
tcp连接的建立和关闭完全契合你的问题。相比与三次握手建立连接,关闭连接的过程更复杂。你要解决这个问题,可以给发送的数据中添加冗余信息来进行判断。