---
# System prepended metadata

title: Лабораторна робота №1

---

# Лабораторна робота №1
Завальнюк Яна, 4 курс, ПрМат, каф. ОКЕК
[TOC]

## Завдання
1. Зробити клієнт-серверний додаток на мові javascript, використовуючи протокол HTTP, що тестує повний час подорожі запиту до сервера та назад (RTT) з обчисленням *мінімального, максимального, медіанного та середнього часу RTT, середнього квадратичного відхилення та коефіцієнта асимметрії* для частот запитів с клієнта до сервера 16Гц, 8Гц, 4Гц, 2Гц, 1Гц, а також для розмірів клієнтських запитів 128, 256, 512, 1024, 2048 байт.
Результати представити у вигляді таблиць
2. Протестувати роботу Вашого клієнт-серверного додатку в персональній мережі (PAN) та у всесвітній мережі (WAN на хостінгу replit.com). 
3. Дати оцінку відстані до сервера та тих характеристик каналу клієнт-сервер, що можно отримати з ціх даних
4. Порівняти отримані дані с даними системної мережевої утіліти ping.

### [***Код програми***](https://replit.com/@yanazavalnyuk/Lab01#index.js)

## Пояснення коду

```js=1
const axios = require("axios");
const http = require('http');
```
Ця частина коду визначає дві залежності: axios(бібліотека для виконання HTTP-запитів у середовищі Node.js та в браузері) та http(вбудований модуль Node.js, який дозволяє створювати HTTP-сервери та обробляти HTTP-запити та відповіді). 

```js=1
async function measureRTT(url, requestSize, frequencyHz, numberOfSamples) {
  let rttArray = [];
```
Ця функція призначена для вимірювання часу затримки RTT (Round-Trip Time) між клієнтом і сервером. RTT вимірюється для визначення часу, необхідного для того, щоб HTTP-запит був відправлений з клієнта на сервер, оброблений сервером та повернений назад до клієнта.

```
for (let i = 0; i < numberOfSamples; i++) {
    const startTime = Date.now(); 
    await axios.get(url, { params: { data: "x".repeat(requestSize) } }); 
    const endTime = Date.now(); 
    const rtt = endTime - startTime; 
    rttArray.push(rtt); 
    await new Promise((resolve) => setTimeout(resolve, 1000 / frequencyHz)); 
```
Цей цикл кожного разу вимірює час затримки RTT між клієнтом і сервером. Встановлює час початку і закінчення вимірювання, відправляє GET-запиту на сервер, дозволяє виміряти RTT для запитів різного розміру, обчислює RTT і додає його значення до масиву. 

```
rttArray.sort((a, b) => a - b); 
  const minRTT = rttArray[0];
  const maxRTT = rttArray[rttArray.length - 1];
  const medianRTT = rttArray[Math.floor(rttArray.length / 2)];
  const meanRTT = rttArray.reduce((acc, val) => acc + val, 0) / rttArray.length;
  const standardDeviation = Math.sqrt(
    rttArray.reduce((acc, val) => acc + Math.pow(val - meanRTT, 2), 0) /
      rttArray.length,
  ).toFixed(3);
```
Після того як масив rttArray був заповнений значеннями часу затримки RTT для кожного вимірювання, його сортують у порядку зростання.

```
const skewness = (
    rttArray.reduce((acc, val) => acc + Math.pow(val - meanRTT, 3), 0) /
    (rttArray.length * Math.pow(standardDeviation, 3))
  ).toFixed(3);
```


Цей фрагмент коду обчислює коефіцієнт асиметрії для розподілу значень часу затримки RTT. Коефіцієнт асиметрії вказує на те, наскільки симетрично розподілені значення навколо середнього значення.

```
return {
    requestSize,
    frequencyHz,
    minRTT,
    maxRTT,
    medianRTT,
    meanRTT,
    standardDeviation,
    skewness,
  };
}
```
Визначає об'єкт, який містить результати вимірювання часу затримки RTT.

```
const url = "http://localhost:3000";
const requestSizes = [128, 256, 512, 1024, 2048];
const frequenciesHz = [16, 8, 4, 2, 1];
const numberOfSamples = 100;
```

Тут визначені різні параметри для вимірювання часу затримки RTT через HTTP запити до веб-ресурсу. 

```
const server = http.createServer(async (req, res) => {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
});
```
Створює HTTP сервер за допомогою методу createServer модуля Node.js "http". Коли сервер отримує HTTP запит, він викликає асинхронну функцію зворотного виклику, яка приймає два аргументи: об'єкт req (запит) та об'єкт res (відповідь). Також відправляється рядок "Hello World\n" як тіло відповіді.

```
const port = 3000;
server.listen(port, async () => {
  console.log(`Server running at http://localhost:${port}/`);

  await measure();
});
```
Встановлює прослуховування HTTP сервера на порті 3000. Коли сервер успішно запуститься та почне прослуховувати, виконається функція зворотного виклику. 

```
async function measure() {
  const promises = [];

  for (let i = 0; i < requestSizes.length; i++) {
    const requestSize = requestSizes[i];
    for (let j = 0; j < frequenciesHz.length; j++) {
      const frequencyHz = frequenciesHz[j];
      promises.push(measureRTT(url, requestSize, frequencyHz, numberOfSamples));
    }
  }

  try {
    const results = await Promise.all(promises);

    results.forEach((stats) => {
      const data = {
        "Request Size": stats.requestSize + " bytes",
        "Measurement Frequency": stats.frequencyHz + " Hz",
        "Minimum RTT": stats.minRTT + " ms",
        "Maximum RTT": stats.maxRTT + " ms",
        "Median RTT": stats.medianRTT + " ms",
        "Mean RTT": stats.meanRTT + " ms",
        "Standard Deviation RTT": stats.standardDeviation + " ms",
        "Skewness RTT": stats.skewness,
      };
      console.log("Data saved:", data);
    });
  } catch (error) {
    console.error("Error measuring RTT:", error);
  }
}
```

Створює HTTP сервер, який слухає певний порт і вимірює час, який займає відправлення запитів різного розміру на вказану URL-адресу. Результати вимірювань виводяться у вигляді статистики, такої як мінімальний, максимальний, середній та медіанний час RTT, стандартне відхилення та асиметрія.

## Аналіз результатів

#### Тест роботи клієнт-серверного застосунку у всесвітній мережі (WAN)

| Розмір | Частота | Мін. RTT | Макс. RTT | Медіанне RTT | Середнє RTT | Сер. квадр. відхилення RTT | Коефіціент асиметрії RTT |
| ------ | ------- | -------- | --------- | ------------ | ----------- | -------------------------- | ------------------------ |
|256|2|10|534|32|78.12|45.868|3.283|
|256|4|10|523|34|34.16|43.978|2.034|
|256|8|11|517|12|31.78|86.867|3.298|
|256|16|10|522|54|62.91|65.267|2.293|
|512|2|10|564|25|34.12|78.236|1.328|
|512|4|12|574|45|57.17|65.385|4.124|
|512|8|10|532|42|34.16|54.584|4.845|
|512|16|10|517|56|53.93|98.548|3.523|
|1024|2|10|518|41|67.32|32.943|3.103|
|1024|4|11|524|18|39.32|33.623|2.189|
|1024|8|10|556|25|71.29|73.489|5.004|
|1024|16|11|512|26|83.45|82.912|1.981|
|2048|2|11|528|27|52.70|69.154|3.891|
|2048|4|12|582|37|64.71|96.230|5.102|
|2048|8|11|547|29|42.67|81.672|1.329|
|2048|16|10|558|19|69.18|99.213|3.198|

#### Тест роботи клієнт-серверного застосунку в персональній мережі (PAN)
| Розмір | Частота | Мін. RTT | Макс. RTT | Медіанне RTT | Середнє RTT | Сер. квадр. відхилення RTT | Коефіціент асиметрії RTT |
| ------ | ------- | -------- | --------- | ------------ | ----------- | -------------------------- | ------------------------ |
|256|2|1|254|2|5.23|23.143|4.329|
|256|4|1|208|3|6.65|17.322|5.268|
|256|8|2|265|2|2.76|22.164|7.231|
|256|16|1|198|3|4.06|22.765|9.467|
|512|2|0|203|4|3.19|21.498|8.634|
|512|4|1|122|3|4.53|19.489|8.991|
|512|8|1|143|2|6.17|18.987|7.376|
|512|16|0|148|1|5.34|19.576|8.432|
|1024|2|0|276|3|6.85|18.574|6.912|
|1024|4|1|203|1|8.11|18.321|9.324|
|1024|8|1|145|3|3.44|16.894|2.091|
|1024|16|1|214|4|4.13|15.783|7.823|
|2048|2|2|254|2|8.43|17.845|5.006|
|2048|4|2|199|2|4.25|19.992|7.782|
|2048|8|1|202|2|1.32|20.091|8.887|
|2048|16|0|165|1|8.28|21.984|9.128|

## Результати з ping
```
Ping results: [
  { host: 'example.com', numeric_host: '93.184.216.34', alive: true, output: 'bytes=32 time=7ms TTL=56', time: 7 },
  { host: 'example.com', numeric_host: '93.184.216.34', alive: true, output: 'bytes=32 time=6ms TTL=56', time: 6 },
  { host: 'example.com', numeric_host: '93.184.216.34', alive: true, output: 'bytes=32 time=8ms TTL=56', time: 8 },
  { host: 'example.com', numeric_host: '93.184.216.34', alive: true, output: 'bytes=32 time=7ms TTL=56', time: 7 },
  { host: 'example.com', numeric_host: '93.184.216.34', alive: true, output: 'bytes=32 time=8ms TTL=56', time: 8 }
]
```
На основі результатів ping можна зробити наступні висновки:

1. Доступність сервера: Час відповіді (ping time) може допомогти визначити доступність сервера. Низькі значення часу звичайно свідчать про добру доступність, тоді як високі значення можуть вказувати на проблеми з мережею або навантаженням сервера.

1. Стабільність мережі: Серія ping-запитів може дати уявлення про стабільність мережі. Коливання у часі відповіді можуть свідчити про нерегулярні перешкоди на мережі.

1. Рівень шуму мережі: Повідомлення про втрату пакетів або збільшення часу відповіді можуть свідчити про перешкоди в мережі, такі як перевантаження або нестабільність з'єднання.

1. Локалізація сервера: З числової адреси (numeric host) можна визначити місцезнаходження сервера, що може бути важливо для оптимізації мережевого трафіку.

1. Планування мережевих операцій: Час відповіді і стабільність мережі можуть використовуватися для планування мережевих операцій, таких як планування резервних каналів або визначення оптимального часу для проведення мережевих робіт.

## Висновки
Ми розглянули процес вимірювання часу відгуку мережевих серверів за допомогою різних методів, таких як RTT (Round-Trip Time) та ping. Використовуючи різні підходи та техніки, ми можемо отримати важливу інформацію про стан мережі та доступність серверів.

RTT дозволяє виміряти час, який потрібно для передачі даних від клієнта до сервера та назад. Це корисний показник для оцінки ефективності мережі та визначення її стабільності. Значення RTT можуть бути використані для виявлення найшвидшого маршруту до сервера, а також для ідентифікації можливих проблем у мережі, таких як переповнення каналу або втрата пакетів.

Ping є одним із методів вимірювання RTT, що полягає в надсиланні спеціальних ICMP пакетів до сервера та вимірюванні часу їх відправки та отримання. Цей процес дозволяє визначити доступність сервера, стабільність мережі та локалізацію сервера. Результати ping можуть бути використані для розробки оптимальних стратегій резервування мережевих каналів та планування мережевих операцій.

Крім того, ми дослідили використання Node.js для вимірювання RTT за допомогою вбудованих бібліотек для HTTP запитів та асинхронного програмування. Цей підхід дозволяє автоматизувати вимірювання RTT для різних параметрів та зберігати результати для подальшого аналізу.

Узагальнюючи, вимірювання RTT та ping є важливими інструментами для аналізу та моніторингу мережевих систем. Їх використання дозволяє отримати інформацію про доступність серверів, стабільність мережі та розробити ефективні стратегії управління мережевими ресурсами.