文档章节

关于socket长连接的心跳包

LiangX
 LiangX
发布于 2012/11/02 15:50
字数 971
阅读 1082
收藏 8

 【转】http://blog.csdn.net/iamdesmo/article/details/7439193

TCP的socket本身就是长连接的,那么为什么还要心跳包呢?

搜索到的资料解释如下:

一:内网机器如果不主动向外发起连接,外网机没法直连内网的,这也是内网机安全的原因之一吧,又因为路由器会把这个关系记录下来,但是过一段时间这个记录可能会丢失 ,所有每一个客户端每隔一定时间就会向服务器发送消息,以保证服务器可以随时找到你,这东西被称为心跳包。

二:理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。更要命的是,有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉。在这个时候,就需要我们的心跳包了,用于维持长连接,保活。在获知了断线之后,服务器逻辑可能需要做一些事情,比如断线后的数据清理呀,重新连接呀……当然,这个自然是要由逻辑层根据需求去做了。总的来说,心跳包主要也就是用于长连接的保活和断线处理。一般的应用下,判定时间在30-40秒比较不错。如果实在要求高,那就在6-9秒。


三:

如果不主动关闭socket的话,系统不会自动关闭的,除非当前进程挂掉了,操作系统把占用的socket回收了才会关闭。为什么需要心跳连接主要是判断当前连接是否是有效的、可被使用的。在实际应用中假设一段时间没有数据传输时候理论上说应该连接是没有问题的,但是网络复杂,中途出现问题也是常见的,网线被掐断了、对方进程挂掉了、频繁丢包等,这时候TCP连接是不可使用的,但是对于应用层并不知道,如果需知道网络情况则要很复杂的超时进行了解,TCP从底层就实现了这样的功能。心跳机制是TCP在一段时间间隔后发送确定连接端是否还存在,如果存在的话就会回传一个包确定网络有效,如果心跳包有问题,则通知上层应用当前网络有问题了。
 
这取决于你的server端的超时配置, 每个socket连接都是长连接,它是一个相当占用系统资源的通信管道, 如果这个长连接什么事也没干硬是要占着资源,则server端可以选择关闭这个连接,以省下资源让更多的用户连接进来。
所以,即便客户端的是采用死循环while(true)方式连到服务端,对于特定的客户端和服务端类型来说也需要一定时间间隔的心跳(告诉服务端,我还活着,虽然我没干活也没说话,但别把我关了)。

记得以前开发手机游戏时,索爱有一款手机有强制要求,客户端如果超过三分钟无消息发向网络服务端,则会在客户端自动地强制把socket关断。因为socket长连接相对于手机这样资源少的设备来说是宝贵的资源。  (这个强制是指客户端系统自动关的,不是我们代码close的) 


这3个原因都是挺有道理。如果你有更好的解释欢迎交流啊。改天我做个程序测试一下不发心跳包和发心跳包的连接情况。

本文转载自:http://blog.csdn.net/iamdesmo/article/details/7439193

共有 人打赏支持
LiangX
粉丝 22
博文 33
码字总数 12468
作品 0
朝阳
程序员
私信 提问
聊一聊WebSocket

聊一聊WebSocket 会飞的污熊2017-12-261 阅读 webwebsocket WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。依靠这种技术可以实现客户端和服务器端的长连接,双向...

会飞的污熊
2017/12/26
0
0
长连接 短连接 异步 同步 )阻塞与非阻塞详解

一。通信方式 主要有以下三大类: (一)SERVER/CLIENT方式 1.一个Client方连接一个Server方,或称点对点(peer to peer): 2.多个Client方连接一个Server方,这也是通常的并发服务器方式。 3.一...

河北李晓东
2017/11/08
0
0
Android上保持Socket长连接

0.Thanks 性能优化十六之WakeLock唤醒锁以及JobScheduler使用 安卓 java 判断socket断开 android保持服务不休眠(持续运行)以及唤醒屏幕的方法 1.概述 前阵子接到一个用户反馈说,公司的一款...

栗子酱油饼
2018/01/07
0
0
关于TCP长连接和发送心跳的一些理解

作者:郭无心 链接:https://www.zhihu.com/question/35013918/answer/63664974 来源:知乎 著作权归作者所有,转载请联系作者获得授权。 游戏服务器常常有心跳包的设计。 我们的心跳包就是为...

huang19830104
2018/06/28
0
0
android socket长连接资源释放

android socket长连接向服务器发送心跳包,发送一段时间后,在服务端没有接收到客户端发送的心跳包,通过抓包软件没有抓到客户端发送的请求,麻烦看下是什么原因导致的。 android客户端心跳包...

恶里怪
2016/04/29
222
1

没有更多内容

加载失败,请刷新页面

加载更多

linux在线安装JDK(1.8版本)

linux在线安装JDK(1.8版本) 2018年07月03日 15:36:27 唯爱酒神 阅读数:806 标签: linux jdk安装 jdk安装 更多 个人分类: linux 在线下载JDK 命令: wget --no-check-certificate --no-c...

rootliu
22分钟前
0
0
移植Modbus到STM32F103(2):移植FreeModbus到usart3并运行示例代码

FreeModbus是Modbus的一个被广泛移植的实现。其源码在github,最新版是1.6。 FreeModbus支持Modbus功能码里的0x01~0x06,0x0F~0x11和0x17,对一些功能比如异常诊断和读事件计数等功能码并没有...

Konstantine
今天
3
0
浅谈神经网络(神经网络篇)

背景 之前写过浅谈神经网络基础篇,简单介绍下机器学习这块内容,用于扫盲。本文正式将神经网络,这部分是深度学习的基础。了解完可以掌握强大的机器学习的方法,也可以更好的了解深度学习。...

Uknowzheng
今天
5
0
移动硬盘变为RAW格式后的修复

在Mac上使用自己的移动硬盘结果文件系统格式变为RAW; 在自己windows笔记本上使用chkdsk H: /F进行修复,修复日志如下: C:\Users\mengzhang6>chkdsk H: /F文件系统的类型是 NTFS。卷标是 do...

晨猫
今天
4
0
10 Git —— 标签管理

10 Git —— 标签管理 本节内容: 命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;命令git......

lwenhao
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部