在TCP半开连接上发送数据,结果怎样?

问题描述:假设现在有一个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也是抓不到包的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值