Проблема с буфером сокета Java - PullRequest
2 голосов
/ 14 марта 2011

Я сейчас создаю прозрачный прокси в 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, но у меня та же проблема.

Есть ли способ избежать этой конкатенации полезных нагрузок TCP в Java?

1 Ответ

4 голосов
/ 14 марта 2011

Нет. TCP - это потоково-ориентированный протокол - вот как он должен работать. Если вы хотите увидеть фрагментированные пакеты, представленные различными переходами между вами и партнером, вам понадобится библиотека захвата пакетов.

Вы также можете получать пакеты по 1 байту за раз, концепция «кусков» данных исчезнет, ​​как только клиент доставит свою полезную нагрузку в стек IP. Использование TCP_NODELAY просто гарантирует, что отправитель немедленно передаст данные, а не то, что все прыжки, включая получателя, будут избегать объединения пакетов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...