# Звіт до лабораторної роботи №1 ## Завдання 1. Зробити клієнт-серверний додаток на мові javascript, використовуючи протокол HTTP, що тестує повний час подорожі запиту до сервера та назад (RTT) з обчисленням *мінімального, максимального, медіанного та середнього часу RTT, середнього квадратичного відхилення та коефіцієнта асимметрії* для частот запитів с клієнта до сервера 16Гц, 8Гц, 4Гц, 2Гц, 1Гц, а також для розмірів клієнтських запитів 128, 256, 512, 1024, 2048 байт. Результати представити у вигляді таблиць 2. Протестувати роботу Вашого клієнт-серверного додатку в персональній мережі (PAN) та у всесвітній мережі (WAN на хостінгу replit.com). 3. Дати оцінку відстані до сервера та тих характеристик каналу клієнт-сервер, що можно отримати з цих даних 4. Порівняти отримані дані с даними системної мережевої утіліти ping. ## Код програми ### Серверна частина (server.js) Цей скрипт використовує фреймворк Express для створення HTTP сервера, який обробляє запити на два маршрути: / та /echo. Статичні файли клієнта знаходяться у папці public ```javascript= const PORT = 3000; const app = express(); // налаштування обслуговування статичних файлів app.use(express.static(path.join(__dirname, 'public'))); app.get("/echo", (req, res) => { res.json(req.query); }); app.listen(PORT, () => console.log(`Server listening on ${PORT} ...\n`)); ``` ### Клієнтська частина (script.js) Цей скрипт реалізує логіку клієнта для вимірювання RTT, надсилаючи GET-запити до сервера з даними зазначеного розміру та з різною частотою. ```javascript= async function echoRequest(bodySize, freqReq, host) { console.log(`host: ${host}\nbody size: ${bodySize}\nfreq: ${freqReq}`); const execTimes = []; // масив часів виконання запитів const promises = []; // масив промісів (запитів) const options = { method: "GET" }; const fetchHost = host === "WAN" ? HOST_WAN : HOST_PAN; const fetchUrl = fetchHost + `/echo?id=${bodySize}_${freqReq}_${host}&p=${"a".repeat(bodySize)}`; for (let i = 0; i < freqReq; i++) { const sTime = Date.now(); promises.push( fetch(fetchUrl, options) .then(() => execTimes.push(Date.now() - sTime)), // додаємо час виконання запиту в масив ); } await Promise.all(promises); // очікуємо виконання всі запити // console.log("times (ms):", execTimes); const resultTable = { host: host, bodySize: bodySize, freqReq: freqReq, min: Math.min(...execTimes), max: Math.max(...execTimes), avg: math.mean(execTimes), median: math.median(execTimes), "avg sqrt": math.std(execTimes), "asym coef": skewness(execTimes), }; return { execTimes, resultTable }; } // коефіцієнт асимметричності function skewness(data) {...} // побудова HTML таблиці function createTable(resultArray) {...} // автоматичне тестування async function multiTest() { console.log("Starting ..."); const result = []; for (let host of ["PAN", "WAN"]) { for (let bodySize of BODY_SIZE_LIST) { for (let freqReq of FREQ_REQ_LIST) { const { resultTable } = await echoRequest(bodySize, freqReq, host); result.push(resultTable); } } } createTable(result); console.log("Finish\n"); } // одиночнt тестування async function singleTest() { console.log("Starting ..."); const bodySize = document.getElementById("bodySize").value; const freqReq = document.getElementById("freqReq").value; const hostSelect = document.getElementById("hostSelect"); const host = hostSelect.options[hostSelect.selectedIndex].value; const { resultTable } = await echoRequest(bodySize, freqReq, host); createTable([resultTable]); console.log("Finish\n"); } ``` Посилання на replit: https://replit.com/@Varvara-Viktori/lab-1 ## Результати тестування Тестування проводилося в мережах WAN і PAN. | Хост | Розмір запиту | Частота | Мінімальний RTT | Максимальний RTT | Медіанний RTT | Середній RTT | Середнє квадратичне відхилення RTT | Коефіцієнт асиметрії RTT | | ---- | ------------- | ------------ | --------------- | ---------------- | ------------- | ------------ | ---------------------------------- | ------------------------ | | PAN | 128 байт | 1 Гц | 17 | 17 | 17 | 17 | 0 | NaN | | PAN | 128 байт | 2 Гц | 8 | 10 | 9 | 9 | 1.4142135623730951 | 0 | | PAN | 128 байт | 4 Гц | 8 | 13 | 10.5 | 10.5 | 2.0816659994661326 | 0 | | PAN | 128 байт | 8 Гц | 15 | 27 | 20.5 | 20 | 4.27617987059879 | 0.205078125 | | PAN | 128 байт | 16 Гц | 20 | 38 | 31.125 | 32 | 5.5 | -0.7027820719579377 | | PAN | 256 байт | 1 Гц | 6 | 6 | 6 | 6 | 0 | NaN | | PAN | 256 байт | 2 Гц | 7 | 8 | 7.5 | 7.5 | 0.7071067811865476 | 0 | | PAN | 256 байт | 4 Гц | 9 | 13 | 11.25 | 11.5 | 1.707825127659933 | -0.4346507595746656 | | PAN | 256 байт | 8 Гц | 10 | 20 | 15.125 | 15.5 | 3.6030740843261686 | -0.10804989258650188 | | PAN | 256 байт | 16 Гц | 15 | 36 | 27.6875 | 28.5 | 6.508648093114268 | -0.5730512988835039 | | PAN | 512 байт | 1 Гц | 5 | 5 | 5 | 5 | 0 | NaN | | PAN | 512 байт | 2 Гц | 7 | 8 | 7.5 | 7.5 | 0.7071067811865476 | 0 | | PAN | 512 байт | 4 Гц | 8 | 12 | 9.5 | 9 | 1.9148542155126762 | 0.49338220021815865 | | PAN | 512 байт | 8 Гц | 10 | 20 | 15.5 | 16 | 3.927922024247863 | -0.15876322406928003 | | PAN | 512 байт | 16 Гц | 14 | 37 | 28.9375 | 31 | 7.206189469245634 | -0.7184904978265749 | | PAN | 1024 байт | 1 Гц | 5 | 5 | 5 | 5 | 0 | NaN | | PAN | 1024 байт | 2 Гц | 6 | 7 | 6.5 | 6.5 | 0.7071067811865476 | 0 | | PAN | 1024 байт | 4 Гц | 8 | 12 | 10 | 10 | 1.632993161855452 | 0 | | PAN | 1024 байт | 8 Гц | 11 | 19 | 15.375 | 15.5 | 2.9246489410818914 | -0.06581817266088061 | | PAN | 1024 байт | 16 Гц | 18 | 43 | 33.5625 | 35.5 | 8.221668524900121 | -0.6535137691182042 | | PAN | 2048 байт | 1 Гц | 6 | 6 | 6 | 6 | 0 | NaN | | PAN | 2048 байт | 2 Гц | 6 | 7 | 6.5 | 6.5 | 0.7071067811865476 | 0 | | PAN | 2048 байт | 4 Гц | 9 | 12 | 10.5 | 10.5 | 1.2909944487358056 | 0 | | PAN | 2048 байт | 8 Гц | 11 | 20 | 15.5 | 15.5 | 3.3380918415851206 | 0 | | PAN | 2048 байт | 16 Гц | 19 | 38 | 29.25 | 30 | 5.579725202313581 | -0.26337809721013766 | | WAN | 128 байт | 1 Гц | 137 | 137 | 137 | 137 | 0 | NaN | | WAN | 128 байт | 2 Гц | 138 | 139 | 138.5 | 138.5 | 0.7071067811865476 | 0 | | WAN | 128 байт | 4 Гц | 138 | 143 | 139.75 | 139 | 2.217355782608345 | 0.9929662701927245 | | WAN | 128 байт | 8 Гц | 142 | 274 | 176.125 | 144 | 60.42335759337727 | 1.1531482667292716 | | WAN | 128 байт | 16 Гц | 139 | 411 | 260.8125 | 274.5 | 106.77966020424178 | 0.19145266169766684 | | WAN | 256 байт | 1 Гц | 139 | 139 | 139 | 139 | 0 | NaN | | WAN | 256 байт | 2 Гц | 138 | 138 | 138 | 138 | 0 | NaN | | WAN | 256 байт | 4 Гц | 139 | 142 | 140.5 | 140.5 | 1.2909944487358056 | 0 | | WAN | 256 байт | 8 Гц | 140 | 273 | 174.5 | 143 | 60.50737853471143 | 1.1524984649348544 | | WAN | 256 байт | 16 Гц | 139 | 409 | 258.875 | 274.5 | 107.01020200585238 | 0.21727463306810685 | | WAN | 512 байт | 1 Гц | 136 | 136 | 136 | 136 | 0 | NaN | | WAN | 512 байт | 2 Гц | 140 | 141 | 140.5 | 140.5 | 0.7071067811865476 | 0 | | WAN | 512 байт | 4 Гц | 138 | 140 | 139 | 139 | 0.816496580927726 | 0 | | WAN | 512 байт | 8 Гц | 139 | 273 | 174 | 142 | 60.82057922399997 | 1.1519869775965361 | | WAN | 512 байт | 16 Гц | 138 | 409 | 258.9375 | 274 | 106.55356634106622 | 0.20729714347508518 | | WAN | 1024 байт | 1 Гц | 138 | 138 | 138 | 138 | 0 | NaN | | WAN | 1024 байт | 2 Гц | 136 | 137 | 136.5 | 136.5 | 0.7071067811865476 | 0 | | WAN | 1024 байт | 4 Гц | 139 | 144 | 141.25 | 141 | 2.217355782608345 | 0.2780305556539629 | | WAN | 1024 байт | 8 Гц | 140 | 280 | 178.125 | 147 | 60.854480994770284 | 1.1458584015115532 | | WAN | 1024 байт | 16 Гц | 137 | 410 | 258.0625 | 274.5 | 107.53757095390739 | 0.2189714131057595 | | WAN | 2048 байт | 1 Гц | 138 | 138 | 138 | 138 | 0 | NaN | | WAN | 2048 байт | 2 Гц | 138 | 139 | 138.5 | 138.5 | 0.7071067811865476 | 0 | | WAN | 2048 байт | 4 Гц | 144 | 148 | 146 | 146 | 2.309401076758503 | 0 | | WAN | 2048 байт | 8 Гц | 140 | 277 | 179 | 150.5 | 59.744694922884754 | 1.1344525148833444 | | WAN | 2048 байт | 16 Гц | 140 | 407 | 257.3125 | 273.5 | 106.650031254879 | 0.21289467143399016 | ### Оцінка відстані до сервера та тих характеристик каналу клієнт-сервер, що можно отримати з цих даних За отриманими даними можна зробити висновок, що персональний сервер PAN працює в середньому повільніше, ніж глобальний WAN, але з більшою стабільністю. Це виявляється у меншому середньоквадратичному відхиленні та меншому діапазоні значень для PAN порівняно з WAN. Також, результати RTT для PAN мають більш симетричний розподіл, що вказує на менше відхилення від середнього значення. Зауважується, що для WAN коефіцієнт асиметрії завжди позитивний, що свідчить про те, що відхилення від середнього значення частіше спрямовані в бік максимального значення. На основі цього можна зробити наступні висновки про те що обмеження по швидкості пов'язані не в першу чергу з вістанню, скільки з пропускною здатністю каналу, технічними обмеженнями. ### Результат виклику системної мережевої утіліти ping. Pinging 34.148.134.19 with 32 bytes of data: Reply from 34.148.134.19: bytes=32 time=130ms TTL=105 Reply from 34.148.134.19: bytes=32 time=129ms TTL=105 Reply from 34.148.134.19: bytes=32 time=130ms TTL=105 Reply from 34.148.134.19: bytes=32 time=130ms TTL=105 Ping statistics for 34.148.134.19: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 129ms, Maximum = 130ms, Average = 129ms ## Висновки Здається, що низька швидкість сигналу в локальній мережі може бути викликана кількома факторами, такими як перевантаження мережі, неякісні кабелі або застарілі мережеві пристрої. Однак у цьому випадку, ймовірно, затримка пов’язана саме з обробкою сигналу на сервері. Порівнюючи персональний сервер PAN і глобальну мережу WAN, можна помітити, що PAN, хоч і має меншу швидкість, але він стабільніший за WAN. Це підтверджується меншим середньоквадратичним відхиленням і меншим діапазоном значень для PAN. RTT для PAN характеризується більш симетричним розподілом, що свідчить про меншу кількість відхилень від середнього значення. У випадку WAN спостерігається більша нерівномірність значень, що вказує на те, що відхилення частіше спрямовані в бік максимальних значень. Загальна тенденція полягає в тому, що PAN може бути надійним рішенням для стабільних з'єднань, хоча з меншою швидкістю, тоді як WAN може бути більш підходящим для завдань, де важлива швидкість, навіть за рахунок меншої стабільності.