【问题标题】:Java socket buffer problemJava套接字缓冲区问题
【发布时间】:2011-03-14 18:53:01
【问题描述】:

我目前正在用 Java 构建一个透明代理。这个透明代理放置在客户端和服务器之间,使用 iptables 重定向 TCP 流。

从 TCP 通信的角度来看,我有以下对话框:

客户端服务器 | ---- TCP 数据包 1 ---> | | ---- TCP 数据包 2 ---> | |

从透明代理的角度(使用套接字),我得到:

客户端服务器 | ---- 来自数据包 1 + 2 的 TCP 有效负载 ---> | |

我的问题是套接字将多个 TCP 有效负载放在一起。我想避免这种行为。

我可以使用数据包的大小来规避这个问题,但这个大小不是恒定的。我尝试使用 tcpNoDelay 选项,但也没有运气。我使用了网络框架netty,但我遇到了同样的问题。

有没有办法在 Java 中避免这种 TCP 有效负载的串联?

【问题讨论】:

    标签: java networking


    【解决方案1】:

    没有。 TCP 是一个面向流 协议 - 这就是它应该 的工作方式。如果您想查看您和对等方之间的各种跃点引入的分段数据包,则需要一个数据包捕获库。

    您也可以一次接收 1 个字节的数据包,一旦客户端将其有效负载传送到 IP 堆栈,数据“块”的概念就消失了。使用TCP_NODELAY 只是确保发送者将立即传输数据——而不是直到包括接收者在内的所有跃点都会避免合并数据包。

    【讨论】:

    • 感谢您的回答。对于您对数据包是框架的事实的回答,我应该添加一个事实,即一切都在 localhost 上完成。此外,我使用 Wireshark 验证没有碎片。我有多个数据包的事实来自服务器和客户端之间的协议。另外,我用 Python 做了一个类似的代理,我没有这个问题。
    • @Jeff E:python 变体的工作只是运气——你永远不能依赖 TCP 来保持从发送方到接收方的数据包大小
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多