0

私のアプリは、トラフィックの傍受に VpnService を使用しています。


1. ループ内の Tun デバイスから読み取ります。

while (started && tunDevice.valid()) {
    final byte[] bytes = tunDevice.read();
    IpPacket packet = PacketFactory.createPacket(bytes);
    if (packet == null) {
        Thread.yield();
    } else {
        proxyService.handlePacket(packet);
    }
}

TunDevice.read:

@Override
public byte[] read() throws IOException {
    if (!valid()) {
        LOG.warn("TUN: file descriptor is not valid any more");
        return null;
    }

    int length = tunInputStream.read(readBuffer);
    LOG.debug("TUN: Received packet length={}", length);
    if (length < 0) {
        throw new IOException("Tun device is closed");
    }
    if (length == 0) {
        return null;
    }
    return Arrays.copyOfRange(readBuffer, 0, length);
}

2.データを保護されたソケットにプロキシします。

問題は、しばらくすると TUN デバイスからの読み取りが停止することです。読み取りメソッドがハングし、しばらく (3 ~ 5 分など) 待機します。

netstat を使用すると、すべての新しい接続が SYN_SENT 状態にあることがわかり、その理由を理解できます。これらの SYN パケットを受信できないため、コードから ACK を受信できません。

問題は、それは何でしょうか? TUN デバイスがこのように動作するのはいつですか?

4

1 に答える 1

0

私たちの場合、問題は TCP の実装にありました。TCP が受信できるよりも多くのデータを書き込みました (通知されたウィンドウ)。

于 2014-07-23T08:02:34.453 に答える