如何关闭TCP Keepalive?

时间:2011-03-10 01:51:51

标签: java sockets tcp wireshark keep-alive

我有一个代理服务器的java应用程序和一个充当客户端的android手机。它们通过TCP套接字进行通信。

我经常让客户端睡眠,当缓冲区填充时,我希望wifi收音机能够进入睡眠状态。问题是客户端没有睡觉。我注意到wireshark说我的服务器大约每半秒发送一次TCP KeepAlive数据包,因此wifi无法入睡。我在服务器和客户端上尝试了以下内容。

connectionSocket.setKeepAlive(false);

但这似乎没有任何改变。我正在使用wireshark来分析流量。这是wireshark的屏幕截图...黑线表示我的客户睡着了,接收缓冲区已满。我可以阻止服务器发送keepAlive数据包吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

TCP连接保持打开状态直到关闭,保持活动机制就是检测连接失败。

点击此链接:Does a TCP socket connection have a "keep alive"?

答案 1 :(得分:0)

服务器和客户端之间的中间设备也会发起TCP keep-alive,比如防火墙、网守。 客户端好像不能阻止TCP keep-alive。

答案 2 :(得分:0)

实际上 TCP 保持活动行为取决于 TCP 堆栈的实现。话虽如此,还是应该遵循 RFC 标准。即使 TCP 实现支持 keep-alive,它也应该默认不使用它,除非在连接上有请求。

RFC 1122 section 4.2.3.6 "TCP Keep-Alives"

引用:

Implementors MAY include "keep-alives" in their TCP
implementations, although this practice is not universally
accepted. If keep-alives are included, the application MUST
be able to turn them on or off for each TCP connection, and
they MUST default to off.