Как определить первый и последний сегмент в сырых TCP пакетах при IP фрагментации?
Добрый вечер. Есть IP трафик, я его слушаю и делаю свои грязные делишки. Всё хорошо,но как только посылается пачка данных больше MSS (1460 байт), MTU 1500 (Ehernet), естественно на IP уровне он нарезается на сегменты в размер 1460 + 20 (ip header size) + 20 (tcp header size) и получаются куски,которые мне не нужны, а нужен конечный пакет в виде TCP данных. Смотрел через Wireshark, первый и следующие,кроме последнего пакет идет без флага PSH, но с данными, а последний с флагам PSH и тоже с данным. RFC почитал, не нашел\не понял. Будет ли корректна следующая логика:
определение первого и всех следующих пакетов(кроме последнего) - если флаг ACK и данные > 0
определение последнего пакета - если флаг ACK+PSH и данные > 0
Буду рад любой информации. Спасибо=)
Я не очень понял, что вы называете "первый и последний сегмент"? Первый входящий сегмент содержит SYN в TCP-флагах, последний содержит FIN или RST.
получаются куски,которые мне не нужны, а нужен конечный пакет в виде TCP данных
Читайте RFC по IPv4 ( https://www.ietf.org/rfc/rfc791.txt ), часть Fragmentation and Reassembly. Коротко -- вам нужно выловить все IP-фрагменты TCP-сегмента (IP-пакеты с одинаковыми наборами {source address, destination address, protocol, identification}) и поместить их данные согласно значению в поле Fragment offset в буфер, где вы собираете TCP-сегмент. Приём сегмента заканчивается по истечении таймаута сборки или по приёме всех фрагментов сегмента.
Для сборки нужно только знать ID пакета из IP-заголовка и по нему собирать с учетом позиции.
Признак последнего фрагмента в пакете - сброшенный флаг MF; при этом нужно не забывать, что фрагменты могут идти не в последовательности, поэтому пакет считается собранным, когда получены все фрагменты.