心跳包与TCP Keepalive

zhuyf87 2013-01-28 01:24:59
对于TCP长连接,需要“保活”机制。
可以在上层协议中自己定义“心跳包”,也可以使用TCP底层自身的Keepalive机制。
这两种方式采用哪种更好呢?

我没什么网络编程的经验,想听听大家的选择和理由。谢谢。-_-
...全文
623 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
用keepalive做过实验,但是没用到项目里面。
zhangyihu321 2013-01-30
  • 打赏
  • 举报
回复
有人说 keepalive并不是TCP规范的一部分。在Host Requirements RFC罗列有不使用它的三个理由:(1)在短暂的故障期间,它们可能引起一个良好连接(good connection)被释放(dropped),(2)它们消费了不必要的宽带,(3)在以数据包计费的互联网上它们 ,所以建议用心跳包机制
孤客天涯 2013-01-29
  • 打赏
  • 举报
回复
一般用心跳包机制
z8323664 2013-01-29
  • 打赏
  • 举报
回复
引用 7 楼 zhuyf87 的回复:
这里搜到另一个帖子一个网友的回答,我感觉说的挺好。 “套接字本身是有一套心跳保活机制的,不过默认的设置并不像我们一厢情愿的那样有效。在双方TCP套接字建立连接后(即都进入ESTABLISHED状态)并且在两个小时左右上层没有任何数据传输的情况下,这套机制才会被激活。 很多人认为两个小时的时间设置得很不合理。为什么不设置成为10分钟,或者更短的时间?(可以通过S……
学习了
这不是鸭头 2013-01-28
  • 打赏
  • 举报
回复
建议用:在上层协议中自己定义“心跳包”。这样可以方便的记录日志,更方便的控制。
zhuyf87 2013-01-28
  • 打赏
  • 举报
回复
这里搜到另一个帖子一个网友的回答,我感觉说的挺好。 “套接字本身是有一套心跳保活机制的,不过默认的设置并不像我们一厢情愿的那样有效。在双方TCP套接字建立连接后(即都进入ESTABLISHED状态)并且在两个小时左右上层没有任何数据传输的情况下,这套机制才会被激活。 很多人认为两个小时的时间设置得很不合理。为什么不设置成为10分钟,或者更短的时间?(可以通过SO_KEEPALIVE选项设置。)但是这样做其实并不被推荐。实际上这套机制只是操作系统底层使用的一个被动机制,原理上不应该被上层应用层使用。当系统关闭一个由KEEPALIVE机制检查出来的死连接时,是不会主动通知上层应用的,只有在调用相应的IO操作在返回值中检查出来。 因此,忘记SO_KEEPALIVE,在应用层自己写一套保活机制比较靠谱。”
zhuyf87 2013-01-28
  • 打赏
  • 举报
回复
引用 2 楼 sha_jinhao 的回复:
什么是keepalive定时器? 在一个空闲的(idle)TCP连接上,没有任何的数据流,许多TCP/IP的初学者都对此感到惊奇。也就是说,如果TCP连接两端没有任何一个进程在向对方发送数据,那么在这两个TCP模块之间没有任何的数据交换。你可能在其它的网络协议中发现有轮询(polling),但在TCP中它不存在。言外之意就是我们只要启动一个客户端进程,同服务器建立了TC……
keepalive没有任何的数据流?这个有点假了吧。我觉得keepalive只不过是tcp底层实现的“心跳”而已。它也是通过发送keep-alive packet实现的吧。
oyljerry 2013-01-28
  • 打赏
  • 举报
回复
心跳包等于是你可以自己更灵活的控制
c1997sdn 2013-01-28
  • 打赏
  • 举报
回复
建议使用心跳包,自己定义的好控制。
Eleven 2013-01-28
  • 打赏
  • 举报
回复
用心跳机制吧,实在啊~
jimette 2013-01-28
  • 打赏
  • 举报
回复
什么是keepalive定时器? 在一个空闲的(idle)TCP连接上,没有任何的数据流,许多TCP/IP的初学者都对此感到惊奇。也就是说,如果TCP连接两端没有任何一个进程在向对方发送数据,那么在这两个TCP模块之间没有任何的数据交换。你可能在其它的网络协议中发现有轮询(polling),但在TCP中它不存在。言外之意就是我们只要启动一个客户端进程,同服务器建立了TCP连接,不管你离开几小时,几天,几星期或是几个月,连接依旧存在。中间的路由器可能崩溃或者重启,电话线可能go down或者back up,只要连接两端的主机没有重启,连接依旧保持建立。
翅膀又硬了 2013-01-28
  • 打赏
  • 举报
回复
用心跳包吧。否则那些以外断线没法发现。比如直接拔掉网线。
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧