# 2023: Комп'ютерні системи та мережі. Екзаменаційний лист. [TOC] --- # [Прізвище ім'я по батькові. Дата народження.]() Cтасюк Владислав Дмитрович, 30.11.2001 --- # 1. Розрахункові екзаменаційні завдання ## 1.1 "Ненадійні WebSockets" **Варіант: (30.11.2001)** $$v=1+(30\mod 10)=1+0=1$$ $$n = 1 + v = 1 + 1 = 2$$ $$p=\frac {v}{v+1}=\frac {1}{1+1}=\frac {1}{2}=0.5$$ У момент часу $t=0$ серверна програма була з'єднана з $n$ незалежними клієнтськими програмами за протоколом WebSockets: ![](https://i.imgur.com/6TOjkrD.png) Щохвилини серверна програма надсилає повідомлення клієнтам і перевіряє, яка кількість клієнтів у нього знаходиться. На жаль, через стан каналів зв'язку, обмежень браузерів і серверів, ймовірність відключення сокету між черговими повідомленнями дорівнює $p$. Через деякий час усі сокети були відключені: ![](https://i.imgur.com/NEc8wfJ.png) Розподілений клієнт-серверний додаток вважається працюючим до тих пір, поки є хоча б одне працююче з'єднання. Така поведінка називається [плавною деградацією роботи](https://en.wikipedia.org/wiki/Fault_tolerance#:~:text=The%20ability%20of%20maintaining%20functionality%20when%20portions%20of%20a%20system%20break%20down%20is%20referred%20to%20as%20graceful%20degradation.) клієнт-серверної системи. **Знайдіть середній час (у хвилинах) роботи цієї програми** з точністю 2 знаки після коми. ## 1.2 Рішення Цей код створює функцію averageWorkingTime, яка приймає два параметри, n та p, і розраховує середній час роботи системи на основі заданих параметрів. Після того, як функція виконана, результат зберігається в змінній result. Значення result виводиться на консоль з точністю 2 знаки після коми. **Код:** ``` // 1.1 “Ненадійні WebSockets” function averageWorkingTime(n, p) { let q = 1 - p; let timeSum = 0; for (let i = 1; i <= n; i++) { timeSum += (Math.pow(q, i - 1) * p) / i; } return timeSum; } let n = 2; let p = 0.5; let result = averageWorkingTime(n, p); console.log("Середній час роботи системи: " + result.toFixed(2) + " хвилин"); ``` **Середній час роботи системи: 0.63 хвилин** ## 1.3 [Посилання на рішення](https://functional-fragrant-charger.glitch.me) --- # 2. Екзаменаційне завдання на реалізацію ## 2.1 Створення повнозв'язної мережі **Опис:** Створіть веб-додаток, який відображатиме повнозв'язну мережу, де кожен новий користувач, який підключився до сервера, буде представлений вузлом на графі. Граф має бути повнозв'язним, тобто кожен вузол безпосередньо з'єднаний з усіма іншими вузлами. Вимоги: 1. Реалізувати сервер на Node.js, який оброблятиме підключення клієнтів і формуватиме структуру даних для графа (вузли і зв'язки). 2. Виводити в консоль сервера інформацію про підключення і відключення клієнтів, а також їхні IP-адреси. 3. На клієнтській стороні відображати граф із вузлами і зв'язками, де кожен вузол представляє клієнта, підключеного до сервера. 4. Візуалізація графа має бути виконана з використанням бібліотеки D3.js. 5. Гарантувати, що граф буде повнозв'язним, тобто кожен вузол буде безпосередньо з'єднаний з усіма іншими вузлами. У міру під'єднання нових користувачів до сервера, їхні вузли мають додаватися на граф, і кожен вузол має бути з'єднаний з усіма іншими вузлами. ## 2.2 Опис рішення Рішення являє собою веб-додаток, який візуалізує повнозв'язкову мережу на основі підключених користувачів. Додаток складається з серверної частини на Node.js і клієнтської частини з використанням бібліотеки D3.js для відображення графа. **1. Серверна частина (Node.js):** * Створено сервер на Node.js з використанням модулів http і WebSocket. * Сервер обробляє HTTP-запити і відправляє клієнтам HTML-сторінку з графом і JavaScript-код для роботи з графом. * Під час підключення нового користувача сервер зберігає інформацію про нього, включно з ID та IP-адресою. * Сервер розсилає всім клієнтам повідомлення про оновлення графа, що містять інформацію про вузли (під'єднані користувачі) і зв'язки між ними (повнозв'язкова мережа). * Виведення інформації про підключення та відключення клієнтів у консоль сервера. **2. Клієнтська частина (HTML, CSS, JavaScript, D3.js):** * HTML-сторінка з контейнером для графа і заголовком. * JavaScript-код для роботи з WebSocket і обробки повідомлень від сервера про оновлення графа. * Візуалізація графа з використанням бібліотеки D3.js, яка відображає вузли (користувачів) і зв'язки між ними (повнозв'язкова мережа). * Адаптивне розташування вузлів графа на екрані залежно від кількості підключених користувачів. * Коли новий користувач підключається до сервера, його вузол додається на граф, і кожен вузол безпосередньо з'єднується з усіма іншими вузлами, забезпечуючи повнозв'язність мережі. Візуалізація графа оновлюється в реальному часі під час під'єднання і від'єднання користувачів. ## 2.3 [Посилання на рішення](https://replit.com/join/unpqvlabot-vladislavstasiu) --- # 3. Питання на теми лекцій ### 3.1 *Доведіть, що Ваша мережа є повною мережею.* **Відповідь:** Для доказу того, що цей код імплементує повнозв'язну мережу, можна звернутися до того, як він створює зв'язки між вузлами. У файлі index.js на сервері, функція broadcastUpdate() відповідає за створення зв'язків. Розглянемо цей фрагмент коду всередині функції: ``` const nodes = clients.map(client => ( { id: client.id, ip: client.socket._socket.remoteAddress } )); const links = []; for (let i = 0; i < nodes.length; i++) { for (let j = i + 1; j < nodes.length; j++) { links.push({ source: i, target: j }); } } ``` У цьому фрагменті коду спочатку створюється масив nodes, який містить інформацію про вузли (їхні ідентифікатори та IP-адреси). Потім створюється порожній масив links, який міститиме зв'язки між вузлами. Далі, за допомогою подвійного циклу, відбувається ітерація по кожній парі вузлів. Внутрішній цикл починається з i + 1, щоб уникнути повторення зв'язків і зв'язку вузла із самим собою. У результаті, для кожної пари унікальних вузлів створюється зв'язок і додається в масив links. Таким чином, кожен вузол буде безпосередньо з'єднаний з усіма іншими вузлами, що і визначає повнозв'язкову мережу. На клієнтській стороні, у файлі client.js, функція updateGraph() відповідає за візуалізацію вузлів і зв'язків на основі отриманих даних від сервера. Вона створює елементи SVG для вузлів і зв'язків і додає їх на веб-сторінку. Таким чином, візуалізований граф представляє повнозв'язну мережу, як і задумано. --- ### 3.2 *Спробуйте доробити функціонал, який дозволить надсилати повідомлення від клієнта до клієнта* **Виконано!**