2011-03-14 88 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