31. TCP异常之TCP可能出现异常的原因

这篇博客探讨了TCP连接可能出现的异常情况,包括在三次握手、通信过程和四次挥手阶段的问题。例如,服务端未监听导致的ECONNREFUSED错误,超时未收到确认的ETIMEDOUT错误,以及通信中断后的RST段响应。同时,讨论了如何在通信过程中检测和处理对端断开连接的情况,并提到了TCP连接断连的探测方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


本节介绍TCP可能会出现的异常的时候以及部分原因, 提出来的问题大概都会在后面实验中会有所涉及. TCP异常会出现在连接的任何时候, 比如三次握手, 四次挥手等阶段.


三次握手

TCP在三次握手过程中的每一步都可能出错, 这里也就介绍以下问题.

  1. 服务端没有监听, 所以服务端TCP协议返回一个RST段, 而客户端收到后立即返回并停止连接. 客服端调用connect返回错误, 错误类型是ECONNREFUSED.
  2. 客户端一直没有收到对端的ACK确认报文, 当超时后继续发送FIN, 多次失败之后客户端停止尝试连接. 客户端connect函数返回错误, 错误类型是ETIMEDOUT.
  3. 如果客户机的SYN段导致某个路由器产生“目的地不可到达”类型的ICMP消息, 超时重发后也是一样, 最后断开连接. 客服端调用connect返回错误, 错误类型是EHOSTUNREACH/ENETUNREACH.
  4. 虽然三次握手成功了, 但是客户端立马发送一个RST段后断开而服务端处于繁忙状态, 等服务端返回时才发现对端已经关闭, 此时服务端也关闭. 客户端connect后立即断开, 服务端在accept函数返回前收到RST段, 则accept函数返回ECONNABORTED.

通信过程

在通信过程中经常一端可能会突然断网之类的, 导致通信错误.

  1. 在通信过程中, 对端因为断网等原因断开并且一直没有联网或重启等, 但是另一端并不知情继续发送报文段, 直到超时重传多次也没有回应才知道对端已经断开, 这时另一端发送RST段表示错误并断开
  2. 如果在通信过程中, 对端因为断网等原因断开但是马上一直联网或重启等原因, 那么另一端发送报文段过来, 重启的的服务端没有监听, 所以服务端TCP协议返回一个RST段(回到了三次握手中的第一种错误).

四次挥手

四次挥手的任意过程都可能发生错误, 这里也就介绍以下问题.

  1. 主动断开一端发送FIN段, 对端一直没有ACK确认, ….后续??
  2. 主动断开一端发送FIN段并接收到ACK, 却始终没有收到对端的FIN, …后续??

TCP可以通过探测来检测对端是否已经断开, 这里也有一个详细的介绍TCP 连接断连问题剖析. 当然自己使用类似后面会分析到非阻塞connect实现定时 的方法来自己实现一个保持活性定时器.


参考

TCP/IP 错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值