问题描述:假设现在有一个TCP长连接A和B,B端突然遭遇停电断网等突发事件close掉了,此时处于半开连接状态,假设不考虑心跳包机制、A端的发送内核缓冲区没有满,此时A端写数据发送会成功吗?为什么?
肯定会成功,send函数跟实际发送其实没啥关系,send函数更确切的含义是copy_data_from_userspace_to_kernelspace,只有内核空间有富余就会成功,不过很显然B端是接收不到数据的,A发送后数据后期望收到B的ACK包却一直收不到,根据tcp机制,A端的协议栈会自动进行重传,当重传次数达到上限后就发发送RST包重置连接,半开连接就彻底死掉了。
发散一下,如果说A和B都是好的,A端send成功的数据B端一定能收到吗?
答案是未必,首先send成功表明数据已经放到了A的发送内核缓冲区中,如果B端的接收内核缓冲区满了是没有办法收到数据的,在B端用tcpdump也是抓不到包的。