我目前正在使用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有效负载的连接?
答案 0 :(得分:4)
没有。 TCP是一种面向流的协议 - 这就是应该工作的方式。如果您想查看由您和对等体之间的各种跃点引入的碎片数据包,您将需要一个数据包捕获库。
您也可以一次接收1个字节的数据包,一旦客户端将其有效负载传送到IP堆栈,数据“块”的概念就会消失。使用TCP_NODELAY
只会确保发送方立即传输数据 - 而不是所有跳转到收件人并包括收件人都会避免合并数据包。