имеется машина FreeBSD стоящая шлюзом в сеть и Win Vista выходящая через нее на другой (машине). на freebsd работает программа сборщик тсп сегментов: открывает bpf в буфер читает пакеты, которые ловит bpf. Vista качает файл из интернета. задача - получить файл на фре, который качает виста. в общем до тсп протокола все работает. до поры до времени программа собирает сегменты и пишет в файл, но в какой-то момент видно, что виста подтверждает тсп сегмент, который не проходил. что это может быть. rfc 793 ничего не говорит. может bpf не все пакеты ловит???? прилагаю лог с хронологией прохождения пакетов. вот этот фрагмент: tcp: - пришедший тсп сегмент, seq - номер его последовательности, data_len-длина данных в нем , ack - номер подтверждения в нем же, ESTABLISHED -состояние соединения, seq_expected -ожидаемый номер последовательности, seq_last-последний номер сегмента, данные которого записаны в файл с незатейливым названием <ip_1_ip_2/port_src__port_dst>, buffered - сегменты прибывшие вне очереди и как следует - буферезированы)), freed - освобожденные сегменты и записаные в файл по прибытии ожидаемого, т.е. собранные по порядку номеров последовательности.(если buffered == freed => нет буферезированных сегментов. так сделано, чтобы контролировать сколько было израсходовано памяти). Код (Text): ... tcp: seq 911e1789 data_len 5b4 ack 20571db2 flags 10 ESTABLISHED seq_expected 911e1789 seq_last 911e11d5 ack 911e066d buffered 206 freed 206 file MAIN/10.225.69.167_78.24.9.183/0050__F2C2 tcp: seq 911e1d3d data_len 5b4 ack 20571db2 flags 10 ESTABLISHED seq_expected 911e1d3d seq_last 911e1789 ack 911e066d buffered 206 freed 206 file MAIN/10.225.69.167_78.24.9.183/0050__F2C2 tcp: seq 911e22f1 data_len 5b4 ack 20571db2 flags 10 ESTABLISHED seq_expected 911e22f1 seq_last 911e1d3d ack 911e066d buffered 206 freed 206 file MAIN/10.225.69.167_78.24.9.183/0050__F2C2 tcp: seq 911e28a5 data_len 5b4 ack 20571db2 flags 10 ESTABLISHED seq_expected 911e28a5 seq_last 911e22f1 ack 911e066d buffered 206 freed 206 file MAIN/10.225.69.167_78.24.9.183/0050__F2C2 tcp: seq 911e2e59 data_len 5b4 ack 20571db2 flags 10 ESTABLISHED seq_expected 911e2e59 seq_last 911e28a5 ack 911e066d buffered 206 freed 206 file MAIN/10.225.69.167_78.24.9.183/0050__F2C2 tcp: seq 911e340d data_len 5b4 ack 20571db2 flags 10 ESTABLISHED seq_expected 911e340d seq_last 911e2e59 ack 911e066d buffered 206 freed 206 file MAIN/10.225.69.167_78.24.9.183/0050__F2C2 tcp: seq 20571db2 data_len 0 ack 911e1789 flags 10 ESTABLISHED seq_expected 20571db2 seq_last 20571db2 ack 20571db2 buffered 0 freed 0 file MAIN/10.225.69.167_78.24.9.183/F2C2__0050 tcp: seq 20571db2 data_len 0 ack 911e22f1 flags 10 ESTABLISHED seq_expected 20571db2 seq_last 20571db2 ack 20571db2 buffered 0 freed 0 file MAIN/10.225.69.167_78.24.9.183/F2C2__0050 /* вот подтверждается сегмент, который не приходил. ack 911e3f75 !!!!!!! все бы ничего, да только он и не придет((( */ tcp: seq 20571db2 data_len 0 ack 911e340d flags 10 ESTABLISHED seq_expected 20571db2 seq_last 20571db2 ack 20571db2 buffered 0 freed 0 file MAIN/10.225.69.167_78.24.9.183/F2C2__0050 /* вот этот не придет уже!!! или может он все-таки проходил, да bpf мышей не ловит???? */ tcp: seq 20571db2 data_len 0 ack 911e3f75 flags 10 ESTABLISHED seq_expected 20571db2 seq_last 20571db2 ack 20571db2 buffered 0 freed 0 file MAIN/10.225.69.167_78.24.9.183/F2C2__0050 /* программа буферезирует сегмент, пришедший вне очереди (+ плюс в логе это и означает. -минус соответственно освобождение) */ tcp: seq 911e3f75 data_len 5b4 ack 20571db2 flags 10 ESTABLISHED seq_expected 911e39c1 seq_last 911e340d ack 911e3f75 buffered 206 freed 206 file MAIN/10.225.69.167_78.24.9.183/0050__F2C2 + tcp: seq 911e4529 data_len 5b4 ack 20571db2 flags 10 ESTABLISHED seq_expected 911e39c1 seq_last 911e340d ack 911e3f75 buffered 207 freed 206 file MAIN/10.225.69.167_78.24.9.183/0050__F2C2 + tcp: seq 911e4add data_len 5b4 ack 20571db2 flags 10 ESTABLISHED seq_expected 911e39c1 seq_last 911e340d ack 911e3f75 buffered 208 freed 206 file MAIN/10.225.69.167_78.24.9.183/0050__F2C2 + tcp: seq 911e5645 data_len 5b4 ack 20571db2 flags 10 ESTABLISHED seq_expected 911e39c1 seq_last 911e340d ack 911e3f75 buffered 209 freed 206 file MAIN/10.225.69.167_78.24.9.183/0050__F2C2 + tcp: seq 911e5091 data_len 5b4 ack 20571db2 flags 10 ESTABLISHED seq_expected 911e39c1 seq_last 911e340d ack 911e3f75 buffered 210 freed 206 file MAIN/10.225.69.167_78.24.9.183/0050__F2C2 + tcp: seq 911e5bf9 data_len 5b4 ack 20571db2 flags 10 ESTABLISHED seq_expected 911e39c1 seq_last 911e340d ack 911e3f75 buffered 211 freed 206 file MAIN/10.225.69.167_78.24.9.183/0050__F2C2 + tcp: seq 911e61ad data_len 5b4 ack 20571db2 flags 10 ESTABLISHED seq_expected 911e39c1 seq_last 911e340d ack 911e3f75 buffered 212 freed 206 file MAIN/10.225.69.167_78.24.9.183/0050__F2C2 + tcp: seq 911e6761 data_len 5b4 ack 20571db2 flags 10 ESTABLISHED seq_expected 911e39c1 seq_last 911e340d ack 911e3f75 buffered 213 freed 206 file MAIN/10.225.69.167_78.24.9.183/0050__F2C2 + tcp: seq 911e6d15 data_len 5b4 ack 20571db2 flags 10 ESTABLISHED seq_expected 911e39c1 seq_last 911e340d ack 911e3f75 buffered 214 freed 206 file MAIN/10.225.69.167_78.24.9.183/0050__F2C2 + ... спасибо за внимание.
Я вообще никогда не пользовался bpf , могу посоветовать одно, внедрись в первую функцию tcp стека, и будет тебе счастье..гарантировано будешь получать ВСЕ пакеты обрабатываемые tcp протоколом. Хотя нет, токачто вспомнил, внедряйся в первую функцию сетевого стека обрабатывающего ip ! т.к. твои пакеты могут до tcp не доходить во free а пересылаться сразу на win. А да,ещё в третий раз дополню, кажется последний пакет tcp это уже не "установленное соединение" (отправляемое клиентом серверу, откуда качается файл)
кстати забыл сказать - windows натится pf -ом. может поэтому??? ...вообще хочется разобраться что происходит: bpf ли пропускает пакет, или же какая-то хитрость протокола тсп, пропускать некоторые сегменты которая,возможно, освещается в дополнительных рфси??? последний пакет в принципе не нужен, фал к тому времени уже собран. каждое направление у меня описывается структурой, поэтому FIN в любом направлении дает понять, что соединение закрывается, хотя в общем случае соединение закрывается как положено двумя fin-ами и двумя ack-ами.
а что bpf обещал вам или кому то что он все пакеты будет ловить? теорию читайте где то уже обсуждали, что bpf никому ничего не обещает и по определению может не все пакеты улавливать
а ежели пропатчить драйвер сетевой карты и из него сразу же писать в pcap файл, а опосля уже анализировать?? исключен ли в этом случае пропуск сегментов или скорость работы сетевой карты не может гарантировать отлов ВСЕХ пакетов??? ...или мне придется это узнавать на практике???(( пс: я имею ввиду весь трафик, окружающий wifi адаптер, когда он переведен в режим мониторинга.