2013-10-07 3 views
0

Очень странное поведение ...пакетов фрагментированных UDP не полученных приложение

У меня есть 3 машины:

 
-----------  ------------  ----------- 
| A (x86) |-----| B (x86) |-----| C (arm) | 
| sender |  | receiver |  | sender | 
-----------  ------------  ----------- 
  • А и В Linux (Ubuntu 12.04) машина, ядро ​​3,2;
  • C является машиной android (ICS), ядро ​​3.0.8;
  • Все подключаются через кабели RJ45;
  • Соединения в порядке, сеть настроена правильно;

Издание является: когда машина C (ARM-андроида) посылает UDP-пакет, размер которого полезная нагрузка составляет более 1472 байт (максимальная нагрузка до того пакета фрагментируется), сервер приложений на машине B никогда не сможет получить его , ... относительно этого:

  • Исходные/целевые IP-адреса верны: я могу получить все отправляемые дейтаграммы, если я установил размер полезной нагрузки меньше или равен 1472;
  • На машине B (приемник), если я сбрасываю сетевой трафик с Wireshark, я могу видеть каждый фрагмент, а затем повторно собранное сообщение => с точки зрения Wireshark, это все хорошо!
  • Сравнивая каждый заголовок фрагмента, а также повторно собранное сообщение с тем, что я могу сбросить, когда одно сообщение отправлено с машины A (которое всегда принимается OK), все кажется идеальным (только отличия - это IP-адреса и контрольная сумма, поскольку Контрольная сумма заголовка UDP учитывает поля IP-адреса учетных записей).
  • Нет проблемы с MTU, пакеты фрагментированы, как ожидалось.
  • Нет маршрутизатора/коммутатора между машинами
  • ifconfig не показывает ни падение пакетов, ни переполнение, ни любую другую классическую ошибку!
  • ... это настолько странно !!

Я провел некоторое время в Интернете, но не нашел ни одной темы, как эта. Каждый раз, когда у людей возникают проблемы с UDP, либо их обнаружение MTU было неправильным, либо они неправильно реагировали на процедуру тестирования, либо не могли сбрасывать сообщения на принимающем хосте, ... здесь это не так!

Наверняка, я знаю, что проблема на конце отправителя (машина C), но, возможно, может быть проще включить некоторые журналы (на уровне ядра?) На конце приемника, чтобы понять, почему датаграмма UDP исчезает !? Любой совет? Существуют ли определенные файлы, которые я мог бы проверить/proc/sys/net, или параметры ядра, которые я должен включить?

Большое спасибо.

+0

Несмотря на то, что вы можете быть уверены, пожалуйста, напишите весь адрес: значения подсети порта – markmnl

+0

Я, наконец, нашел проблему. – maqui

+0

Я, наконец, нашел проблему. Добавляя следы в ядре Linux машины B, я смог понять, что датаграмма упала из-за плохой контрольной суммы полезной нагрузки (после ее повторной сборки). По прошествии некоторого времени, я вычислил NIC вычислительной C вычислительной UDP контрольной суммы всех пакетов, независимо от того, были ли они фрагментами или нет. Это привело к тому, что байты 7 и 8 всех фрагментов были перезаписаны этой контрольной суммой. Теперь я исправил проблему в настройке карты NIC, и все в порядке. Спасибо большое! – maqui

ответ

0

Если ваши машины действительно подключены, как показано на рисунке, то есть они не подключены к коммутатору/концентратору, тогда у вас должно быть два сетевых адаптера на B, поэтому у них будут разные адреса, поэтому адрес, который вы используете для отправки в B от A не будет таким же, как отправка в B от C. ie

Может ли адрес, который вы отправляете, быть не так? Хотя это не объясняет, как проходят более мелкие датаграммы - вы уверены, что они есть?

Примечание. Тезисы адресов должны быть назначены вручную, поскольку вы не подключены к DHCP, кроме того, эти адреса должны быть в той же подсети, что и A и C.Все ли ваши адреса (A, BA, BC и C) в одной подсети? Какой адрес: порт - это сокет на B, который подключен и прослушивается? Продолжает ли B получать после получения дейтаграммы? Пожалуйста provdie код ..

OR, даже если ваши машины подключены к коммутатору/концентратору,, является «Не фрагментировать» бит, установленный на дейтаграмм, посланных из C, которые бы объяснить, почему крупные из них отбрасываются но не меньшие.

+0

Я подтверждаю, что машина B имеет два NICS. Я также подтверждаю, что IP-адреса верны. Правильно указан заголовок сообщений (включая флагов фрагментов), это подтверждается Wireshark, и тот факт, что он способен повторно собирать фрагменты. Эта проблема одна из самых странных из тех, что я когда-либо видел. Поверьте мне, я потратил на это некоторое время, а также многие другие люди, работающие со мной ... Именно по этой причине я знаю, что хочу добавить информацию журнала на уровне ядра. – maqui

+0

dodgey firewall? – markmnl

+0

Отсутствие какого-либо брандмауэра на машине B. Ни одно из правил iptables. Дейтаграммы всегда принимаются за исключением случаев, когда размер полезной нагрузки составляет 1473 и более! ... – maqui

Смежные вопросы