Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 30, 2024 00:46:08

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9795
Репутация: +  849  -
Профиль   Отправить e-mail  

Оптимизация скорости выполнения расчётов

user555
57 Возвращаюсь к строке 52, беру следующее значение N=4 и передаю CWS=60 в цикл N.
В этой 57-й строке у тебя N равно 4, похоже на опечатку.

user555
Выходные данные
Выходные данные не сокращай, запиши все строки.

Можешь отредактировать сообщение своё последнее только в этих двух моментах. Но больше ничего не меняй в нём.



Отредактировано py.user.next (Июнь 30, 2024 00:46:43)

Офлайн

#2 Июнь 30, 2024 01:18:01

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1336
Репутация: +  116  -
Профиль   Отправить e-mail  

Оптимизация скорости выполнения расчётов

user555
CWS - размер буфера в байтах. Размер буфера меняется как в большую, так и в меньшую сторону.

Как я понял cws - это количество байт, которые сервер может отправлять клиенту без подтверждения, что клиент их принял, дойдя до этого числа сервер останавливает передачу и ждет подтверждения от клиента

Офлайн

#3 Июнь 30, 2024 01:31:04

user555
Зарегистрирован: 2024-06-20
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Оптимизация скорости выполнения расчётов

xam1816
Как я понял cws - это количество байт, которые сервер может отправлять клиенту без подтверждения, что клиент их принял, дойдя до этого числа сервер останавливает передачу и ждет подтверждения от клиента
Точно так, но суть исследования чуть-чуть другая. Если желаете опишу. После того, как пересчитаю полученные результаты, а то я от своих детских ошибок уже красный сижу перед монитором.
user555
В этой 57-й строке у тебя N равно 4, похоже на опечатку.
Исправил.
py.user.next
Выходные данные не сокращай, запиши все строки.
Дополнил. Еще раз проверил.

Отредактировано user555 (Июнь 30, 2024 01:52:09)

Офлайн

#4 Июнь 30, 2024 01:59:56

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1336
Репутация: +  116  -
Профиль   Отправить e-mail  

Оптимизация скорости выполнения расчётов

user555
Точно так, но суть исследования чуть-чуть другая. Если желаете опишу.
Из предыдущих сообщений понял что идея в том, когда серверу выделено образно 1000 байт он отправил только 500,и злоумышленник этим воспользовался и передал своих еще 500. Если клиент отправил обратно ASK - подтверждение что прочитал 1000 (500 сервер + 500 злоумышленник), то значит атака удалась. Стоит вопрос возможно ли это

Офлайн

#5 Июнь 30, 2024 02:29:55

user555
Зарегистрирован: 2024-06-20
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Оптимизация скорости выполнения расчётов

xam1816
Из предыдущих сообщений понял что идея в том, когда серверу выделено образно 1000 байт он отправил только 500,и злоумышленник этим воспользовался и передал своих еще 500. Если клиент отправил обратно ASK - подтверждение что прочитал 1000 (500 сервер + 500 злоумышленник), то значит атака удалась. Стоит вопрос возможно ли это
Верно. Суть оценить доступные окна, для каждого пакета данных (в моем пример это строки с port1=443), потом нужно учесть время работы скрипта по модификации перехваченного пакета, плюс оценить задержку на передачу и понять в пределах сетевой сессии, насколько это будет успешно, сервер ведь тоже в этот момент продолжает передачу. И может получиться так, что окно на которое рассчитывает злоумышленник уже закроется полезными данными. Оценить эту возможность при проводном подключении и через сеть подвижной мобильной связи, так как сама суть работы сетей подвижной мобильной связи заставляет работать с большими окнами, что бы утилизировать канал связи более эффективно.
Стеки некоторых ОС принимают новые данные (seq больше текущего значения в сессии) со старыми подтверждениями (ACK, которые уже приняты). Что приводит к внедрению ложных данных клиенту в буфер и аварийному завершению соединения. Это меня и натолкнуло провести расчёт.
Как правило в каждом пакете объем переданных полезных данных не превышает 1448 байт (только полезные данные меняют значения seq и ack, служебные данные протокола их не меняют), при этом значения окна значительно больше , скажем 1271296 (в проводном) или 8464640 (при беспроводном), а могут быть еще больше. Или соединение вообще может находиться в простое и полезные данные не передавать.

Что-то вроде поставленного теоретического вопроса:
А вот если я перехвачу первый пакет (строку) каким временем я буду располагать, что бы модифицировать пакет и отправить его обратно, зная максимальное окно на данный момент и указав в данном пакете seq максимальный на данный момент, который сможет принять клиент, т.е находящийся в пределах окна клиента. А если второй перехвачу и т.д.

Отредактировано user555 (Июнь 30, 2024 02:46:08)

Офлайн

#6 Июнь 30, 2024 07:02:13

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9795
Репутация: +  849  -
Профиль   Отправить e-mail  

Оптимизация скорости выполнения расчётов

user555
Входные данные:
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 -
14 0.14 53023 - 105
15 0.15 443 300 -
16 0.16 53023 - 150
17 0.17 443 400 -
18 0.18 443 550 -
19 0.19 53023 - 160
20 0.20 443 650 -
21 0.21 443 670 -
22 0.22 443 700 -
23 0.23 53023 - 170
24 0.24 443 800 -
25 0.25 443 850 -
26 0.26 53023 - 100
27 0.27 443 900 -
28 0.28 443 920 -
29 0.29 53023 - 100
30 0.30 443 940 -
Выходные данные
0.02	# для 02-й строки - разность Time между 04-й строкой и 02-й строкой
0.02 # для 04-й строки - разность Time между 06-й строкой и 04-й строкой
0.02 # для 06-й строки - разность Time между 08-й строкой и 06-й строкой
0.04 # для 08-й строки - разность Time между 12-й строкой и 08-й строкой
0.04 # для 11-й строки - разность Time между 15-й строкой и 11-й строкой
0.03 # для 12-й строки - разность Time между 15-й строкой и 12-й строкой
0.04 # для 13-й строки - разность Time между 17-й строкой и 13-й строкой
0.02 # для 15-й строки - разность Time между 17-й строкой и 15-й строкой
0.01 # для 17-й строки - разность Time между 18-й строкой и 17-й строкой
0.04 # для 18-й строки - разность Time между 22-й строкой и 18-й строкой
0.04 # для 20-й строки - разность Time между 24-й строкой и 20-й строкой
0.03 # для 21-й строки - разность Time между 24-й строкой и 21-й строкой
0.03 # для 22-й строки - разность Time между 25-й строкой и 22-й строкой
0.03 # для 24-й строки - разность Time между 27-й строкой и 24-й строкой
0.05 # для 25-й строки - разность Time между 30-й строкой и 25-й строкой
0.03 # для 27-й строки - разность Time между 30-й строкой и 27-й строкой
0.02 # для 28-й строки - разность Time между 30-й строкой и 28-й строкой
0.00 # для 30-й строки - разность Time между 30-й строкой и 30-й строкой
Алгоритм:
01 Получаю общее количество строк в датафрейме. Значение 30.
02 Задаю начальное значение CWS = 1073725440 (максимально возможное согласно спецификации), передаю его в цикл I в качестве начального.
03 Запускаю цикл для I от 1 до 30 и значением CWS.
04 I=1 (первый шаг цикла на строке 03)
05 Цикл I=1 начат со значением CWS=1073725440.
06 Если в строке I=1 значение port1 равно 53023, извлекаю из неё значение CWS.
07 Присваиваю CWS=50.
08 Возвращаюсь к строке 03, беру следующее значение I=2 и передаю в цикл I значение CWS=50.
09 I=2 (следующий шаг цикла на строке 03)
10 Цикл I=2 начат со CWS=50.
11 Если в строке I=2 значение port1 равно 443, извлекаю значения TimeI и seqI.
12 Time2 = 0.02, seq2 = 0
13 Передаю в цикл N значение CWS из цикла I. Начальное значение CWS=50 в цикле N.
14 Запускаю цикл N от N=I+1 до 30 и значенем CWS. от 3 до 30.
15 N=3 (первый шаг цикла на строке 14)
16 Цикл N=3 начат со значением CWS=50.
17 Если в строке N=3 значение port1 равно 53023, извлекаю значение CWS.
18 Присваиваю CWS=55.
19 Возвращаюсь к строке 14, беру следующее значение N=4 и передаю CWS=55 в цикл N.
20 N=4 (следующий шаг цикла на строке 14)
21 Цикл N=4 начат со значением CWS=55.
22 Если в строке N=4 значение port1 равно 443, извлекаю значения seqN.
23 seq4 = 49
24 Проверяю условие seqN-seqi <= CWS. seq4-seq2 <= CWS. 49-0 <= 55. Условие соблюдается.
25 Если условие соблюдается возращаюсь к строке 14 и беру следующее значение N=5.
26 N=5 (следующий шаг цикла на строке 14)
27 Цикл N=5 начат со значением CWS=55.
28 Если в строке N=5 значение port1 равно 53023, извлекаю значение CWS.
29 Присваиваю CWS=60.
30 Возвращаюсь к строке 14, беру следующее значение N=6 и передаю CWS=60 в цикл N.
31 N=6 (следующий шаг цикла на строке 14)
32 Цикл N=6 начат со значением CWS=60.
33 Если в строке N=6 значение port1 равно 443, извлекаю значения seqN.
34 seq6 = 100
35 Проверяю условие seqN-seqi <= CWS. seq6-seq2 <= CWS. 100-0 <= 60. Условие не соблюдается.
36 Ищу в цикле N (цикл N , начинающийся в строке 14), строку в которой условие соблюдалось последний раз.
37 Это строка N=4.
38 В строке 4 извлекаю значение Time4 = 0.04.
39 Вычисляю TimeN-TimeI. Time4-Time2=0.02
40 Вывожу значение в файл csv.
41 Возвращаюсь к строке 03 со следующим значением I=3.
42 I=3 (следующий шаг цикла на строке 03)
43 Цикл I=3 начат со CWS=50. (В цикл I другое значение CWS не передавалось)
44 Если в строке I=3 значение port1 равно 53023, то извлекаю из неё значение CWS.
45 Присваиваю CWS=55
46 Возвращаюсь к строке 03, беру следующее значение I=4 и передаю в цикл I значение CWS=55.
47 I=4 (следующий шаг цикла на строке 03)
48 Цикл I=4 начат со значением CWS=55.
49 Если в строке I=4 значение port1 равно 443, извлекаю значения TimeI и seqI.
50 Time4 = 0.04, seq4 = 49
51 Передаю в цикл N значение CWS из цикла I. Начальное значение CWS=55 в цикле N.
52 Запускаю цикл N от N=I+1 до 30 и значенем CWS. от 5 до 30.
53 N=5 (первый шаг цикла на строке 52)
54 Цикл N=5 начат со значением CWS=55.
55 Если в строке N=5 значение port1 равно 53023, извлекаю значение CWS.
56 Присваиваю CWS=60.
57 Возвращаюсь к строке 52, беру следующее значение N=6 и передаю CWS=60 в цикл N.
58 N=6 (следующий шаг цикла на строке 52)
59 Цикл N=6 начат со значением CWS=60.
60 Если в строке N=6 значение port1 равно 443, извлекаю значения seqN.
61 seq6 = 100
62 Проверяю условие seqN-seqi <= CWS. seq6-seq4 <= CWS. 100-49 <= 60. Условие соблюдается.
63 Если условие соблюдается возращаюсь к строке 52 и беру следующее значение N=7.
64 N=7 (следующий шаг цикла на строке 52)
65 Цикл N=7 начат со значением CWS=60.
66 Если в строке N=7 значение port1 равно 53023, извлекаю значение CWS.
67 Присваиваю CWS=70.
68 Возвращаюсь к строке 52, беру следующее значение N=8 и передаю CWS=70 в цикл N.
69 N=8 (следующий шаг цикла на строке 52)
70 Цикл N=8 начат со значением CWS=70.
71 Если в строке N=8 значение port1 равно 443, извлекаю значение seqN.
72 seq8 = 140
73 Проверяю условие seqN-seqi <= CWS. seq8-seq4 <= CWS. 140-49 <= 70. Условие не соблюдается.
74 Ищу в цикле N (цикл N , начинающийся в строке 52), строку в которой условие соблюдалось последний раз.
75 Это строка N=6.
76 В строке 6 извлекаю значение Time6 = 0.06.
77 Вычисляю TimeN-TimeI. Time6-Time4=0.02
78 Вывожу значение в файл csv.
79 Возвращаюсь к строке 03 со следующим значением I=5.
80 I=5 (следующий шаг цикла на строке 03)
81 Цикл I=5 начат со значением CWS=55. (В цикл I другое значение CWS не передавалось)

Пока что так фиксируем алгоритм, входные данные и выходные данные.

Теперь, что касается переполнения Seq. Я посмотрел, само это переполнение никакой роли в алгоритме не играет и никакого смысла для алгоритма не несёт (переполнения не должно быть вообще по смыслу работы алгоритма). Поэтому обработка этого переполнения не должна включаться в алгоритм, хотя её и можно было бы включить в него. Нужно ещё до подачи данных в алгоритм преобразовать эти данные так, чтобы те места, в которых счётчик Seq запускается с начала при переполнении значения Seq длиной 32 бита, были записаны уже правильно - то есть выше максимального значения длиной в 32 бита.

Следовательно, тебе нужен второй алгоритм, который подготавливает эти данные для их анализа. Он должен брать входящие данные, просматривать поле Seq, при переполнении значения поля Seq видеть это переполнение, добавлять ко всем последующим значениям Seq в этом поле максимальное значение 2^32, делать так с каждым значением до следующего такого переполнения в исходных данных, добавлять к последующим последующим значениям поля Seq уже 2*(2^32) и так далее (столько переполнений, сколько надо), а потом писать в выходящие данные правильные значения Seq. На выходе у тебя должны получиться все те же данные во всех полях, но с правильными и постоянно растущими значениями Seq, без переполнений.

И вот эти данные приготовленные будут уже подаваться на вход этого алгоритма основного.

Как видишь, этот второй алгоритм немаленький и тоже немножко можно запутаться в нём. Вот чтобы основной алгоритм не запутывать, мы этот дополнительный алгоритм по обработке переполнений Seq и выносим в отдельный алгоритм.

Получается у тебя четыре алгоритма, работающих в одной цепочке друг за другом.

1. Имя CSV-файла поступает в алгоритм “Чтение”.
2. Прочитанные CSV-данные поступают в алгоритм “Очистка”.
3. Очищенные CSV-данные поступают в алгоритм “Поиск”.
4. Найденные данные и имя файла результата поступают в алгоритм “Запись”.

Можешь писать эти алгоритмы без функций, просто отделив их друг от друга пустыми строками. Можешь написать эти алгоритмы в виде отдельных функций.

Тут пример того, как записать на функциях это
  
>>> def read_data(ifname):
...     #data = pd.read_csv(ifname, delimiter=',')
...     print('Read csv data from', ifname)
...     data = 'csv data'
...     return data
... 
>>> def clear_data(data):
...     print('Clear data')
...     return 'clean data'
... 
>>> def search_data(data):
...     print('Search data')
...     return 'found data'
... 
>>> def write_result(ofname, data):
...     print('Write data to', ofname)
... 
>>> def run_all():
...     data = read_data('data.csv')
...     data_clean = clear_data(data)
...     data_found = search_data(data_clean)
...     write_result('data_out.txt', data_found)
... 
>>> run_all()
Read csv data from data.csv
Clear data
Search data
Write data to data_out.txt
>>>

Вот только теперь ты можешь начать разрабатывать код сам. Всё это время мы только приводили эту первоначальную кашу в порядок и убирали все пробелы и неточности из неё.



Отредактировано py.user.next (Июнь 30, 2024 07:19:27)

Офлайн

#7 Июнь 30, 2024 15:08:09

user555
Зарегистрирован: 2024-06-20
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Оптимизация скорости выполнения расчётов

py.user.next
Спасибо за подсказки.
Тогда я это всё переварю, сформирую второй алгоритм. Разработаю код. Проверю как он выполняется. Посмотрю сколько времени это занимает.
Только один вопрос у меня созрел, прежде чем я начну.
Понятно, что для начала мне лучше организовать работу с данными последовательно, что бы не запутаться.
Я так и собираюсь сделать.
Но нельзя ли функцию очистку исключить, задачу с переполнением решить введением в первоначальный алгоритм простой проверки условия seqN-seqi <= 0 в цикле N (строки 16, 26, 36, 61, 71), так как переполнение может возникнуть только в цикле N при определенных значениях I.
В тот момент, когда обнаружу, что например левая сторона условия seqN-seqi <= CWS приняла отрицательное или 0 значение, добавлю к seqN значение 4294967296. И буду это делать тогда, когда будет это переполнение в цикле N.
Например блок данные, в которых имеется переполнение:

 No.	Time	port1	Seq		CWS
100920	456.20	53023	-		100
100921	456.21	443	4294967294	-
100922	456.22	53023	-		100
100923	456.23	443	4294967295	-
100924	456.24	443	50		-
100925	456.25	443	130		-
100926	456.26	53023	-		100
100927	456.27	443	150		-
100928	456.28	443	170		-
100929	456.29	53023	-		100
100930	456.30	443	200		-
100931	456.31	443	210		-
100932	456.32	53023	-		100
100933	456.33	443	250		-
100934	456.34	443	255		-

Блок алгоритма с условием предварительной проверки seqN-seqi <= 0

00 Запускаю цикл для I от 1 до 11200494 и значением CWS.

01 I=100921 (следующий шаг цикла I в строке 00)
02 Цикл I=100921 начат со CWS=100.
03 Если в строке I=100921 значение port1 равно 443, извлекаю значения TimeI и seqI.
04 Time100921 = 456.21, seq100921 = 4294967294
05 Передаю в цикл N значение CWS из цикла I. Начальное значение CWS=100 в цикле N.
06 Запускаю цикл N от N=I+1 до 11200494 и значением CWS. от 100922 до 11200494 (крайнее значение).
07 N=100922 (первый шаг цикла на строке 06)
08 Цикл N=100922 начат со значением CWS=100.
09 Если в строке N=100922 значение port1 равно 53023, извлекаю значение CWS.
10 Присваиваю CWS=100.
11 Возвращаюсь к строке 06, беру следующее значение N=100923 и передаю CWS=100 в цикл N.
12 N=100923 (следующий шаг цикла на строке 06)
13 Цикл N=100923 начат со значением CWS=100.
14 Если в строке N=100923 значение port1 равно 443, извлекаю значения seqN.
15 seq100923 = 4294967295
16 Если seqN-seqi <= 0 то seq100923 = seq100923 + 4294967296
17 seq100923-seq100921 = 1, условие seqN-seqi <= 0 не выполняется, ничего не добавляю.
18 Проверяю условие seqN-seqi <= CWS. seq100923-seq100921 <= CWS. 4294967295-4294967294 <= 100. 1 <= 100 Условие соблюдается.
19 Если условие соблюдается возвращаюсь к строке 06 и беру следующее значение N=100924.
20 N=100924 (следующий шаг цикла на строке 06)
21 Цикл N=100924 начат со значением CWS=100.
22 N=100924 (следующий шаг цикла на строке 06)
23 Цикл N=100924 начат со значением CWS=100.
24 Если в строке N=100924 значение port1 равно 443, извлекаю значения seqN.
25 seq100924 = 50
26 Если seqN-seqi <= 0, то seq100924 = seq100924 + 4294967296
27 seq100924-seq100921 = -4 294 967 244, условие seqN-seqi <= 0 выполняется, добавляю 4294967296.
28 seq100924 = seq100924 + 4294967296
29 seq100924 = 4294967346
30 Проверяю условие seqN-seqi <= CWS. seq100924-seq100921 <= CWS. 4294967346-4294967294 <= 100. 52 <= 100 Условие соблюдается.
31 Если условие соблюдается возвращаюсь к строке 06 и беру следующее значение N=100925.
32 N=100925 (следующий шаг цикла на строке 06)
33 Цикл N=100925 начат со значением CWS=100.
34 Если в строке N=100925 значение port1 равно 443, извлекаю значения seqN.
35 seq100925 = 130
36 Если seqN-seqi <= 0, то seq100925 = seq100925 + 4294967296
37 seq100925-seq100921 = -4 294 967 164, условие seqN-seqi <= 0 выполняется, добавляю 4294967296.
38 seq100925 = seq100925 + 4294967296
39 seq100925 = 4294967426
40 Проверяю условие seqN-seqi <= CWS. seq100925-seq100921 <= CWS. 4294967426-4294967294 <= 100. 132 <= 100 Условие не соблюдается.
41 Ищу в цикле N (цикл N , начинающийся в строке 06), строку в которой условие соблюдалось последний раз.
42 Это строка N=100924.
43 В строке 100924 извлекаю значение Time100924 = 456.24.
44 Вычисляю TimeN-TimeI. Time100924-Time100921=456.24-456.21=0.03
45 Вывожу значение в файл csv.
46 Возвращаюсь к циклу I (строка 00) со следующим значением I=100922.
47 I=100922 (следующий шаг цикла I)
48 Если в строке I=100922 значение port1 равно 53023, извлекаю из неё значение CWS.
49 Присваиваю CWS=100.
50 Возвращаюсь к циклу I (строка 00), беру следующее значение I=100923 и передаю в цикл I значение CWS=100.
51 I=100923 (следующий шаг цикла I)
52 Цикл I=100923 начат со CWS=100.
53 Если в строке I=100923 значение port1 равно 443, извлекаю значения TimeI и seqI.
54 Time100923 = 456.23, seq100923 = 4294967295
55 Передаю в цикл N значение CWS из цикла I. Начальное значение CWS=100 в цикле N.
56 Запускаю цикл N от N=I+1 до 11200494 и значением CWS. от 100924 до 11200494 (крайнее значение).
57 N=100924 (первый шаг цикла N на строке 56)
58 Цикл N=100924 начат со значением CWS=100.
59 Если в строке N=100924 значение port1 равно 443, извлекаю значения seqN.
60 seq100924 = 50
61 Если seqN-seqi <= 0, то seq100924 = seq100924 + 4294967296
62 seq100924-seq100923 = -4 294 967 245, условие seqN-seqi <= 0 выполняется, добавляю 4294967296.
63 seq100924 = seq100924 + 4294967296
64 seq100924 = 4294967346
65 Проверяю условие seqN-seqi <= CWS. seq100924-seq100923 <= CWS. 4294967346-4294967295 <= 100. 51 <= 100 Условие соблюдается.
66 Если условие соблюдается возвращаюсь к строке 56 и беру следующее значение N=100925.
67 N=100925 (следующий шаг цикла на строке 56)
68 Цикл N=100925 начат со значением CWS=100.
69 Если в строке N=100925 значение port1 равно 443, извлекаю значения seqN.
70 seq100925 = 130
71 Если seqN-seqi <= 0, то seq100925 = seq100925 + 4294967295
72 seq100925-seq100923 = -4 294 967 164, условие seqN-seqi <= 0 выполняется, добавляю 4294967296.
73 seq100925 = seq100925 + 4294967296
74 seq100925 = 4294967426
75 Проверяю условие seqN-seqi <= CWS. seq100925-seq100923 <= CWS. 4294967426-4294967295 <= 100. 131 <= 100 Условие не соблюдается.
76 Ищу в цикле N (цикл N , начинающийся в строке 56), строку в которой условие соблюдалось последний раз.
77 Это строка N=100924.
78 В строке 100924 извлекаю значение Time100924 = 456.24.
79 Вычисляю TimeN-TimeI. Time100924-Time100921=456.24-456.23=0.01
80 Вывожу значение в файл csv.
81 Возвращаюсь к циклу I (строка 00), беру следующее значение I=100924 и передаю в цикл I значение CWS=100.
82 Цикл I=100924 начат со CWS=100.
83 Если в строке I=100924 значение port1 равно 443, извлекаю значения TimeI и seqI.
84 Time100924 = 456.24, seq100924 = 50

Далее (начиная с I=100924) модификация поля seq не потребуется, так как еще продолжительное время в циклах N для I-х строк не будет выполняться условие seqN-seqi <= 0.
Это позволит не обращаться к данным два раза и не модифицировать их.
Как Вы считаете?

Отредактировано user555 (Июнь 30, 2024 15:23:57)

Офлайн

#8 Июнь 30, 2024 20:16:53

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9795
Репутация: +  849  -
Профиль   Отправить e-mail  

Оптимизация скорости выполнения расчётов

user555
Но нельзя ли функцию очистку исключить, задачу с переполнением решить введением в первоначальный алгоритм простой проверки условия seqN-seqi <= 0 в цикле N (строки 16, 26, 36, 61, 71), так как переполнение может возникнуть только в цикле N при определенных значениях I.
1. Сделай код алгоритма “Поиск”.
2. В алгоритме “Очистка” сделай временный код, который просто удаляет строки с переполнением.
3. Функцию алгоритма “Очистка” сделай в виде генераторной фунции.

То, что ты предложил, равносильно простому удалению этих переполнений из данных, будто их и не было там, хотя они там были. Номера последовательности пакетов, расположенных после переполнения, все связаны с этим переполнением, а не существуют независимо от него. Если их там миллион потом идёт после этого переполнения, то к каждому из них, из этого миллиона, нужно прибавить 2^32, а не только к одному, как тебе там кажется. А после второго переполнения все последующие номера последовательности пакетов после этого второго переполнения будут увеличиваться на двойное значение, так как они связаны и с первым переполнением, и со вторым переполнением одновременно.

Сколько прибавлять, 2^32 или 2^32-1, к номерам последовательности пакетов после переполнения? Рассмотрим на максимальном значении, равном какому-нибудь меньшему числу, например двум.
Из последовательности 0, 1, 0, 1, … нужно получить 0, 1, 2, 3, …
Сколько нужно прибавить ко второму нулю и ко второй единице, 2 или 2-1? Нужно прибавить 2. Следовательно, и там нужно прибавить не 2^32-1, а 2^32. Так что пересчитай всё точно, а не приблизительно.

Фактически, ты пытаешься исказить первоначальные данные, превратить их вообще в другие данные, только для того, чтобы не придумывать алгоритм для их обработки. Это самое страшное в программировании. Программист подгоняет данные под свою какую-то неспособность.

Ну, например, тебе задают вопрос: “Сколько будет 12 * 17?”
Ты думаешь: “Блин, так сложно это вычислить в уме…”
Ты говоришь: “А можно я удалю из 17 семёрку? Тогда ведь считать проще будет, потому что умножение любого числа на 1 даёт то же самое число? И сразу станет проще вычислять это!”
И тебе говорят: “Ты можешь вообще тогда не вычислять это, потому что 12 * 17 никаким боком к 12 * 1 не относится. Но можешь и сделать так, изобразив, притворившись, что это правда.”

Так что можешь, максимум, сделать пока код алгоритма “Поиск”, как будто проблем с переполнением нет вообще. Можешь удалить временно эти строчки с переполнениями из самих данных, если тебе похрен на данные и похрен на результат вообще. Но если тебе нужно точно вычислить, то подготовь сначала данные (проведи нормализацию данных) перед их подачей в алгоритм. Для ускорения (хотя это преждевременная оптимизация, которая в программировании считается неправильным делом) функции нужно сделать генераторными функциями.

Я пока проблем не вижу, чтобы сделать это полноценно. Ничего по времени эта трансляция данных для их нормализации не займёт. Нужно просто применить фильтр в виде генераторной функции.



Отредактировано py.user.next (Июнь 30, 2024 20:23:01)

Офлайн

#9 Июль 1, 2024 22:54:27

user555
Зарегистрирован: 2024-06-20
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Оптимизация скорости выполнения расчётов

py.user.next
1. Сделай код алгоритма “Поиск”.

 import pandas as pd
data = pd.read_csv("data2.csv", delimiter=";")
CWS = 1073725440
count = data.shape[0]
for i in range(0, count):
    port = data.at[i, "port1"]
    if port == 53023:
        CWS = int(data.at[i, "CWS"])
    elif port == 443 and i != count - 1:
        TimeI = float(data.at[i, "Time"])
        SeqI = int(data.at[i, "Seq"])
        CWSN = CWS
        for n in range(i + 1, count):
            port = data.at[n, "port1"]
            if port == 53023:
                CWSN = int(data.at[n, "CWS"])
            if port == 443:
                SeqN = int(data.at[n, "Seq"])
                Seq = SeqN - SeqI
                if Seq <= CWSN:
                    ok = n
                if Seq >= CWSN or n == count - 1:
                    TimeN = float(data.at[ok, "Time"])
                    # SeqOK = int(data.at[ok, "Seq"]) - SeqI
                    T = TimeN - TimeI
                    print(round(T, 5))
                    # print(round(T, 5),"| разница м/у",f"{i+1:02}", "-й и",f"{ok+1:02}","-й стр.","| нач. зн-е CWS=",f"{CWS:03}","| кон-е знач-е CWS=",f"{CWSN:03}","| кол-во перед-х данных",SeqOK,)
                    break
    elif port == 443 and i == count - 1:
        T = 0.00
        # print(round(T, 5), " |", i + 1, "-я - последняя строка значение CWS=", CWS)
        print(round(T, 5))
Выходные данные:
 0.02 #| разница м/у 02 -й и 04 -й стр. | нач. зн-е CWS= 050 | кон-е знач-е CWS= 060 | кол-во перед-х данных 49
 0.02 #| разница м/у 04 -й и 06 -й стр. | нач. зн-е CWS= 055 | кон-е знач-е CWS= 070 | кол-во перед-х данных 51
 0.02 #| разница м/у 06 -й и 08 -й стр. | нач. зн-е CWS= 060 | кон-е знач-е CWS= 100 | кол-во перед-х данных 40
 0.04 #| разница м/у 08 -й и 12 -й стр. | нач. зн-е CWS= 070 | кон-е знач-е CWS= 100 | кол-во перед-х данных 100
 0.04 #| разница м/у 11 -й и 15 -й стр. | нач. зн-е CWS= 100 | кон-е знач-е CWS= 150 | кол-во перед-х данных 90
 0.03 #| разница м/у 12 -й и 15 -й стр. | нач. зн-е CWS= 100 | кон-е знач-е CWS= 150 | кол-во перед-х данных 60
 0.04 #| разница м/у 13 -й и 17 -й стр. | нач. зн-е CWS= 100 | кон-е знач-е CWS= 150 | кол-во перед-х данных 130
 0.02 #| разница м/у 15 -й и 17 -й стр. | нач. зн-е CWS= 105 | кон-е знач-е CWS= 150 | кол-во перед-х данных 100
 0.01 #| разница м/у 17 -й и 18 -й стр. | нач. зн-е CWS= 150 | кон-е знач-е CWS= 150 | кол-во перед-х данных 150
 0.04 #| разница м/у 18 -й и 22 -й стр. | нач. зн-е CWS= 150 | кон-е знач-е CWS= 170 | кол-во перед-х данных 150
 0.04 #| разница м/у 20 -й и 24 -й стр. | нач. зн-е CWS= 160 | кон-е знач-е CWS= 170 | кол-во перед-х данных 150
 0.03 #| разница м/у 21 -й и 24 -й стр. | нач. зн-е CWS= 160 | кон-е знач-е CWS= 170 | кол-во перед-х данных 130
 0.03 #| разница м/у 22 -й и 25 -й стр. | нач. зн-е CWS= 160 | кон-е знач-е CWS= 100 | кол-во перед-х данных 150
 0.03 #| разница м/у 24 -й и 27 -й стр. | нач. зн-е CWS= 170 | кон-е знач-е CWS= 100 | кол-во перед-х данных 100
 0.05 #| разница м/у 25 -й и 30 -й стр. | нач. зн-е CWS= 170 | кон-е знач-е CWS= 100 | кол-во перед-х данных 90
 0.03 #| разница м/у 27 -й и 30 -й стр. | нач. зн-е CWS= 100 | кон-е знач-е CWS= 100 | кол-во перед-х данных 40
 0.02 #| разница м/у 28 -й и 30 -й стр. | нач. зн-е CWS= 100 | кон-е знач-е CWS= 100 | кол-во перед-х данных 20
 0.0  #| 30 -я - последняя строка значение CWS= 100

py.user.next
2. В алгоритме “Очистка” сделай временный код, который просто удаляет строки с переполнением.
3. Функцию алгоритма “Очистка” сделай в виде генераторной фунции.
Функции так просто мне пока не сдаются, буду изучать. Поэтому алгоритм “Очистка” пока не будем рассматривать.
Пусть у нас 3 алгоритма, а переполнения вообще нет.
py.user.next
1. Имя CSV-файла поступает в алгоритм “Чтение”.
2. Прочитанные CSV-данные поступают в алгоритм “Поиск”.
3. Найденные данные и имя файла результата поступают в алгоритм “Запись”.
py.user.next
Тут пример того, как записать на функциях это
Если Вы мне поведали про моноширинные шрифты, просветите тогда пожалуйста, что тут (в моём коде) будет функция и как она будет возвращать данные из алгоритма “Поиск” в алгоритм “Запись”.
Или такой код вообще не встроить в Ваш пример и нужно прям детально всё разрабатывать под функции?
Ту информацию, которую я успел почитать я не могу применить, там вообще примитивные примеры, к тому что есть у меня я их не могу применить.
py.user.next
(Кстати, видишь, да, она ровненькая? Это потому, что я её выравнивал в редакторе с моноширинным шрифтом, а потом вставлял на форум через буфер обмена.)
П.С. а еще расскажите как Вы убираете пробел вначале кода или данных, у Вас его нет, а у меня есть, хотя я его не ставлю?


Отредактировано user555 (Июль 1, 2024 23:44:33)

Офлайн

#10 Июль 2, 2024 03:41:46

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9795
Репутация: +  849  -
Профиль   Отправить e-mail  

Оптимизация скорости выполнения расчётов

user555
П.С. а еще расскажите как Вы убираете пробел вначале кода или данных, у Вас его нет, а у меня есть, хотя я его не ставлю?
Тут движок форума самодельный, поэтому тут много всяких ошибок, которые тяжело исправлять. Нельзя просто взять и скачать обновления, чтобы исправить ошибки, потому что обновлений нет, их надо делать самому. Поэтому тут ошибки эти есть и они не исправляются, так как это тяжело делать.

Чтобы вставить код на питоне мы просто первую строку оставляем пустой, но чтобы она не удалилась, так как она пустая, мы просто вставляем пробел в этой первой пустой строке, и так она остаётся на месте
  
print("Hello 1")
print("Hello 2")
print("Hello 3")

Но это баг с пробелом в первой строке относится к кодам, которые раскрашивают код по ключевым словам и разным константам (числовым, строковым). Но в простом коде, который не относится ни к какому языку, это бага нет.

Поэтому здесь две формы кода используются:
1) Для исходного кода на питоне (чтобы раскрасились ключевые слова и константы)
[code python]пробел
строка кода на питоне
строка кода на питоне
строка кода на питоне
[/code]
Чтобы пустые строки не стёрлись в коде, нужно также поставить на них пробелы в начале
[code python]пробел
строка кода на питоне
пробел
строка кода на питоне
пробел
строка кода на питоне
[/code]
2) Для данных, чтобы их точно передать
[code]
строка данных
строка данных
строка данных
[/code]


tags: forum code



Отредактировано py.user.next (Июль 2, 2024 03:48:03)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version