Насколько это неправильно? Думаю, на этот вопрос сложно ответить однозначно. С технической точки зрения, я не думаю, что это само по себе неправильно, поскольку, похоже, оно не нарушает какие-либо RF C для повторной сборки фрагментов, но это, безусловно, неэффективно, и могут быть механизмы для удаления фрагментов этого Сортировать. Рассматривая различные RF C, я столкнулся со следующими соответствующими или связанными RF C:
- RF C 791 : Inte * Протокол 1044 *
- RF C 815 : алгоритмы сборки дейтаграмм IP
- RF C 1858 : соображения безопасности при фильтрации фрагментов IP
- RF C 3128 : защита от варианта атаки крошечного фрагмента
Могут быть и другие. Эти RF C не рассматривают этот конкретный случай; тем не менее, они учитывают вопросы повторной сборки и безопасности для других случаев, поэтому я полагаю, что разумнее всего будет изменить ваш стек IP, если это возможно, чтобы избежать неэффективной передачи пустой дейтаграммы. Вы не только повысите эффективность, но и избежите любых потенциальных проблем, которые могут возникнуть в этом случае. Учитывая количество устройств и IP-стеков, я бы сказал, что рискованно оставлять реализацию такой, какая она есть, но это только мое мнение.
Что касается того, почему Wireshark не собирает фрагментированные фрагменты датаграммы, это просто. IP-анализатор ( packet-ip. c) в настоящее время ожидает как минимум 1 байт полезной нагрузки. Вот соответствующий фрагмент кода из этого файла:
/* If ip_defragment is on, this is a fragment, we have all the data
* in the fragment, and the header checksum is valid, then just add
* the fragment to the hashtable.
*/
save_fragmented = pinfo->fragmented;
if (ip_defragment && (iph->ip_off & (IP_MF|IP_OFFSET)) &&
iph->ip_len > hlen &&
tvb_bytes_exist(tvb, offset, iph->ip_len - hlen) &&
ipsum == 0) {
ipfd_head = fragment_add_check(&ip_reassembly_table, tvb, offset,
pinfo,
iph->ip_proto ^ iph->ip_id ^ src32 ^ dst32 ^ pinfo->vlan_id,
NULL,
(iph->ip_off & IP_OFFSET) * 8,
iph->ip_len - hlen,
iph->ip_off & IP_MF);
next_tvb = process_reassembled_data(tvb, offset, pinfo, "Reassembled IPv4",
ipfd_head, &ip_frag_items,
&update_col_info, ip_tree);
} else {
...
}
В качестве простого теста я настроил последний фрагмент пакета из двух частей так, чтобы он содержал 0 байтов. Затем я внес следующие изменения в IP-анализатор:
iph->ip_len >= hlen &&
После перекомпиляции Wireshark пакет был повторно собран. Итак, я считаю, что это простое изменение позволило бы Wireshark успешно собрать фрагменты того типа, который у вас есть сейчас, где последний фрагмент не содержит данных. Хотя я думаю, что ваш IP-стек все еще должен быть изменен, чтобы избежать отправки этих пустых фрагментов, я также считаю, что в соответствии с законом Постеля , что Wireshark должен быть модифицирован для обработки этого случая, хотя и с "Экспертной информацией " добавлено для обозначения этого странного пустого фрагмента, чтобы разработчики могли быть предупреждены об их неэффективных реализациях. В связи с этим я бы порекомендовал вам подать запрос об ошибке улучшения Wireshark , чтобы Wireshark могла собирать такие фрагменты.