Android 为什么tcp连接的客户端一次突然发送5个tcp RST数据包?

Android 为什么tcp连接的客户端一次突然发送5个tcp RST数据包?,android,linux,sockets,networking,tcp,Android,Linux,Sockets,Networking,Tcp,设置如下所示: 192.168.74.254是win 2008服务器 192.168.74.81是一款android客户端设备(联想N300 AiO) 两者都通过HP V1910交换机互连,仅此而已 客户端设备连接到服务器,读取一些数据并保持连接,等待稍后可能出现的更多数据。服务器每1秒发送一个“心跳”数据包。客户端设备可以在一段时间内被动接收数据而不发送任何内容(这取决于用户行为),但有时它会突然一次发送5个RST数据包。对于在其上运行的软件,它看起来像是“由对等方重置连接”,即服务器已关

设置如下所示:

  • 192.168.74.254是win 2008服务器
  • 192.168.74.81是一款android客户端设备(联想N300 AiO)
两者都通过HP V1910交换机互连,仅此而已


客户端设备连接到服务器,读取一些数据并保持连接,等待稍后可能出现的更多数据。服务器每1秒发送一个“心跳”数据包。客户端设备可以在一段时间内被动接收数据而不发送任何内容(这取决于用户行为),但有时它会突然一次发送5个RST数据包。对于在其上运行的软件,它看起来像是“由对等方重置连接”,即服务器已关闭连接(尽管是设备发送了5次RST)。这可能在建立连接后5到10分钟内发生。查看过程中的连续ping命令,我们可以看到此时有2到4个ping丢失,或者有几个ping异常延迟(比如3000毫秒,而不是没有代码,这是一个网络问题,因此我可以在右边的“相关”部分看到几个实际上是“相关”的问题。不是所有的问题都有代码。有些问题只是正式地有代码——几行,比如Socket sock=new Socket(),这并没有增加任何问题。不确定这是一个网络问题。看起来是android方面的故意行为。可能需要一些linux或android源代码。我不确定,这就是为什么我要求提供任何见解。无论如何,谢谢你。upd:wireshark日志上看到的RST来自不同的src端口,而不是e当前连接。此src端口是与服务器的上一个连接。我以为这是GC收集上一个连接的InputStream和OutputStream时的情况,他们在关闭时发送此垃圾(因为我在打开新连接时没有关闭流,所以只关闭了套接字)。然后我提供了旧流被显式关闭,但在新连接建立一段时间后,仍然有来自旧TCP端口的RST,但只是偶尔。为什么会这样?为什么会发送它们?upd:定期(如4、5、6、8、10分钟内)我在日志中看到重新发送和重复确认。有时这会导致服务器的连接重置,有时则不会。是GC弄乱了网络数据流吗?GC如何影响低级别TCP/IP协议功能?
W/System.err(  669): java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer)
W/System.err(  669):    at libcore.io.IoBridge.maybeThrowAfterRecvfrom(IoBridge.java:552)
W/System.err(  669):    at libcore.io.IoBridge.recvfrom(IoBridge.java:516)
W/System.err(  669):    at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)
W/System.err(  669):    at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
W/System.err(  669):    at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240)
W/System.err(  669):    at libcore.io.Streams.readSingleByte(Streams.java:41)
W/System.err(  669):    at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:236)
W/System.err(  669):    at xx.xxx.xxxxx.xxxxx.CServerConnection$2.run(CServerConnection.java:122)
W/System.err(  669):    at java.lang.Thread.run(Thread.java:856)
W/System.err(  669): Caused by: libcore.io.ErrnoException: recvfrom failed: ECONNRESET (Connection reset by peer)
W/System.err(  669):    at libcore.io.Posix.recvfromBytes(Native Method)
W/System.err(  669):    at libcore.io.Posix.recvfrom(Posix.java:136)
W/System.err(  669):    at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:164)
W/System.err(  669):    at libcore.io.IoBridge.recvfrom(IoBridge.java:513)
W/System.err(  669):    ... 7 more
private InputStream is;

private Runnable runnable = new Runnable() {
    byte[] readBuffer = new byte[65536*2];

    @Override
    public void run() {

        while (!stop) {
            try {
                int read = is.read();

                if (read == -1)
                    break;

                else {
                     //process data
                }
            } catch (Exception e) {
                e.printStackTrace();
                break;
            }
        }

        reconnect();
    }
};

private void reconnect() {
    if (stop) {
        return;
    }

    try {
        disconnect(); }
    catch (Exception e) {
        e.printStackTrace();
    }

    receiveMessageCallback.disconnected();

    new Thread(new Runnable() {
        @Override
        public void run() {
            while (true) {
                try {
                    Thread.sleep(reconnectTimeout);
                    connect(host, port);
                    break;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }).start();
}