Назад | Перейти на главную страницу

Отладка, почему отбрасываются сетевые пакеты

Предисловие:

У меня есть приложение, которое я сейчас тестирую и работающее на RHEL 6. Настройка для моего теста - это приложение, установленное на встроенном устройстве, подключенном кабелем Ethernet к ПК, который взаимодействует с виртуальной машиной на том ПК, на котором запущен Linux. Виртуальная машина (на VMWare Workstation) на ПК и встроенное устройство имеют статический IP-адрес, поскольку им необходимо связываться друг с другом по кабелю Ethernet.

Приложение должно обмениваться данными, используя pub-sub инструмент в этом случае RTI DDS. Это было протестировано в беспроводной среде и другой проводной среде с другим ПК, но с той же виртуальной машиной, и в обеих этих средах работает pub-sub.

Проблема:

При тестировании pub-sub на текущей настройке мы можем увидеть wireshark все фрагментированные пакеты, доставленные от встроенного устройства, доставляются в основную операционную систему ПК (в данном случае Windows). Однако, когда фрагментированные пакеты отправляются из основной операционной системы в операционную систему виртуальных машин, виртуальная машина получает только последний полученный пакет, как показано на wireshark а остальные отбрасываются.

До сих пор мы пытались отключить firewalls и pinging устройства друг от друга, которые все работают правильно и не имеют проблем. Таким образом, мы не смогли понять, почему отбрасываются пакеты.

Каким способом можно отладить, как и почему отбрасываются сетевые пакеты, возможно, даже возможно через wirehark, поскольку в настоящее время мы используем этот инструмент?

В общем, я подозреваю, что MTU (размер кадра) является корнем проблемы. У меня есть несколько причин и несколько предложений.

Во-первых, это поведение зависит от уровня L2 (это происходит только с проводным трафиком, а не с беспроводным). Это само по себе подозрительно и предполагает наличие проблемы на уровне интерфейса.

Во-вторых, фрагментация пакетов является признаком несовпадения MTU. Фрагментация пакетов сама по себе не является проблемой, но не оптимальна, поскольку создает накладные расходы и дополнительные точки отказа.

В-третьих, гостевая виртуальная машина Linux получает только «самый последний полученный пакет» - это известная проблема с некоторыми сетевыми адаптерами и версиями VMware.

Теперь, когда хозяин является получение любого дела, и поскольку Размер MTU влияет только на отправленные пакеты, вы не можете изменить свой MTU на виртуальной машине и ожидать чего-то другого. Однако вы можете сделать следующее:

Предложения

Определите, является ли MTU проблемой

Бегать ping -f -l (your host vm adapter mtu, which is a #) your.guest.ip.or.name , лайк ping -f -l 1500 myguest.

Если это работает при использовании -l значение вашего текущего MTU, то я ошибаюсь и игнорирую. В противном случае продолжайте понижать -l значение до тех пор, пока он не ответит, затем установите для виртуального адаптера хоста этот MTU. Видеть http://www.thincomputing.net/2011/06/28/mtu-size-mismatch-a-major-cause-of-disconnections/

Используйте другой vNic Водитель на рабочей станции VMware

Существуют известные проблемы с некоторыми ОС, определенными vNic и некоторыми гипервизорами. Я включил некоторые исследования известных проблем с vmware ниже, но просто попробуйте использовать другой драйвер vNIC на гостевой машине. Если вы используете E1000, попробуйте один из более новых. Если вы используете vmxnet3, попробуйте 2 или E1000. И т. Д. Если это исправит, вы можете либо оставить его, либо найти конкретный драйвер, который у вас был ранее, чтобы узнать, как исправить его с помощью vmware.

Поэкспериментируйте с меньшим MTU на вашем хосте

Уменьшите MTU на вашем хосте с того места, где оно было сейчас (вероятно, около 1500), до примерно 1380. Если проблема исчезнет, ​​продолжайте увеличивать его, пока не достигнете 1468. Оставьте это.