Java套接字缓冲区问题

时间:2011-03-14 10:48:48

标签: java networking

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

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

Client                 Server
  | ---- TCP Packet 1 ---> |
  | ---- TCP Packet 2 ---> |
  | <--- TCP Packet 3 ---- |
  | <--- TCP Packet 4 ---- |

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

Client                                    Server
  | ---- TCP Payloads from packet 1 + 2 ---> |
  | <--- TCP Payloads from packet 3 + 4 ---- |

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

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

有没有办法避免Java中这种TCP有效负载的连接?

1 个答案:

答案 0 :(得分:4)

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

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