«Для чого в команді ping використовуються опції Loose, Strict, Record, Timestamp і Verbose?» — таке запитання мені нещодавно зустрівся в вендорном іспиті. Вони дозволяють впливати на маршрутизацію пакетів ICMP і збирати інформацію про транзитних L3-пристроях. Але займаючись мережевими технологіями вже досить давно, я майже ніколи їх не використав.

Мені стало не зовсім зрозуміло, чому таке питання взагалі присутня в тесті. Повернувшись додому, вирішив дізнатися, раптом я дійсно постійно випускаю з уваги щось важливе?
Читати далі →

Секрети Progressive Web Apps: частина 2

Для тих, хто пропустив першу частину статті: сюди. Ну а для всіх інших, як зазвичай, привіт, Хабрахабр. Ми продовжуємо тему PWA і вивчення базового алгоритму синхронізації (не кидати ж розпочате?). У минулій частині ми закінчили на тому, що наше умовне додаток вміє запитувати статті з сервера, отримувати тільки актуальні матеріали, стежити за змінами і вилученнями статей і грамотно все це обробляти. Працювало це все через обчислення дельти: різниці між тим, що є в додатку, і тим, що зберігається на сервері.

У цій частині ми вивчимо різні конкретні схеми по реалізації описаних вище теорій, обговоримо їх сильні і слабкі сторони. Ну а перед тим як ми почнемо, давайте опишемо вимоги до шуканим алгоритмами.

Читати далі →

SO_TIMESTAMPING в картинках. Прийом пакету

Буває, що додатком потрібно дізнатися точний час прийому або відправлення мережевого пакету. Наприклад, для синхронізації годин (див. PTP, NTP або тестування затримок в мережі (див. RFC2544).
Наївним рішенням буде запам'ятовувати в додатку час відразу після отримання пакету від ядра (або перед відправкою ядру):
recv(sock, buffer, length, flags);
clock_gettime(CLOCK_REALTIME, timespec);

Ясно, що отримане таким чином час може помітно відрізнятися від моменту, коли пакет був отриманий Мережевим стройством. Для отримання більш точного часу потрібна підтримка від опереционной системи, драйвера та/або Мережевого Пристрою.
Починаючи з версії 2.6.30 Лінукс підтримує опцію сокета SO_TIMESTAMPING. Вона дозволяє користувачу сокету отримувати тимчасові мітки для відправлених і прийнятих пакетів. Тимчасові мітки можуть бути зняті самим ядром, драйвером або мережевим пристроєм (див. список підтримуючих пристроїв і драйверів). Про те, що це взагалі таке і як цим користуватися, варто почитати Documentation/networking/timestamping.txt
У цій статті я розповім про те, як пакети доставляються від мережевого пристрою користувачеві, коли при цьому знімаються тимчасові мітки, як вони доставляються користувачеві і наскільки вони точні. Наведені приклади коду ядра взяті з версії 4.1.
Читати далі →

Спостерігаємо за користувачем – два типу timestamp

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

Є стандартна проблема, яку часто бачу в чужих даних. Покладемо зібралися ви відстежувати події/дії користувача. Зазвичай, у вас буде це робити певний код (JS у вебі чи SDK для аппов), який буде слати дані серверу.

Кожній події потрібна мітка часу. І є вибір з двох: локальний час на клієнті або час одержання події сервером. Один хороший рада що робити і загадка без відповіді під катом
Читати далі →