Форум сайта python.su
Уважаемые господа!
Прошу у Вас помощи в решении вопроса, связанного с проведение расчётов.
Постараюсь объяснить простыми словами, если конечно смогу (((
Предполагаю что мой код вызовет у Вас уныние, поэтому сразу прошу прощения. Я хотел было выполнить расчёты в MS ms excel, но он как оказалось не может работать с такими большими таблицами!
Суть моих расчётов заключается в получении значений величины времени для каждого сетевого пакета, следующего от сервера port1 = 443 к клиенту port2 = 53023 в пределах которого значение sequence number будет находиться в окне клиента.
Например, берем пакет № 646700, в нем sequence number = 617352158, а из пакета № 646699 извлекаем значение окна клиента и считаем, до какого времени значение sequence number (передаваемых данных) сервером не превысит окно клиента, получаем значение времени, записываем в файл, берем следующий пакета с данными 646701 и т.д.
Интересуют только значение времени для пакетов, следующих от сервера к клиенту. Также в датафрейме присутствует изменение окна клиента, которое нужно учитывать.
П.С. Остальные значение NUMBJ, NUMBI, NUMBJ - NUMBI, WST не так важны, их можно и не рассматривать.
Код я конечно составил, но он выполняется он очень-очень медленно!
Имеется датафрейм data.csv, полученный экспортом из wireshark
“No.”,“Time”,“port1”,“port2”,“Seq”,“Ack”,“CWS”
“1”,“0.000000”,“53023”,“443”,“0”,“0”,“64240”
“2”,“0.039781”,“443”,“53023”,“0”,“1”,“64240”
“3”,“0.040341”,“53023”,“443”,“1”,“1”,“131840”
“4”,“0.048941”,“53023”,“443”,“1”,“1”,“131840”
…
“646699”,“384.921299”,“53023”,“443”,“678”,“617352158”,“4232192”
“646700”,“384.921432”,“443”,“53023”,“617352158”,“678”,“64128”
“646701”,“384.921432”,“443”,“53023”,“617353518”,“678”,“64128”
“646702”,“384.921432”,“443”,“53023”,“617354878”,“678”,“64128”
“646703”,“384.921432”,“443”,“53023”,“617356238”,“678”,“64128”
“646704”,“384.921432”,“443”,“53023”,“617357598”,“678”,“64128”
“646705”,“384.921749”,“53023”,“443”,“678”,“617358958”,“4232192”
“646706”,“384.921921”,“443”,“53023”,“617358958”,“678”,“64128”
…
“11200490”,“4052.560404”,“53023”,“443”,“678”,“2166491223”,“8464640”
“11200491”,“4052.560461”,“443”,“53023”,“2166491223”,“678”,“64128”
“11200492”,“4052.560461”,“443”,“53023”,“2166492583”,“678”,“64128”
“11200493”,“4052.560461”,“443”,“53023”,“2166493943”,“678”,“64128”
“11200494”,“4052.560544”,“53023”,“443”,“678”,“2166494291”,“8464640”
“11200495”,“4052.615866”,“53023”,“443”,“678”,“2166494291”,“0”
Код:
data = pd.read_csv("data.csv", delimiter=",") WST = 64240 SEQT = 0 for i in range(1,11200495): PI = data.at[i, "port1"] WSI = data.at[i, "CWS"] TI = data.at[i, "Time"] SEQI = data.at[i, "Seq"] NUMBI = data.at[i, "No."] j = i if SEQI + 1000000 < SEQT and PI == 443: SEQT = SEQI if SEQI > SEQT and PI == 443: SEQT = SEQI Buffer = WST while Buffer > 0: j = j + 1 PJ = data.at[j, "port1"] WSJ = data.at[j, "CWS"] TJ = data.at[j, "Time"] SEQJ = data.at[j, "Seq"] NUMBJ = data.at[j, "No."] if PJ == 443 and SEQJ > SEQT and Buffer > 0: SEQ = SEQJ - SEQI Buffer = WST - SEQ T = TJ - TI if PJ == 53023: WST = WSJ PJ = data.at[j - 1, "port1"] TJ = data.at[j - 1, "Time"] T = TJ - TI NUMBJ = data.at[j - 1, "No."] print(round(T, 5), NUMBJ, NUMBI, NUMBJ - NUMBI, WST, file=open("log.txt", "a")) if PI == 53023: WST = WSI
if SEQI + 1000000 < SEQT and PI == 443: SEQT = SEQI
Офлайн
user555
Например, берем пакет № 646700, в нем sequence number = 617352158, а из пакета № 646699 извлекаем значение окна клиента и считаем, до какого времени значение sequence number (передаваемых данных) сервером не превысит окно клиента, получаем значение времени, записываем в файл, берем следующий пакета с данными 646701 и т.д.
Интересуют только значение времени для пакетов, следующих от сервера к клиенту. Также в датафрейме присутствует изменение окна клиента, которое нужно учитывать.
Офлайн
xam1816Постараюсь более подробно объяснить. Буду премного благодарен, если поможете.
if PI == 53023: WST = WSI
print(round(T, 5), NUMBJ, NUMBI, NUMBJ - NUMBI, WST, file=open("log.txt", "a"))
Офлайн
Датафрейм большой 11 млн. строк
У меня выполняется очень медленно. Присутствуют ошибки в расчетах.
Так, согласно моему алгоритму, для 2-го пакета (строки) я бы получил время от 152 пакета (строки).
т.к. у меня:
PJ = data.at[j - 1, "port1"] TJ = data.at[j - 1, "Time"] T = TJ - TI
Офлайн
> Датафрейм большой 11 млн. строк. У меня выполняется очень медленно
А ты как хотел? Я бы это в Postgres загружал и там бы рассчитывал. Ну а тебе проще будет посмотреть в сторону какого нибудь pandas или numpy.
Офлайн
user555Надо объяснять всё простыми словами. Даже самые сложные программы записываются простыми словами изначально.
Постараюсь объяснить простыми словами, если конечно смогу (((
user555Получить нужно что? Что значит “значений величины времени для каждого сетевого пакета”? Времени чего?
Суть моих расчётов заключается в получении значений величины времени для каждого сетевого пакета, следующего от сервера port1 = 443 к клиенту port2 = 53023 в пределах которого значение sequence number будет находиться в окне клиента.
Например, берем пакет № 646700, в нем sequence number = 617352158, а из пакета № 646699 извлекаем значение окна клиента и считаем, до какого времени значение sequence number (передаваемых данных) сервером не превысит окно клиента, получаем значение времени, записываем в файл, берем следующий пакета с данными 646701 и т.д.
"No.","Time","port1","port2","Seq","Ack","CWS"
"1","0.000000","53023","443","0","0","64240"
No. Time port1 port2 Seq Ack CWS
1 0.000000 53023 443 0 0 64240
Отредактировано py.user.next (Июнь 23, 2024 05:21:20)
Офлайн
user555
Датафрейм большой 11 млн. строк
У меня выполняется очень медленно. Присутствуют ошибки в расчетах.
Отредактировано xam1816 (Июнь 23, 2024 13:00:34)
Офлайн
Для удобства понимания упрощу данные.
Там, где проставлены “-” тоже есть данные, только для удобства их убрал, они в расчёте не участвуют.
No. Time port1 Seq CWS 1 0.01 53023 - 50 2 0.02 443 0 - 3 0.03 53023 - 55 4 0.04 443 49 - 5 0.05 53023 - 60 6 0.06 443 100 - 7 0.07 53023 - 70 8 0.08 443 140 - 9 0.09 53023 - 100 10 0.10 53023 - 100 11 0.11 443 210 - 12 0.12 443 240 - 13 0.13 443 270 -
Расчёт для 2-й строкиБеру 3-ю строку, у неё значение port1=53023, получаю из нее значение CWS=55.
Беру 3-ю строку, у неё значение port1=53023, значит из неё я получаю значение CWS=55.
т.к значение CWS изменилось с 50 на 55, теперь для второй строки мне нужно искать разницу во времени между 2-ю строкой и строкой, в которой SEQ будет не больше 55.
Беру 4-ю строку, у неё значение port1=443, получаю из неё значение SEQ4=49, считаю SEQ4-SEQ2=49
Если разность SEQ4-SEQ2 не больше CWS (на данный момент оно 55) беру следующую строку.
Беру 5-ю строку, у неё значение port1=53023, значит из неё я получаю значение CWS=60.
т.к значение CWS изменилось с 55 на 60, теперь для второй строки мне нужно искать разницу во времени между 2-ю строкой и строкой, в которой SEQ будет не больше 60.
Беру 6-ю строку, у неё значение port1=443, получаю из неё значение SEQ6=100, считаю SEQ6-SEQ2=100
Разность SEQ6-SEQ2 больше CWS (на данный момент оно 60), значит оно не подходит.
Последняя строка, в которой разность была не больше CWS была 4, значит мне нужно взять время из 4 строки (0.04) из из него вычесть время 2 строки (0.02).
Полученное значение записать в файл (0.02).
Расчёт для 4-й строкиБеру 5-ю строку, у неё значение port1=53023, получаю из нее значение CWS=60.
Беру 5-ю строку, у неё значение port1=53023, значит из неё я получаю значение CWS=60.
т.к значение CWS изменилось с 55 на 60, теперь для четвёртой строки мне нужно искать разницу во времени между 4-й строкой и строкой, в которой SEQ будет не больше 60.
Беру 6-ю строку, у неё значение port1=443, получаю из неё значение SEQ6=100, считаю SEQ6-SEQ4=51
Если разность SEQ6-SEQ4 не больше CWS (на данный момент оно 60) беру следующую строку.
Беру 7-ю строку, у неё значение port1=53023, значит из неё я получаю значение CWS=70.
т.к значение CWS изменилось с 60 на 70, теперь для четвёртой строки мне нужно искать разницу во времени между 4-й строкой и строкой, в которой SEQ будет не больше 70.
Беру 8-ю строку, у неё значение port1=443, получаю из неё значение SEQ8=140, считаю SEQ8-SEQ4=140-49=91
Разность SEQ8-SEQ4 больше CWS (на данный момент оно 70), значит оно не подходит.
Последняя строка, в которой разность была не больше CWS была 7, значит мне нужно взять время из 7 строки (0.07) из из него вычесть время 4 строки (0.04).
Полученное значение записать в файл (0.03).
No. Time port1 Seq CWS 100019 456.19 53023 - 1100 100020 456.20 443 4294967290 - 100021 456.21 443 4294967291 - 100022 456.22 443 300 - 100023 456.23 53023 - 1000 100024 456.24 443 310 - 100025 456.25 443 340 -
xam1816
И интересно узнать для себя, какую проблему решает ваша задача, т.е. что она дает
Отредактировано user555 (Июнь 23, 2024 20:19:44)
Офлайн
xam1816В целом верно.
Seq - это последовательный номер байта в пакете при передаче от одного порта к другому
CWS - это количество байт которые могут быть переданы без проверки (окно)
Ack - это число которое будет передано в следующем байте для проверки
xam1816Конечная цель получить отметки времени и визуально отобразить.
И интересно узнать для себя, какую проблему решает ваша задача, т.е. что она дает
Отредактировано user555 (Июнь 23, 2024 18:00:16)
Прикреплённый файлы:
Figure_2.png (77,5 KБ)
Офлайн
RodegastХотелось бы чуть-чуть побыстрее!
> Датафрейм большой 11 млн. строк. У меня выполняется очень медленноА ты как хотел? Я бы это в Postgres загружал и там бы рассчитывал. Ну а тебе проще будет посмотреть в сторону какого нибудь pandas или numpy.
Офлайн