---
# System prepended metadata

title: '[Лабораторна робота 1](https://en.wikipedia.org/wiki/Indentation_style)'

---

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

### Посилання на [результати обчислень RTT у вигляді таблиць](https://docs.google.com/spreadsheets/d/1qeVgVbYJSnLpV6XVvkxWmT8nIr2e7qKHzIequLWPaV8/edit?usp=sharing)

### Посилання на [клієнт-серверний додаток](https://replit.com/join/qhzyxjwadq-sharkovskaya)

Cтворення веб-сервера, який обробляє запити різними маршрутами та обробляє POST-запити на сервер

``` glsl=1
const express = require("express");
const fs = require("fs");
const ejs = require("ejs");
const path = require("path");
const app = express();

// app.use(express.static("public"));

app.set("view engine", "ejs");
app.set("views", path.join(__dirname, "views"));

app.get("/home", (req, res) => {
  const labs = [
    { name: "Lab 1", url: "/lab1" },
    // { name: "Lab 2", url: "/lab2" },
  ];
  res.render("index_client", { labs: labs });
});

app.get("/lab1", (req, res) => {
  fs.readFile("views/lab1_client.ejs", "utf8", (err, data) => {
    if (err) {
      console.error("Error reading file:", err);
      res.status(500).send("Internal Server Error");
    } else {
      const renderedHtml = ejs.render(data, { req });
      res.status(200).send(renderedHtml);
    }
  });
});

app.post("/lab1/request/to/server", (req, res) => {
  const contentSize = req.headers["content-length"];
  console.log("Received request size: " + contentSize);
  const t = Date.now();
  res.status(200).send(t.toString());
});

app.get("*", (req, res) => {
  res.redirect("/home");
});

const PORT = 3000;
const server = app.listen(PORT, () => {
  console.log(`Server is running`);
});
```

![image](https://hackmd.io/_uploads/BkUISxzXR.png)
![image](https://hackmd.io/_uploads/S1yHrxf70.png)


<!-- 
Результати були отримані у наступному вигляді:
![Screenshot 2024-03-19 110122](https://hackmd.io/_uploads/HkHqV0UCa.png)
 
![Screenshot 2024-03-19 110140](https://hackmd.io/_uploads/r1Pc4C8Ca.png)
<br>
![ping icmp to replit (1)](https://hackmd.io/_uploads/HJwxMAIAp.png) -->

Оцінка відстані до сервера, використовуючи протокол HTTP та результати клієнт-серверного додатку на хостінгу replit.com:
$${2.9 * 10⁸ * 10.7 / 2 = 15.515 * 10^8  = 1551500 (km)}$$

Оцінка відстані до сервера, використовуючи протокол HTTP та  результати клієнт-серверного додатку в персональній мережі (PAN): 
$${2.9 * 10⁸ / 2 * 4.8 = 6.96 * 10^8 m = 696000 (km)}$$

Дані способи не дають дійсних значень відстані через фактори, які можуть впливати на час очікування відповіді (завантаженість сервера, обробка у черзі, пропускна здатність). 

## Висновки
Чим менше частота надсилання запитів до сервера, тим стабільніше значення RTT, оскільки сервер витрачає на обробку запитів від клієнтів менше процесорного часу, а також знижується мережне навантаження.
