博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
再聊tcp keepalive机制和与之相关的tcp RST
阅读量:4141 次
发布时间:2019-05-25

本文共 984 字,大约阅读时间需要 3 分钟。

        在http://blog.csdn.net/stpeace/article/details/44162349  《心跳机制tcp keepalive的讨论、应用及“断网”、"断电"检测的C代码实现(Windows环境下)》中, 我已经非常详细地给出了对应的实验和代码。那是很多年前的事了。 本文, 我们继续来简单聊聊这个话题, 简单说一下即可。

        客户端和服务端建立tcp链接后, 假设客户端启用了keepalive机制, 那么在这条tcp链接出现空闲的时候, 就会发keepalive包, 不影响业务数据。 我们来看三种情况。

         1.  假设对端服务器突然断电崩溃(注意: 这和kill服务端进程不一样哈), 那么客户端在尝试一定的keepalive报文后, 会发RST报文, 相当于关链接了。

         2.  假设客户端和服务端之间的网线断掉, 那么客户端在尝试一定的keepalive报文后, 会发RST报文, 相当于关链接了。 这和上述1的情况类似, 本质都是服务端不可达。

         3.  假设服务端断电后又重启, 显然服务端又是可达的,但已经不认识客户端了, 那么客户端发keepalive报文后, 会被地方以RST包来鄙视, 而且鄙视得还很强烈。

        如上3钟情况, 客户端的死链接被清除, 应用程序可以据此判断tcp链接异常, 从而检测到断网断电(或者是服务端的意外崩溃后重启)。有一点要注意, 如果是直接杀死服务端进程, 那么服务端还是回发FIN的, 客户端自然有感知, 这种情况和keepalive没有任何关系。 

       

        要知道, 客户端的keepalive的开启和服务端的keepalive的开启是相互独立的, 没有毛关系。 tcp keepalive机制是RFC中的一部分, 争议很多, 我个人还是持支持的态度。在前面的博文中, 我给出了Windows下的代码, 其实linux下的代码也大同小异, 在此就不再啰嗦, 哪天要用到了, 我再来写, 原理都一样。 我曾经写过Windows和linux下的对应代码, 实践证明, tcp keepalive有效, 靠谱。

        在Stevens的著作《tcp/ip详解卷一》中, 有tcp keepalive的详细介绍, 还有上面3中情况的wireshark包(我买的是最新的书哈,  但估计老版本可能没有这些插图), 非常值得一看。

        先说这么多。

你可能感兴趣的文章
svn out of date 无法更新到最新版本
查看>>
java杂记
查看>>
RunTime.getRuntime().exec()
查看>>
Oracle 分组排序函数
查看>>
删除weblogic 域
查看>>
VMware Workstation 14中文破解版下载(附密钥)(笔记)
查看>>
日志框架学习
查看>>
日志框架学习2
查看>>
SVN-无法查看log,提示Want to go offline,时间显示1970问题,error主要是 url中 有一层的中文进行了2次encode
查看>>
NGINX
查看>>
Qt文件夹选择对话框
查看>>
1062 Talent and Virtue (25 分)
查看>>
1061 Dating (20 分)
查看>>
1060 Are They Equal (25 分)
查看>>
83. Remove Duplicates from Sorted List(easy)
查看>>
88. Merge Sorted Array(easy)
查看>>
leetcode刷题191 位1的个数 Number of 1 Bits(简单) Python Java
查看>>
leetcode刷题198 打家劫舍 House Robber(简单) Python Java
查看>>
NG深度学习第一门课作业2 通过一个隐藏层的神经网络来做平面数据的分类
查看>>
leetcode刷题234 回文链表 Palindrome Linked List(简单) Python Java
查看>>