ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

TCP 故障模型

2022-07-12 16:04:39  阅读:172  来源: 互联网

标签:对端 主机 模型 TCP 发送 故障 接字 崩溃


TCP 故障模型

网络中断

  • 端点(应用程序所在 LAN 或主机)之外发生的网络故障是临时的,因为路由协议会发现并绕开故障节点
  • 端点出问题时,通常没有备用的路径,问题会一直存在直到故障修复

网络中断时的 TCP

  • 除非中间路由器发送 ICMP 报文,指出目的网络或主机不可达,否则应用程序和 TCP/IP 协议栈都无法立即感知到网络中断的发生
    • 收到 ICMP 后会返回 ENETUNREACHEHOSTUNREACH 错误
  • 发送端会不断超时重传没有被确认的段,源自 Berkeley 的实现中重传 12 次(大约九分钟)后就会放弃
    • 读操作会返回 ETIMEDOUT
    • 写操作会收到 SIGPIPE 信号或返回 EPIPE 错误

对端应用崩溃

对于应用程序来说,是无法区分对端应用崩溃和对端调用 close()exit()

  • 两种情况下,对端都会发送 FIN
    • 这只是告诉我们,对端已经没有数据要发送了,并不代表对方不能再接收我们发出的数据
    • select 会指示该套接字可读,read 后会返回 0(EOF)

对端应用崩溃的情况下,如果再发消息给对端,对端会回复 RST

  • 再去读该套接字就会返回 ECONNRESET
  • 再去写该套接字会收到 SIGPIPE 信号或返回 EPIPE 错误
  • 也就是说只有你向崩溃的对端写了一次后,下次读写才能收到通知

对端主机崩溃

  • 对端主机重启前,该错误的表现和网络中断是相同的
  • 如果超时前,对端主机重启了,重传的报文到达对端主机后,对端主机会回复 RST
    • 再去读该套接字就会返回 ECONNRESET
    • 再去写该套接字会收到 SIGPIPE 信号或返回 EPIPE 错误

如果想要不主动发送消息,也检测到对端主机崩溃的情况,可以使用 TCP 的心跳机制

TCP 的心跳机制

给 TCP 套接字设置保活选项( SO_KEEPALIVE )后,如果超过一定时间(默认为两小时)套接字的任一方向上都没有数据交换,TCP 就会给对端发送一个保活探测分节,对端必须响应该分节

可能发生的情况有

  • 对端响应 ACK
    • 应用程序不会收到通知
  • 对端响应 RST
    • 说明对端已崩溃且重新启动,待处理错误被设为 ECONNRESET,套接字本身被关闭
  • 无响应
    • 源自 Berkeley 的实现会每隔一段时间再继续发送数个保活分节,如果这些分节都没有收到响应,待处理错误被设为 ETIMEOUT,套接字本身被关闭
  • 如果套接字收到 ICMP 错误(比如目的地不可达) 作为响应,那么返回对应的错误,套接字本身被关闭

该选项一般用于检测对方主机是否崩溃或不可达,因为对端进程崩溃的情况下,TCP 会发送 FIN,可以通过 select 检测到(select 会指示套接字可读)

标签:对端,主机,模型,TCP,发送,故障,接字,崩溃
来源: https://www.cnblogs.com/ljx-null/p/16470364.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有