gpt4 book ai didi

java - 发送 ACK 会大大减慢数据传输速度

转载 作者:可可西里 更新时间:2023-11-01 02:38:19 24 4
gpt4 key购买 nike

意识到 TCP 校验和实际上是一个非常差的校验和这一事实促使我在数据 block 中包含一个额外的校验和 (SHA-256) 以验证服务器上数据的完整性,并在损坏的情况下请求数据再次阻止。但是ACK的加入大大降低了数据传输速率。在我的例子中(数据通过 wifi 传输)速度从 ~90mbps 降低到 ~12mbps。

客户:

SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("192.168.31.30", 3333));
ByteBuffer byteBufferData = ByteBuffer.allocateDirect(1024 * 8);
ByteBuffer byteBufferACK = ByteBuffer.allocateDirect(1);
for (int i = 0; i < 1024; i++) {
// write data (payload + checksum (SHA-256))
socketChannel.write(byteBufferData);
byteBufferData.clear();
// read ACK
socketChannel.read(byteBufferACK);
byteBufferACK.clear();
// if (byteBufferACK.get() == XXX)
// ... retransmission byteBufferData
}

服务器:

    ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetSocketAddress(3333));
SocketChannel socketChannel = serverSocketChannel.accept();
ByteBuffer byteBufferData = ByteBuffer.allocateDirect(1024 * 8);
ByteBuffer byteBufferACK = ByteBuffer.allocateDirect(1);
long startTime = System.currentTimeMillis();
while ((socketChannel.read(byteBufferData)) != -1) {
// when 8192 bytes of data were read
if (!byteBufferData.hasRemaining()) {
byteBufferData.clear();
// write ACK
socketChannel.write(byteBufferACK);
byteBufferACK.clear();
}
}
System.out.println(System.currentTimeMillis() - startTime);

请注意,该代码是测试代码,并不旨在传达任何有用的数据。它仅用于测试数据传输速率。

我有两个问题:

  1. 也许我不明白或做错了什么,但为什么发送一个字节的数据作为数据接受确认 (ACK) 会如此影响整体数据传输速率?如何避免这种情况?
  2. SHA-256 是否足以作为 8kb 大小数据的校验和? (在现有的 TCP CRC 之上)

最佳答案

因为你在等待它。假设您和服务器之间有 200 毫秒的延迟。如果没有 ack,您会尽快写入数据包,使带宽饱和,然后停止。有了 ack,它看起来像这样:

t=0  send 1st 8k
t=200 server recieves
t=205ish server sends ack
t=405 client recieves ack.
t=410ish client sends 2nd 8k

您浪费了 50% 的发送时间。我真的很惊讶它并没有变得更糟。

TCP 有很多功能可以防止这类问题,包括数据的滑动窗口(你不发送一个数据包并确认它,你发送 N 个数据包,服务器确认它收到的数据包,允许丢失重新发送的数据包乱序)。你重新实现 TCP 很糟糕,几乎肯定不应该这样。

如果您打算这样做,请不要使用 TCP。使用 UDP 或原始套接字并在此基础上编写新协议(protocol)。您仍在使用 TCP 确认和校验和,因此您的是多余的。

关于java - 发送 ACK 会大大减慢数据传输速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48115706/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com