我有一个代理服务器的java应用程序和一个充当客户端的android手机。它们通过TCP套接字进行通信。
我经常让客户端睡眠,当缓冲区填充时,我希望wifi收音机能够进入睡眠状态。问题是客户端没有睡觉。我注意到wireshark说我的服务器大约每半秒发送一次TCP KeepAlive数据包,因此wifi无法入睡。我在服务器和客户端上尝试了以下内容。
connectionSocket.setKeepAlive(false);
但这似乎没有任何改变。我正在使用wireshark来分析流量。这是wireshark的屏幕截图...黑线表示我的客户睡着了,接收缓冲区已满。我可以阻止服务器发送keepAlive数据包吗?
谢谢!
答案 0 :(得分:1)
TCP连接保持打开状态直到关闭,保持活动机制就是检测连接失败。
答案 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.