Как обнаружить ретранслированные пакеты, чтобы отбросить их в сокетах TCP в Java - PullRequest
1 голос
/ 23 марта 2011

Я иногда получаю уже полученные пакеты (я использовал сниффер и системные ACKs их).Теперь я читаю все данные (до истечения времени ожидания сокета) и затем отправляю новый запрос, но это ужасно.Я думал об использовании порядковых номеров, но я не нашел его в интерфейсе Socket.Любые подсказки?

Ответы [ 2 ]

6 голосов
/ 23 марта 2011

Нет, ты не. Если принимающий стек TCP пропускает пакет, он будет повторно запрашивать его, но он не мог доставить вам исходный, потому что пропустил его. И если он получит пакет, который уже получил, он его отбросит.

TCP доставит все отправленные байты в порядке их отправки. Ничего другого (ну, кроме некоторых крайних случаев вокруг разъединений).

Что-то еще происходит.

EDIT:

Для ясности, я говорю о байтах, которые доставляются вашему приложению через InputStream сокета. То, что происходит по сети, в значительной степени не имеет значения, если у вас нет какой-то ужасной проблемы с повторной передачей в сети, которую вы пытаетесь исследовать. И если получающий стек действительно получит дубликат пакета, он получит ACK, потому что если этого не произойдет, отправитель повторно отправит его ... снова.

2 голосов
/ 23 марта 2011

Похоже, вы пытаетесь учесть вещи, о которых уже заботится TCP. Он имеет встроенные порядковые номера и позаботится о любых потерянных данных для вас, и из точки приема вы должны ждать, пока вы не получите все ожидаемые данные, вместо того, чтобы повторно отправлять запрос. Если вы не хотите ждать завершения ответа, прежде чем отправлять новый запрос, рассмотрите запросы на конвейерную обработку с несколькими подключениями.

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