java为什么SSHJ的最大写入大小是32KB?
我一直在使用SSHJ将文件写入我的远程SFTP服务器。目前的设置是我有一个Spring批处理ItemWriter,它可以将数据块任意写入一个文件。Jsch不支持此功能,就好像块的顺序不正确一样,然后文件会因为块的顺序不正确而损坏,这就是我转向SSHJ的原因
问题在于数据块的大小。当前,任何大于32KB的大小都会立即中断传输,但以下情况除外
net.schmizz.sshj.connection.ConnectionException: Timeout when trying to expand the window size
我的目标是尽可能提高文件传输的吞吐量,通常通过增加窗口大小或数据包大小来实现。问题是,尽管客户端和socket都在增加,但我得到了以下异常
在读取SSH RFC之后,它指出最大窗口大小可以达到`2^32-1,大致等于4.29GB。因此,如果我将缓冲区大小和窗口大小设置为最大可能的2^32-1,则传输应该可以工作,但出现了上述异常
以下是当前的客户端配置
SSHClient sshClient = new SSHClient();
Connection conn = sshClient.getConnection();
conn.setWindowSize(dataChunkSize);
sshClient.addHostKeyVerifier(new PromiscuousVerifier());
sshClient.connect(destCredUri[0], Integer.parseInt(destCredUri[1]));
Socket socket = sshClient.getSocket();
socket.setTcpNoDelay(true);
socket.setKeepAlive(true);
socket.setSendBufferSize(Math.toIntExact(dataChunkSize));
socket.setReceiveBufferSize(Math.toIntExact(dataChunkSize));
如何将块大小增加到32KB以上?另一方面,任何关于通过SFTP实现吞吐量最大化的建议都是令人惊讶的
事先非常感谢
共 (0) 个答案