tcp几种常见异常出现情况总结

1.三次握手后连接成功建立,client发送RST到server,此时server阻塞在accept或者即将调用accept,accept会返回成功,得到一个sockfd,对此sockfd的read会导致一个connect reset by peer错误,注意此时tcp连接的终止不需要4次挥手,不会有TIME_WAIT状态。

client端发送RST代码如下:

struct linger so_linger;
so_linger.l_onoff = 1;
so_linger.l_linger = 0;
setsockopt(sockfd, SOL_SOCKET, SO_LINGER, &so_linger, sizeof(so_linger));

2.server端fork子进程处理client请求,子进程崩溃,触发FIN到client,client回复ACK,此时server2client单向连接关闭,server端进入FIN_WAIT2,client进入CLOSE_WAIT。此后client端再从sockfd read,read正常返回EOF;client端再向sockfd write,server端发回一个RST,此时TCP连接中断,client2server的连接也被切断,后续再write,已经没有连接了,直接在本端SIGPIPE。下面截图表示server发送FIN,client回复ACK,client write,server发RST:

注意对于client来说,只要先收到FIN,即使后续收到RST导致tcp连接不存在了,read都返回EOF,不会发生connect reset by peer

3.socket接收缓冲区中有数据时,close sockfd,会触发本端发起RST,不需要四次挥手和TIME_WAIT,直接中断TCP连接,构造如下代码:

write(sockfd, "c", 1);
sleep(1);        // wait server writeback
// now there's data in receive buffer
close(sockfd)    // send RST to peer

抓包结果如下:

可以看到,peer发送数据后本端ACK了,表示数据已经存入了内核缓冲区,此时close sockfd,触发RST

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值