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 状态,我可以理解原因 - 它们无法从我的代码中接收 ACK,因为我无法接收这些 SYN 数据包。

问题是:它可能是什么?TUN 设备什么时候可以这样?

4

1 回答 1

0

在我们的例子中,问题出在我们的 TCP 实现中。我们写入的数据超过了 TCP 可以接收的数据(广告窗口)。

于 2014-07-23T08:02:34.453 回答