在TCP半开连接上发送数据,结果怎样?
2017-10-20 11:03
246 查看
问题描述:假设现在有一个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也是抓不到包的。
肯定会成功,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也是抓不到包的。
相关文章推荐
- 在tcp半开连接(也就是死连接)上send数据, send函数会成功吗? 后续会怎样?
- 建立tcp/ip连接,vc6实现客户端(发送数据)
- 怎样写一个获取数据函数:用TCP/IP通讯,向服务端发送命令,并从服务端获得返回数据.
- GCDAsyncSocket类TCP连接发送数据粘包怎么办
- GCDAsyncSocket实现TCP连接怎么设置发送数据延时
- 在J2ME客户端连续100次建立TCP连接并发送数据
- GCDAsyncSocket类TCP连接发送数据粘包怎么办
- 真的懂了:TCP协议中的三次握手和四次挥手(关闭连接时, 当收到对方的FIN报文时, 仅仅表示对方不在发送数据了, 但是还能接收数据, 己方也未必全部数据都发送对方了。相当于一开始还没接上话不要紧,后来接上话以后得让人把话讲完)
- 使用Java建立TCP连接并发送数据
- 客户端C和服务器S之间建立一个TCP连接,该连接总是以1KB的最大段长发送TCP段,客户端C有足够的数据要发送。当拥塞窗口为16KB的时候发生超时,如果接下来的4个RTT往返时间内的TCP段的传输是成
- TCP实现内网连接到外网,外网发送数据给内网的例子
- iOS 怎样通过UDP发送广播寻找设备,拿到ip地址,然后用TCP 连接设备
- Qt模拟串口-tcp连接发送数据
- TCP(HTTP)长连接和短连接区别和怎样维护长连接
- (3) linux 3.x - client - TCP连接建立系列 — 客户端接收SYNACK和发送ACK
- Java网络编程实例---------------------------------TCP和UDP发送数据统计
- C#进行Socket 连接发送和接收数据
- 通过异步方式发送和接收数据(tcp异步收发数据)
- linux的TCP超时重传--一次数据断开连接分析
- Android客户端通过TCP接收服务器端发送的数据