2011-03-14 87 views
2

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

从视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有效载荷连接?

回答

4

编号TCP是一个面向流的协议 - 这是它如何应该工作。如果你想看到你和对等体之间的各种跳跃引入的分片数据包,你需要一个数据包捕获库。

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

+0

谢谢你的回答。为了您对数据包进行框架化的回答,我应该添加一个事实,即一切都在localhost上完成。另外,我使用Wireshark验证没有碎片。我有多个数据包的事实来自服务器和客户端之间的协议。另外,我使用Python完成了一个类似的代理,而且我没有问题。 – 2011-03-14 11:03:58

+0

@Jeff E:python变种的作品只是运气 - 你永远不能依赖TCP保持从发送者到接收者的数据包大小 – Erik 2011-03-14 11:08:18