【问题原由】:
进行长连接通信时(如移动应用开发中手机端与服务端要维持一个稳定的连接,进行实时消息传递),需要在应用层定义心跳机制。有人问,TCP本身就是可靠传输协议,为什么还需要应用层来实现心跳机制呢?
【明确定义】
TCP的可靠传输是相对于UDP而言,
UDP在传输数据之前不需要先建立连接,远地主机的运输层在接收到UDP报文后,不需要确认。
TCP提供面向连接服务,传输数据前必须三次握手建立连接,接收方确认,四次挥手释放链接,
TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。
【然而】在使用TCP建立连接后
1) 很多防火墙等对于空闲socket自动关闭
2) 对于非正常断开, 服务器并不能检测到(如拔网线,直接关机等).
【解决办法--keepalive属性】
套接字本身是有一套心跳保活机制的,不过
默认的设置并不像我们一厢情愿的那样有效。在双方TCP套接字建立连接后(即都进入ESTABLISHED状态)并且在两个小时左右上层没有任何数据传输的情况下,这套机制才会被激活。
很多人认为两个小时的时间设置得很不合理。为什么不设置成为10分钟,或者更短的时间?(可以通过SO_KEEPALIVE选项设置。)但是这样做其实并不被推荐。实际上这套机制只是操作系统底层使用的一个被动机制,原理上不应该被上层应用层使用。
当系统关闭一个由KEEPALIVE机制检查出来的死连接时,是不会主动通知上层应用的,只有在调用相应的IO操作在返回值中检查出来。
因此,忘记SO_KEEPALIVE,在应用层自己写一套保活机制比较靠谱。
如果实在没办法,懒省事等等其他原因,就先设置keepalive吧
【如何设置keepalive】
1)代码设置
除了keepAlive 开关, 还有keepIdle, keepInterval, keepCount 3个属性, 使用简单, 如下:
int keepAlive = 1; // 开启keepalive属性. 缺省值: 0(关闭)
int keepIdle = 60; // 如果在60秒内没有任何数据交互,则进行探测. 缺省值:7200(s)
int keepInterval = 5; // 探测时发探测包的时间间隔为5秒. 缺省值:75(s)
int keepCount = 2; // 探测重试的次数. 全部超时则认定连接失效..缺省值:9(次)
setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (void*)&keepAlive, sizeof(keepAlive));
setsockopt(s, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));
setsockopt(s, SOL_TCP, TCP_KEEPINTVL, (void*)&keepInterval, sizeof(keepInterval));
setsockopt(s, SOL_TCP, TCP_KEEPCNT, (void*)&keepCount, sizeof(keepCount));
2) 修改配置文件, 对整个系统所有的socket有效.
我们可以用cat命令查看到系统中这几个默认的值.
#cat /proc/sys/net/ipv4/tcp_keepalive_time 7200
#cat /proc/sys/net/ipv4/tcp_keepalive_intvl 75
#cat /proc/sys/net/ipv4/tcp_keepalive_probes 9
修改它们:
#echo 60 > /proc/sys/net/ipv4/tcp_keepalive_time
#echo 5 > /proc/sys/net/ipv4/tcp_keepalive_intvl
#echo 3 > /proc/sys/net/ipv4/tcp_keepalive_probes
引用
http://blog.csdn.net/aa2650/article/details/17027845总结的特别好
分享到:
相关推荐
在TCP/IP协议栈中,Socket接口是应用层与传输层的桥梁,它允许应用程序直接操作TCP或UDP协议。在实际开发中,程序员可以通过Socket API创建连接,发送和接收数据。 TCP(传输控制协议)是网络通信中的另一大核心,...
4. keep-alive:保持连接活跃,检测网络状况。 UDP高级编程则涉及更复杂的应用层逻辑,因为数据的可靠性需要在应用层实现。这可能包括自定义序列号、确认应答、重传策略等。 在"TCP.UDP高级编程"文档中,可能会...
控制套接字的默认行为,例如Keep-Alive和超时设置;以及关闭连接和Applets的相关内容。 第5章介绍了NIO(New Input/Output),这是Java提供的另一种网络通信机制,比传统的I/O更适合处理大量并发连接。NIO的特点是...
Boost.Asio是Boost库的一部分,它提供了异步I/O操作的接口,包括TCP、UDP、Unix域套接字以及定时器等。其设计哲学是“零拷贝”(zero-copy)和“非阻塞”(non-blocking),这使得它在处理大量并发连接时表现出色。...
利用Keep-Alive保持长连接;使用Nagle算法优化小数据包发送。 九、Android套接字选择器 在多路复用连接场景下,Android提供了SocketSelector,它可以监控多个Socket的连接状态,实现非阻塞I/O,提高程序效率。 十...
随后发展到HTTP/1.1,引入了更多的缓存策略如cache-control、E-tag,以及长链接(默认开启Connection:keep-alive)来减少TCP连接的次数。HTTP/1.1还支持断点续传和增加了新的方法如PUT、DELETE,使得设计RESTful API...
控制默认行为章节则讨论了如何调整套接字的行为,比如Keep-Alive、缓存区大小、超时、地址重用等。关闭连接部分介绍了如何安全地关闭一个套接字连接。 NIO(New Input/Output)章节介绍了Java中的一种新的I/O编程...
TCP的keep-alive功能用来检测连接的活跃性,防止因网络问题导致的假死连接。 TCP的端口号是标识不同应用层服务的标识符,与IP地址一起构成唯一标识网络上的进程。TCP场景问题可能涉及拥塞控制、窗口调整、延迟、丢...
HTTP通常基于TCP进行通信,HTTP/1.1引入了持续连接(Keep-Alive)以减少连接建立的开销。 5. **网络优化** 网络优化涉及TCP参数调整、拥塞控制策略、DNS解析优化、缓存策略等多个方面。例如,可以通过调整TCP的RTO...
例如,可以设置Keep-Alive来保持TCP连接的活跃状态,或者调整发送和接收缓冲区的大小以优化性能。 关闭连接是指在网络通信结束后,正确地关闭套接字连接,释放资源。在Java中,应当使用正确的关闭方法来确保资源...
c) 浏览器请求的是持续连接,因为Connection字段设为"keep-alive"。 d) HTTP消息本身并不包含浏览器所在主机的IP地址,这是通过TCP连接的IP层信息确定的。 e) 浏览器类型是Mozilla/5.0,运行在Windows NT 5.1系统上...
- **TCP Keep-Alive**: 也称为TCP保活机制,由内核实现。当长时间无数据交换时,内核会发送探测报文检测连接的有效性,以防因链路故障导致的连接失败。 综上所述,网络包的接收流程涉及了从硬件层到操作系统再到...
4. **套接字选项**:Socket对象可以设置各种选项,如SOCKET_TIMEOUT(超时时间)、KEEP_ALIVE(保持连接活跃)等,以适应不同场景的需求。 四、实战应用 1. **Web服务器**:利用Java网络编程可以实现简单的HTTP...
3. Keep-Alive机制:保持连接活跃,检测并恢复因网络问题导致的连接中断。 4. Nagle算法:优化TCP小数据包发送,提高网络效率。 四、应用实例 MTK_SOCKET的典型应用场景包括移动设备上的网络服务、在线游戏、流媒体...
- **控制默认行为**:可以根据具体需求调整套接字的行为,如启用Keep-Alive选项、调整发送和接收缓存区的大小等。 #### 9. NIO(New IO) - **为什么需要NIO**:传统的IO模型在处理大量连接时效率较低,NIO提供了...
而"In C#中利用Keep-Alive处理Socket网络异常断开的方法 .txt"可能详细介绍了如何利用TCP的Keep-Alive机制来辅助心跳检查,Keep-Alive是TCP协议内置的特性,可以在无数据传输时自动发送探测报文,但其默认配置可能并...
ret = eXosip_listen_addr (IPPROTO_UDP, NULL, 0, AF_INET, 0); if(0 != ret) { eXosip_quit (); AfxMessageBox("Couldn't initialize transport layer!\n"); return false; } 启动事件监听线程: ...