[{"data":1,"prerenderedAt":12010},["ShallowReactive",2],{"navigation_docs":3,"-web-development-network-architecture-and-protocols-ip-addressing-ports-sockets":3728,"-web-development-network-architecture-and-protocols-ip-addressing-ports-sockets-surround":12005},[4,1707,1912,2366,2547,2673,2880,3002,3052,3109,3143,3269,3346,3360,3495,3512,3525,3671,3724],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"C#","i-devicon-csharp","\u002Fcsharp","01.csharp",[10,13,60,90,120,202,219,253,379,404,457,650,1364,1654,1703],{"title":11,"path":7,"stem":12},"C# та .NET","01.csharp\u002Findex",{"title":14,"icon":15,"path":16,"stem":17,"children":18,"page":59},"Fundamentals","i-lucide-book-open","\u002Fcsharp\u002Ffundamentals","01.csharp\u002F01.fundamentals",[19,23,27,31,35,39,43,47,51,55],{"title":20,"path":21,"stem":22},"Вступ до екосистеми .NET","\u002Fcsharp\u002Ffundamentals\u002Fintroduction-to-ecosystem","01.csharp\u002F01.fundamentals\u002F01.introduction-to-ecosystem",{"title":24,"path":25,"stem":26},"Структура програми на C#","\u002Fcsharp\u002Ffundamentals\u002Fprogram-structure","01.csharp\u002F01.fundamentals\u002F02.program-structure",{"title":28,"path":29,"stem":30},"Змінні та Типи Даних","\u002Fcsharp\u002Ffundamentals\u002Fvariables-data-types","01.csharp\u002F01.fundamentals\u002F03.variables-data-types",{"title":32,"path":33,"stem":34},"Масиви","\u002Fcsharp\u002Ffundamentals\u002Farrays","01.csharp\u002F01.fundamentals\u002F04.arrays",{"title":36,"path":37,"stem":38},"Strings & Text Handling","\u002Fcsharp\u002Ffundamentals\u002Fstrings-text-handling","01.csharp\u002F01.fundamentals\u002F05.strings-text-handling",{"title":40,"path":41,"stem":42},"Дати і Час","\u002Fcsharp\u002Ffundamentals\u002Fdates-time-handling","01.csharp\u002F01.fundamentals\u002F06.dates-time-handling",{"title":44,"path":45,"stem":46},"Потік Керування","\u002Fcsharp\u002Ffundamentals\u002Fcontrol-flow","01.csharp\u002F01.fundamentals\u002F07.control-flow",{"title":48,"path":49,"stem":50},"Методи","\u002Fcsharp\u002Ffundamentals\u002Fmethods","01.csharp\u002F01.fundamentals\u002F08.methods",{"title":52,"path":53,"stem":54},"Основи Відлагодження","\u002Fcsharp\u002Ffundamentals\u002Fdebugging-basics","01.csharp\u002F01.fundamentals\u002F09.debugging-basics",{"title":56,"path":57,"stem":58},"Інтерактивна Консоль (Classic)","\u002Fcsharp\u002Ffundamentals\u002Finteractive-console","01.csharp\u002F01.fundamentals\u002F10.interactive-console",false,{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":59},"OOP","i-lucide-box","\u002Fcsharp\u002Foop","01.csharp\u002F02.oop",[66,70,74,78,82,86],{"title":67,"path":68,"stem":69},"Package Management (Управління Пакетами)","\u002Fcsharp\u002Foop\u002Fpackage-management","01.csharp\u002F02.oop\u002F01.package-management",{"title":71,"path":72,"stem":73},"Класи та Об'єкти","\u002Fcsharp\u002Foop\u002Fclasses-objects","01.csharp\u002F02.oop\u002F02.classes-objects",{"title":75,"path":76,"stem":77},"Властивості та Поля","\u002Fcsharp\u002Foop\u002Fproperties-fields","01.csharp\u002F02.oop\u002F03.properties-fields",{"title":79,"path":80,"stem":81},"Стовпи ООП","\u002Fcsharp\u002Foop\u002Foop-pillars","01.csharp\u002F02.oop\u002F04.oop-pillars",{"title":83,"path":84,"stem":85},"Advanced Types","\u002Fcsharp\u002Foop\u002Fadvanced-types","01.csharp\u002F02.oop\u002F05.advanced-types",{"title":87,"path":88,"stem":89},"Namespaces (Простори Імен)","\u002Fcsharp\u002Foop\u002Fnamespaces","01.csharp\u002F02.oop\u002F06.namespaces",{"title":91,"icon":92,"path":93,"stem":94,"children":95,"page":59},"Advanced Core","i-lucide-zap","\u002Fcsharp\u002Fadvanced-core","01.csharp\u002F03.advanced-core",[96,100,104,108,112,116],{"title":97,"path":98,"stem":99},"Generics (Узагальнення)","\u002Fcsharp\u002Fadvanced-core\u002Fgenerics","01.csharp\u002F03.advanced-core\u002F01.generics",{"title":101,"path":102,"stem":103},"Делегати, Події та Лямбда-вирази","\u002Fcsharp\u002Fadvanced-core\u002Fdelegates-events-lambdas","01.csharp\u002F03.advanced-core\u002F02.delegates-events-lambdas",{"title":105,"path":106,"stem":107},"Interfaces Deep Dive (Інтерфейси: Поглиблений Розгляд)","\u002Fcsharp\u002Fadvanced-core\u002Finterfaces-deep-dive","01.csharp\u002F03.advanced-core\u002F03.interfaces-deep-dive",{"title":109,"path":110,"stem":111},"Обробка Винятків","\u002Fcsharp\u002Fadvanced-core\u002Fexception-handling","01.csharp\u002F03.advanced-core\u002F04.exception-handling",{"title":113,"path":114,"stem":115},"Pattern Matching","\u002Fcsharp\u002Fadvanced-core\u002Fpattern-matching","01.csharp\u002F03.advanced-core\u002F05.pattern-matching",{"title":117,"path":118,"stem":119},"Додаткові Можливості C#","\u002Fcsharp\u002Fadvanced-core\u002Fadditional-features","01.csharp\u002F03.advanced-core\u002F06.additional-features",{"title":121,"icon":122,"path":123,"stem":124,"children":125,"page":59},"Architecture Best Practices","i-lucide-building-2","\u002Fcsharp\u002Farchitecture-best-practices","01.csharp\u002F04.architecture-best-practices",[126,130,149,153,157,161,165,169],{"title":127,"path":128,"stem":129},"Software Design Principles (Частина 1)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fsoftware-design-principles","01.csharp\u002F04.architecture-best-practices\u002F01.software-design-principles",{"title":131,"icon":132,"path":133,"stem":134,"children":135,"page":59},"Design Patterns","i-lucide-folder","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns",[136],{"title":137,"icon":132,"path":138,"stem":139,"children":140,"page":59},"Creational","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns\u002Fcreational","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns\u002Fcreational",[141,145],{"title":142,"path":143,"stem":144},"Singleton (Одинак)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns\u002Fcreational\u002Fsingleton","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns\u002Fcreational\u002F01.singleton",{"title":146,"path":147,"stem":148},"Builder (Будівельник)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns\u002Fcreational\u002Fbuilder","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns\u002Fcreational\u002F02.builder",{"title":150,"path":151,"stem":152},"Building Professional CLIs","\u002Fcsharp\u002Farchitecture-best-practices\u002Fbuilding-professional-clis","01.csharp\u002F04.architecture-best-practices\u002F03.building-professional-clis",{"title":154,"path":155,"stem":156},"Validation & Flow Control","\u002Fcsharp\u002Farchitecture-best-practices\u002Fvalidation-flow-control","01.csharp\u002F04.architecture-best-practices\u002F04.validation-flow-control",{"title":158,"path":159,"stem":160},"The Modern .NET Host (Microsoft.Extensions)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fmodern-dotnet-host","01.csharp\u002F04.architecture-best-practices\u002F05.modern-dotnet-host",{"title":162,"path":163,"stem":164},"Data Mapper: Repository та DAO патерни (Частина 1)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdata-mapper-part1","01.csharp\u002F04.architecture-best-practices\u002F06.data-mapper-part1",{"title":166,"path":167,"stem":168},"Data Mapper: Repository та DAO патерни (Частина 2)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdata-mapper-part2","01.csharp\u002F04.architecture-best-practices\u002F07.data-mapper-part2",{"title":170,"icon":132,"path":171,"stem":172,"children":173,"page":59},"Di Ioc","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc",[174,178,182,186,190,194,198],{"title":175,"path":176,"stem":177},"Проблема залежностей та Інверсія Контролю","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fthe-dependency-problem","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F01.the-dependency-problem",{"title":179,"path":180,"stem":181},"Будуємо власний Service Container","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fbuild-your-own-container","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F02.build-your-own-container",{"title":183,"path":184,"stem":185},"Service Locator: Паттерн та Анти-паттерн","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fservice-locator-pattern","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F03.service-locator-pattern",{"title":187,"path":188,"stem":189},"Паттерни Dependency Injection","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fdependency-injection-patterns","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F04.dependency-injection-patterns",{"title":191,"path":192,"stem":193},"Microsoft DI: IServiceCollection та IServiceProvider","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fmicrosoft-di-deep-dive","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F05.microsoft-di-deep-dive",{"title":195,"path":196,"stem":197},"Service Lifetimes та Scopes","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fservice-lifetimes-and-scopes","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F06.service-lifetimes-and-scopes",{"title":199,"path":200,"stem":201},"DI Анти-паттерни та Найкращі Практики","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fdi-anti-patterns-and-best-practices","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F07.di-anti-patterns-and-best-practices",{"title":203,"icon":132,"path":204,"stem":205,"children":206,"page":59},"Standard Library","\u002Fcsharp\u002Fstandard-library","01.csharp\u002F05.standard-library",[207,211,215],{"title":208,"path":209,"stem":210},"Collections (Колекції)","\u002Fcsharp\u002Fstandard-library\u002Fcollections","01.csharp\u002F05.standard-library\u002F01.collections",{"title":212,"path":213,"stem":214},"High Performance Types (Високопродуктивні Типи)","\u002Fcsharp\u002Fstandard-library\u002Fhigh-performance-types","01.csharp\u002F05.standard-library\u002F02.high-performance-types",{"title":216,"path":217,"stem":218},"LINQ (Language Integrated Query)","\u002Fcsharp\u002Fstandard-library\u002Flinq","01.csharp\u002F05.standard-library\u002F03.linq",{"title":220,"icon":221,"path":222,"stem":223,"children":224,"page":59},"System Internals Concurrency","i-lucide-server","\u002Fcsharp\u002Fsystem-internals-concurrency","01.csharp\u002F06.system-internals-concurrency",[225,229,233,237,241,245,249],{"title":226,"path":227,"stem":228},"Memory Management","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fmemory-management","01.csharp\u002F06.system-internals-concurrency\u002F01.memory-management",{"title":230,"path":231,"stem":232},"Reflection API: System.Type та Метадані","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Freflection-fundamentals","01.csharp\u002F06.system-internals-concurrency\u002F02.reflection-fundamentals",{"title":234,"path":235,"stem":236},"Attributes та Dynamic Language Runtime","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fattributes-dynamic","01.csharp\u002F06.system-internals-concurrency\u002F03.attributes-dynamic",{"title":238,"path":239,"stem":240},"Expression Trees: Швидка Альтернатива Рефлексії","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fexpression-trees-compiled","01.csharp\u002F06.system-internals-concurrency\u002F04.expression-trees-compiled",{"title":242,"path":243,"stem":244},"Source Generators: Compile-Time Code Generation","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fsource-generators","01.csharp\u002F06.system-internals-concurrency\u002F05.source-generators",{"title":246,"path":247,"stem":248},"Multithreading Fundamentals","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fmultithreading-fundamentals","01.csharp\u002F06.system-internals-concurrency\u002F06.multithreading-fundamentals",{"title":250,"path":251,"stem":252},"Synchronization Primitives","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fsynchronization-primitives","01.csharp\u002F06.system-internals-concurrency\u002F07.synchronization-primitives",{"title":254,"icon":255,"path":256,"stem":257,"children":258,"page":59},"System Programming Windows","i-lucide-cpu","\u002Fcsharp\u002Fsystem-programming-windows","01.csharp\u002F07.system-programming-windows",[259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335,339,343,347,351,355,359,363,367,371,375],{"title":260,"path":261,"stem":262},"Як Працює Операційна Система","\u002Fcsharp\u002Fsystem-programming-windows\u002Fhow-os-works","01.csharp\u002F07.system-programming-windows\u002F01.how-os-works",{"title":264,"path":265,"stem":266},"Процеси в .NET — API та Запуск","\u002Fcsharp\u002Fsystem-programming-windows\u002Fprocesses-in-dotnet","01.csharp\u002F07.system-programming-windows\u002F02.processes-in-dotnet",{"title":268,"path":269,"stem":270},"Процеси в .NET — IPC та Міжпроцесна Комунікація","\u002Fcsharp\u002Fsystem-programming-windows\u002F02a.processes-ipc","01.csharp\u002F07.system-programming-windows\u002F02a.processes-ipc",{"title":272,"path":273,"stem":274},"Application Domains та Збірки — AppDomain і AssemblyLoadContext","\u002Fcsharp\u002Fsystem-programming-windows\u002Fappdomains-assemblies","01.csharp\u002F07.system-programming-windows\u002F03.appdomains-assemblies",{"title":276,"path":277,"stem":278},"Application Domains та Збірки — Plug-in Система з Hot-Reload","\u002Fcsharp\u002Fsystem-programming-windows\u002F03a.appdomains-plugin-system","01.csharp\u002F07.system-programming-windows\u002F03a.appdomains-plugin-system",{"title":280,"path":281,"stem":282},"Потоки — Основи та API Thread","\u002Fcsharp\u002Fsystem-programming-windows\u002Fthread-fundamentals","01.csharp\u002F07.system-programming-windows\u002F04.thread-fundamentals",{"title":284,"path":285,"stem":286},"Потоки — Lifecycle, Пріоритети та Безпечне Завершення","\u002Fcsharp\u002Fsystem-programming-windows\u002F04a.thread-lifecycle-priorities","01.csharp\u002F07.system-programming-windows\u002F04a.thread-lifecycle-priorities",{"title":288,"path":289,"stem":290},"Проблеми Спільного Стану — Race Condition та Data Race","\u002Fcsharp\u002Fsystem-programming-windows\u002Fshared-state-problems","01.csharp\u002F07.system-programming-windows\u002F05.shared-state-problems",{"title":292,"path":293,"stem":294},"Проблеми Спільного Стану — Memory Model та volatile","\u002Fcsharp\u002Fsystem-programming-windows\u002F05a.shared-state-memory-model","01.csharp\u002F07.system-programming-windows\u002F05a.shared-state-memory-model",{"title":296,"path":297,"stem":298},"Синхронізація — Monitor, lock та еволюція примітивів","\u002Fcsharp\u002Fsystem-programming-windows\u002Fsynchronization-fundamentals","01.csharp\u002F07.system-programming-windows\u002F06.synchronization-fundamentals",{"title":300,"path":301,"stem":302},"Синхронізація — Наскрізний Приклад та Deadlock Detection","\u002Fcsharp\u002Fsystem-programming-windows\u002F06a.synchronization-walkthrough","01.csharp\u002F07.system-programming-windows\u002F06a.synchronization-walkthrough",{"title":304,"path":305,"stem":306},"Синхронізація — Mutex, Semaphore та Event-Based Primitives","\u002Fcsharp\u002Fsystem-programming-windows\u002Fsynchronization-advanced","01.csharp\u002F07.system-programming-windows\u002F07.synchronization-advanced",{"title":308,"path":309,"stem":310},"Синхронізація — Interlocked, Volatile та Lock-Free Структури","\u002Fcsharp\u002Fsystem-programming-windows\u002F07a.synchronization-advanced-walkthrough","01.csharp\u002F07.system-programming-windows\u002F07a.synchronization-advanced-walkthrough",{"title":312,"path":313,"stem":314},"Interlocked, CAS та Lock-Free Структури","\u002Fcsharp\u002Fsystem-programming-windows\u002Finterlocked-cas-lockfree","01.csharp\u002F07.system-programming-windows\u002F08.interlocked-cas-lockfree",{"title":316,"path":317,"stem":318},"Volatile, Memory Model та Spinning","\u002Fcsharp\u002Fsystem-programming-windows\u002F08a.volatile-memory-model","01.csharp\u002F07.system-programming-windows\u002F08a.volatile-memory-model",{"title":320,"path":321,"stem":322},"ThreadPool — Пул Потоків для Ефективного Виконання","\u002Fcsharp\u002Fsystem-programming-windows\u002Fthread-pool","01.csharp\u002F07.system-programming-windows\u002F09.thread-pool",{"title":324,"path":325,"stem":326},"ThreadPool — Просунуті Сценарії та Внутрішня Будова","\u002Fcsharp\u002Fsystem-programming-windows\u002F09a.thread-pool-advanced","01.csharp\u002F07.system-programming-windows\u002F09a.thread-pool-advanced",{"title":328,"path":329,"stem":330},"Concurrent та Immutable Collections","\u002Fcsharp\u002Fsystem-programming-windows\u002Fconcurrent-collections","01.csharp\u002F07.system-programming-windows\u002F10.concurrent-collections",{"title":332,"path":333,"stem":334},"TPL, Task та Композиція — Від Thread до Task","\u002Fcsharp\u002Fsystem-programming-windows\u002Ftpl-parallel-plinq","01.csharp\u002F07.system-programming-windows\u002F11.tpl-parallel-plinq",{"title":336,"path":337,"stem":338},"Parallel Class та PLINQ — Data Parallelism","\u002Fcsharp\u002Fsystem-programming-windows\u002F11a.tpl-parallel-plinq-advanced","01.csharp\u002F07.system-programming-windows\u002F11a.tpl-parallel-plinq-advanced",{"title":340,"path":341,"stem":342},"Async\u002FAwait — Фундамент Асинхронного Програмування","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-fundamentals","01.csharp\u002F07.system-programming-windows\u002F12.async-fundamentals",{"title":344,"path":345,"stem":346},"SynchronizationContext та ConfigureAwait — Контекст Виконання","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-context-configureawait","01.csharp\u002F07.system-programming-windows\u002F13.async-context-configureawait",{"title":348,"path":349,"stem":350},"Async — Просунуті Паттерни","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-advanced","01.csharp\u002F07.system-programming-windows\u002F14.async-advanced",{"title":352,"path":353,"stem":354},"System.Threading.Channels — Async Producer-Consumer","\u002Fcsharp\u002Fsystem-programming-windows\u002Fchannels","01.csharp\u002F07.system-programming-windows\u002F15.channels",{"title":356,"path":357,"stem":358},"Асинхронна Синхронізація","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-synchronization","01.csharp\u002F07.system-programming-windows\u002F16.async-synchronization",{"title":360,"path":361,"stem":362},"Unsafe Code та Вказівники","\u002Fcsharp\u002Fsystem-programming-windows\u002Funsafe-code","01.csharp\u002F07.system-programming-windows\u002F17.unsafe-code",{"title":364,"path":365,"stem":366},"P\u002FInvoke та Windows API — Міст між .NET та Native Code","\u002Fcsharp\u002Fsystem-programming-windows\u002Fpinvoke-winapi","01.csharp\u002F07.system-programming-windows\u002F18.pinvoke-winapi",{"title":368,"path":369,"stem":370},"Реєстр Windows — Центральна База Конфігурації Системи","\u002Fcsharp\u002Fsystem-programming-windows\u002Fwindows-registry","01.csharp\u002F07.system-programming-windows\u002F19.windows-registry",{"title":372,"path":373,"stem":374},"Windows Hooks, Hotkeys та Services — Глибока Інтеграція з ОС","\u002Fcsharp\u002Fsystem-programming-windows\u002Fwindows-hooks-services","01.csharp\u002F07.system-programming-windows\u002F20.windows-hooks-services",{"title":376,"path":377,"stem":378},"Системне Програмування C# (Windows) — 07.system-programming-windows","\u002Fcsharp\u002Fsystem-programming-windows\u002Fimplementation_plan","01.csharp\u002F07.system-programming-windows\u002Fimplementation_plan",{"title":380,"icon":132,"path":381,"stem":382,"children":383,"page":59},"Io","\u002Fcsharp\u002Fio","01.csharp\u002F08.io",[384,388,392,396,400],{"title":385,"path":386,"stem":387},"8.1.1. Основи роботи з файловою системою","\u002Fcsharp\u002Fio\u002Ffile-system-basics","01.csharp\u002F08.io\u002F01.file-system-basics",{"title":389,"path":390,"stem":391},"8.1.2. Потоки (Streams) та Серіалізація Даних","\u002Fcsharp\u002Fio\u002Fstreams-serialization","01.csharp\u002F08.io\u002F02.streams-serialization",{"title":393,"path":394,"stem":395},"8.2.1. JSON Serialization з System.Text.Json","\u002Fcsharp\u002Fio\u002Fjson-serialization","01.csharp\u002F08.io\u002F03.json-serialization",{"title":397,"path":398,"stem":399},"8.2.2. XML Serialization та LINQ to XML","\u002Fcsharp\u002Fio\u002Fxml-serialization","01.csharp\u002F08.io\u002F04.xml-serialization",{"title":401,"path":402,"stem":403},"8.2.3. Binary Serialization: MessagePack та Protocol Buffers","\u002Fcsharp\u002Fio\u002Fbinary-serialization","01.csharp\u002F08.io\u002F05.binary-serialization",{"title":405,"icon":132,"path":406,"stem":407,"children":408,"page":59},"Ado Net","\u002Fcsharp\u002Fado-net","01.csharp\u002F09.ado-net",[409,413,417,421,425,429,433,437,441,445,449,453],{"title":410,"path":411,"stem":412},"9.1. Введення в ADO.NET","\u002Fcsharp\u002Fado-net\u002Fintroduction-to-adonet","01.csharp\u002F09.ado-net\u002F01.introduction-to-adonet",{"title":414,"path":415,"stem":416},"9.2. Клас DbConnection — з'єднання з базою даних","\u002Fcsharp\u002Fado-net\u002Fconnection","01.csharp\u002F09.ado-net\u002F02.connection",{"title":418,"path":419,"stem":420},"9.3. Клас DbCommand — виконання SQL-запитів","\u002Fcsharp\u002Fado-net\u002Fcommand-and-queries","01.csharp\u002F09.ado-net\u002F03.command-and-queries",{"title":422,"path":423,"stem":424},"9.4. Клас DbDataReader — ефективне читання даних","\u002Fcsharp\u002Fado-net\u002Fdatareader","01.csharp\u002F09.ado-net\u002F04.datareader",{"title":426,"path":427,"stem":428},"9.5. Параметризовані запити та захист від SQL Injection","\u002Fcsharp\u002Fado-net\u002Fparameters-and-sql-injection","01.csharp\u002F09.ado-net\u002F05.parameters-and-sql-injection",{"title":430,"path":431,"stem":432},"9.6. Транзакції в ADO.NET","\u002Fcsharp\u002Fado-net\u002Ftransactions","01.csharp\u002F09.ado-net\u002F06.transactions",{"title":434,"path":435,"stem":436},"9.7. DbProviderFactory — провайдер-незалежний код","\u002Fcsharp\u002Fado-net\u002Fprovider-factory","01.csharp\u002F09.ado-net\u002F07.provider-factory",{"title":438,"path":439,"stem":440},"9.8. Асинхронний доступ до даних","\u002Fcsharp\u002Fado-net\u002Fasync-data-access","01.csharp\u002F09.ado-net\u002F08.async-data-access",{"title":442,"path":443,"stem":444},"9.9. Від'єднаний режим: DataSet, DataTable, DataRow","\u002Fcsharp\u002Fado-net\u002Fdisconnected-mode-dataset","01.csharp\u002F09.ado-net\u002F09.disconnected-mode-dataset",{"title":446,"path":447,"stem":448},"9.10. DataAdapter — міст між DataSet та базою даних","\u002Fcsharp\u002Fado-net\u002Fdata-adapter","01.csharp\u002F09.ado-net\u002F10.data-adapter",{"title":450,"path":451,"stem":452},"9.11. Data Mapper та Repository: Архітектура доступу до даних","\u002Fcsharp\u002Fado-net\u002Fdata-mapper-repository","01.csharp\u002F09.ado-net\u002F11.data-mapper-repository",{"title":454,"path":455,"stem":456},"9.12. Identity Map, Unit of Work та Specification Pattern","\u002Fcsharp\u002Fado-net\u002Fadvanced-patterns","01.csharp\u002F09.ado-net\u002F12.advanced-patterns",{"title":458,"icon":255,"path":459,"stem":460,"children":461,"page":59},"Ef Core","\u002Fcsharp\u002Fef-core","01.csharp\u002F10.ef-core",[462,466,470,474,478,482,486,490,494,498,502,506,510,514,518,522,526,532,538,542,546,550,554,558,562,566,570,574,578,582,586,590,594,598,602,606,610,614,618,622,626,630,634,638,642,646],{"title":463,"path":464,"stem":465},"Що таке ORM? Від SQL до об'єктів","\u002Fcsharp\u002Fef-core\u002Fwhat-is-orm","01.csharp\u002F10.ef-core\u002F01.what-is-orm",{"title":467,"path":468,"stem":469},"Перший проєкт — від нуля до CRUD","\u002Fcsharp\u002Fef-core\u002Ffirst-project","01.csharp\u002F10.ef-core\u002F02.first-project",{"title":471,"path":472,"stem":473},"DbContext — Серце EF Core","\u002Fcsharp\u002Fef-core\u002Fdbcontext-deep-dive","01.csharp\u002F10.ef-core\u002F03.dbcontext-deep-dive",{"title":475,"path":476,"stem":477},"Провайдери баз даних — Архітектура та Вибір СУБД","\u002Fcsharp\u002Fef-core\u002Fdatabase-providers","01.csharp\u002F10.ef-core\u002F04.database-providers",{"title":479,"path":480,"stem":481},"Конвенції EF Core — Магія без конфігурації","\u002Fcsharp\u002Fef-core\u002Fconventions","01.csharp\u002F10.ef-core\u002F05.conventions",{"title":483,"path":484,"stem":485},"Fluent API та Data Annotations — Явна конфігурація моделі","\u002Fcsharp\u002Fef-core\u002Ffluent-api-vs-annotations","01.csharp\u002F10.ef-core\u002F06.fluent-api-vs-annotations",{"title":487,"path":488,"stem":489},"Зв'язки — One-to-One та One-to-Many","\u002Fcsharp\u002Fef-core\u002Frelationships-basics","01.csharp\u002F10.ef-core\u002F07.relationships-basics",{"title":491,"path":492,"stem":493},"Зв'язки Advanced — Many-to-Many та Складні Сценарії","\u002Fcsharp\u002Fef-core\u002Frelationships-advanced","01.csharp\u002F10.ef-core\u002F08.relationships-advanced",{"title":495,"path":496,"stem":497},"Властивості — Типи, Конвертери, Компаратори (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fproperty-configuration-part1","01.csharp\u002F10.ef-core\u002F09.property-configuration-part1",{"title":499,"path":500,"stem":501},"Властивості — Value Comparers, Generators, Shadow Properties (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fproperty-configuration-part2","01.csharp\u002F10.ef-core\u002F09.property-configuration-part2",{"title":503,"path":504,"stem":505},"Складні типи — Owned Types та Complex Types (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fcomplex-types-owned-part1","01.csharp\u002F10.ef-core\u002F10.complex-types-owned-part1",{"title":507,"path":508,"stem":509},"Складні типи — Complex Types, Keyless Entities, Порівняння (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fcomplex-types-owned-part2","01.csharp\u002F10.ef-core\u002F10.complex-types-owned-part2",{"title":511,"path":512,"stem":513},"JSON Columns — Складні дані у JSON (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fjson-columns-part1","01.csharp\u002F10.ef-core\u002F11.json-columns-part1",{"title":515,"path":516,"stem":517},"JSON Columns — Value Comparers, Індекси, Провайдери (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fjson-columns-part2","01.csharp\u002F10.ef-core\u002F11.json-columns-part2",{"title":519,"path":520,"stem":521},"Успадкування — Абстрактні класи та TPH (Частина 1)","\u002Fcsharp\u002Fef-core\u002Finheritance-part1","01.csharp\u002F10.ef-core\u002F12.inheritance-part1",{"title":523,"path":524,"stem":525},"Успадкування — TPT, TPC та Порівняння Стратегій (Частина 2)","\u002Fcsharp\u002Fef-core\u002Finheritance-part2","01.csharp\u002F10.ef-core\u002F12.inheritance-part2",{"title":527,"path":528,"stem":529,"children":530},"Індекси, Обмеження та Схема (Частина 1)","\u002Fcsharp\u002Fef-core\u002Findexes-constraints-part1","01.csharp\u002F10.ef-core\u002F13.indexes-constraints-part1",[531],{"title":527,"path":528,"stem":529},{"title":533,"path":534,"stem":535,"children":536},"Індекси, Обмеження та Схема (Частина 2)","\u002Fcsharp\u002Fef-core\u002Findexes-constraints-part2","01.csharp\u002F10.ef-core\u002F13.indexes-constraints-part2",[537],{"title":533,"path":534,"stem":535},{"title":539,"path":540,"stem":541},"Seed Data — Початкові Дані (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fseeding-part1","01.csharp\u002F10.ef-core\u002F14.seeding-part1",{"title":543,"path":544,"stem":545},"Seed Data — SQL-скрипти, Bogus та Стратегії (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fseeding-part2","01.csharp\u002F10.ef-core\u002F14.seeding-part2",{"title":547,"path":548,"stem":549},"Global Query Filters — Глобальні Фільтри (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fglobal-query-filters-part1","01.csharp\u002F10.ef-core\u002F15.global-query-filters-part1",{"title":551,"path":552,"stem":553},"Global Query Filters — Підводні камені та Інтеграція (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fglobal-query-filters-part2","01.csharp\u002F10.ef-core\u002F15.global-query-filters-part2",{"title":555,"path":556,"stem":557},"LINQ-запити в EF Core (Частина 1)","\u002Fcsharp\u002Fef-core\u002Flinq-queries-part1","01.csharp\u002F10.ef-core\u002F16.linq-queries-part1",{"title":559,"path":560,"stem":561},"LINQ-запити в EF Core (Частина 2)","\u002Fcsharp\u002Fef-core\u002Flinq-queries-part2","01.csharp\u002F10.ef-core\u002F16.linq-queries-part2",{"title":563,"path":564,"stem":565},"Завантаження Пов'язаних Даних (Частина 1)","\u002Fcsharp\u002Fef-core\u002Floading-related-data-part1","01.csharp\u002F10.ef-core\u002F17.loading-related-data-part1",{"title":567,"path":568,"stem":569},"Завантаження Пов'язаних Даних (Частина 2)","\u002Fcsharp\u002Fef-core\u002Floading-related-data-part2","01.csharp\u002F10.ef-core\u002F17.loading-related-data-part2",{"title":571,"path":572,"stem":573},"Raw SQL, Views та Stored Procedures (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fraw-sql-part1","01.csharp\u002F10.ef-core\u002F18.raw-sql-part1",{"title":575,"path":576,"stem":577},"Raw SQL — Stored Procedures, DbFunction та Bulk Operations (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fraw-sql-part2","01.csharp\u002F10.ef-core\u002F18.raw-sql-part2",{"title":579,"path":580,"stem":581},"Продвинуті Запити — Compiled Queries, Bulk та Оптимізація (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fadvanced-queries-part1","01.csharp\u002F10.ef-core\u002F19.advanced-queries-part1",{"title":583,"path":584,"stem":585},"Продвинуті Запити — Query Tags, Bulk та Interceptors (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fadvanced-queries-part2","01.csharp\u002F10.ef-core\u002F19.advanced-queries-part2",{"title":587,"path":588,"stem":589},"Change Tracker — Відстеження Змін (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fchange-tracking-part1","01.csharp\u002F10.ef-core\u002F20.change-tracking-part1",{"title":591,"path":592,"stem":593},"Change Tracker — Графи Об'єктів та Disconnected (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fchange-tracking-part2","01.csharp\u002F10.ef-core\u002F20.change-tracking-part2",{"title":595,"path":596,"stem":597},"Збереження Даних та Транзакції (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fsaving-data-part1","01.csharp\u002F10.ef-core\u002F21.saving-data-part1",{"title":599,"path":600,"stem":601},"Збереження Даних — Concurrency та Outbox (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fsaving-data-part2","01.csharp\u002F10.ef-core\u002F21.saving-data-part2",{"title":603,"path":604,"stem":605},"Конкурентність та Блокування (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fconcurrency-part1","01.csharp\u002F10.ef-core\u002F22.concurrency-part1",{"title":607,"path":608,"stem":609},"Конкурентність — Дедлоки та Queue Processing (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fconcurrency-part2","01.csharp\u002F10.ef-core\u002F22.concurrency-part2",{"title":611,"path":612,"stem":613},"Міграції в EF Core — Основи (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fmigrations-basics-part1","01.csharp\u002F10.ef-core\u002F23.migrations-basics-part1",{"title":615,"path":616,"stem":617},"Міграції в EF Core — Основи (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fmigrations-basics-part2","01.csharp\u002F10.ef-core\u002F23.migrations-basics-part2",{"title":619,"path":620,"stem":621},"Міграції — Просунуті Сценарії (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fmigrations-advanced-part1","01.csharp\u002F10.ef-core\u002F24.migrations-advanced-part1",{"title":623,"path":624,"stem":625},"Міграції — Просунуті Сценарії (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fmigrations-advanced-part2","01.csharp\u002F10.ef-core\u002F24.migrations-advanced-part2",{"title":627,"path":628,"stem":629},"Управління Схемою та Database-First (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fschema-management-part1","01.csharp\u002F10.ef-core\u002F25.schema-management-part1",{"title":631,"path":632,"stem":633},"Управління Схемою та Database-First (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fschema-management-part2","01.csharp\u002F10.ef-core\u002F25.schema-management-part2",{"title":635,"path":636,"stem":637},"Продуктивність EF Core — Основи (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fperformance-fundamentals-part1","01.csharp\u002F10.ef-core\u002F26.performance-fundamentals-part1",{"title":639,"path":640,"stem":641},"Interceptors в EF Core (Частина 1)","\u002Fcsharp\u002Fef-core\u002Finterceptors-part1","01.csharp\u002F10.ef-core\u002F29.interceptors-part1",{"title":643,"path":644,"stem":645},"Interceptors в EF Core — Connection, Transaction та Materialization (Частина 2)","\u002Fcsharp\u002Fef-core\u002Finterceptors-part2","01.csharp\u002F10.ef-core\u002F29.interceptors-part2",{"title":647,"path":648,"stem":649},"План вивчення Entity Framework Core — Повний курс","\u002Fcsharp\u002Fef-core\u002Fimplementation_plan","01.csharp\u002F10.ef-core\u002Fimplementation_plan",{"title":651,"icon":652,"path":653,"stem":654,"children":655,"page":59},"ASP.NET","i-devicon-dotnetcore","\u002Fcsharp\u002Faspnet","01.csharp\u002F11.aspnet",[656,730,791,869,927,941,967,1057,1111,1182,1212,1289,1346],{"title":657,"icon":658,"path":659,"stem":660,"children":661,"page":59},"Minimal API","i-lucide-network","\u002Fcsharp\u002Faspnet\u002Fminimal-api","01.csharp\u002F11.aspnet\u002F01.minimal-api",[662,666,670,674,678,682,686,690,694,698,702,706,710,714,718,722,726],{"title":663,"path":664,"stem":665},"Вступ до ASP.NET та еволюція фреймворку","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fintroduction","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F01.introduction",{"title":667,"path":668,"stem":669},"Перший додаток на ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Ffirst-application","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F02.first-application",{"title":671,"path":672,"stem":673},"WebApplication, Builder та Dependency Injection","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fwebapplication-builder","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F03.webapplication-builder",{"title":675,"path":676,"stem":677},"Конвеєр запитів та Middleware","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Frequest-pipeline-middleware","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F04.request-pipeline-middleware",{"title":679,"path":680,"stem":681},"Маршрутизація в ASP.NET Core: Основи","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Frouting-basics","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F05.routing-basics",{"title":683,"path":684,"stem":685},"Маршрутизація в ASP.NET Core: Розширені можливості","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Frouting-advanced","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F06.routing-advanced",{"title":687,"path":688,"stem":689},"Статичні файли в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fstatic-files","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F07.static-files",{"title":691,"path":692,"stem":693},"Статичні Активи: MapStaticAssets (ASP.NET Core 9.0)","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fstatic-assets","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F08.static-assets",{"title":695,"path":696,"stem":697},"Конфігурація в ASP.NET Core: Основи","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fconfiguration-fundamentals","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F09.configuration-fundamentals",{"title":699,"path":700,"stem":701},"Конфігурація: Паттерн Options","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fconfiguration-options","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F10.configuration-options",{"title":703,"path":704,"stem":705},"Логування в ASP.NET Core: Основи","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Flogging-basics","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F11.logging-basics",{"title":707,"path":708,"stem":709},"Логування: Serilog та Middleware","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Flogging-advanced","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F12.logging-advanced",{"title":711,"path":712,"stem":713},"Управління станом: HttpContext.Items та Cookies","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fstate-management","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F13.state-management",{"title":715,"path":716,"stem":717},"Стан сесії: Sessions","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fsession-state","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F14.session-state",{"title":719,"path":720,"stem":721},"Структура проєкту: від хаосу до архітектури","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fproject-structure","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F15.project-structure",{"title":723,"path":724,"stem":725},"Scalar у Minimal API: повний проєкт і Fluent OpenAPI","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fscalar-openapi-fluent","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F16.scalar-openapi-fluent",{"title":727,"path":728,"stem":729},"Swagger \u002F Swashbuckle у Minimal API: окремий класичний шлях","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fswagger-swashbuckle","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F17.swagger-swashbuckle",{"title":731,"icon":658,"path":732,"stem":733,"children":734,"page":59},"API","\u002Fcsharp\u002Faspnet\u002Fapi","01.csharp\u002F11.aspnet\u002F02.api",[735,739,743,747,751,755,759,763,767,771,775,779,783,787],{"title":736,"path":737,"stem":738},"Що таке API. Клієнт-серверна архітектура","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fwhat-is-api","01.csharp\u002F11.aspnet\u002F02.api\u002F01.what-is-api",{"title":740,"path":741,"stem":742},"Формати даних: JSON, XML, TOML та бінарні формати","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fdata-formats","01.csharp\u002F11.aspnet\u002F02.api\u002F02.data-formats",{"title":744,"path":745,"stem":746},"Парадигми API та концепція REST","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-paradigms-rest","01.csharp\u002F11.aspnet\u002F02.api\u002F03.api-paradigms-rest",{"title":748,"path":749,"stem":750},"HTTP-методи, статус-коди та заголовки","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fhttp-methods-status-codes","01.csharp\u002F11.aspnet\u002F02.api\u002F04.http-methods-status-codes",{"title":752,"path":753,"stem":754},"Організація HTTP API за принципами REST","\u002Fcsharp\u002Faspnet\u002Fapi\u002Frest-organizing","01.csharp\u002F11.aspnet\u002F02.api\u002F05.rest-organizing",{"title":756,"path":757,"stem":758},"Номенклатура URL та CRUD-операції","\u002Fcsharp\u002Faspnet\u002Fapi\u002Furl-nomenclature-crud","01.csharp\u002F11.aspnet\u002F02.api\u002F06.url-nomenclature-crud",{"title":760,"path":761,"stem":762},"Правила дизайну: іменування та стандарти","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-design-naming","01.csharp\u002F11.aspnet\u002F02.api\u002F07.api-design-naming",{"title":764,"path":765,"stem":766},"Валідація, ліміти та обробка помилок","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-design-validation","01.csharp\u002F11.aspnet\u002F02.api\u002F08.api-design-validation",{"title":768,"path":769,"stem":770},"Обробка помилок у Minimal API","\u002Fcsharp\u002Faspnet\u002Fapi\u002Ferror-handling-http","01.csharp\u002F11.aspnet\u002F02.api\u002F09.error-handling-http",{"title":772,"path":773,"stem":774},"Ідемпотентність та синхронізація стану","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fidempotency-sync","01.csharp\u002F11.aspnet\u002F02.api\u002F10.idempotency-sync",{"title":776,"path":777,"stem":778},"Пагінація та організація списків","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fpagination-lists","01.csharp\u002F11.aspnet\u002F02.api\u002F11.pagination-lists",{"title":780,"path":781,"stem":782},"Безпека API, кешування та інтернаціоналізація","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fsecurity-auth","01.csharp\u002F11.aspnet\u002F02.api\u002F12.security-auth",{"title":784,"path":785,"stem":786},"Процес проєктування API та документування","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-design-process","01.csharp\u002F11.aspnet\u002F02.api\u002F13.api-design-process",{"title":788,"path":789,"stem":790},"OpenAPI: контракт, специфікація та документація API","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fopenapi","01.csharp\u002F11.aspnet\u002F02.api\u002F14.openapi",{"title":792,"icon":793,"path":794,"stem":795,"children":796,"page":59},"Auth","i-lucide-shield-check","\u002Fcsharp\u002Faspnet\u002Fauth","01.csharp\u002F11.aspnet\u002F03.auth",[797,801,805,809,813,817,821,825,829,833,837,841,845,849,853,857,861,865],{"title":798,"path":799,"stem":800},"Основи аутентифікації та авторизації","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fauth-fundamentals","01.csharp\u002F11.aspnet\u002F03.auth\u002F01.auth-fundamentals",{"title":802,"path":803,"stem":804},"JWT-аутентифікація","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fjwt-authentication","01.csharp\u002F11.aspnet\u002F03.auth\u002F02.jwt-authentication",{"title":806,"path":807,"stem":808},"Авторизація: ролі, політики та resource-based доступ","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fauthorization-policies","01.csharp\u002F11.aspnet\u002F03.auth\u002F03.authorization-policies",{"title":810,"path":811,"stem":812},"Cookie-аутентифікація та ASP.NET Core Identity","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fcookie-auth-identity","01.csharp\u002F11.aspnet\u002F03.auth\u002F04.cookie-auth-identity",{"title":814,"path":815,"stem":816},"JWT + Refresh Tokens (HttpOnly Cookie)","\u002Fcsharp\u002Faspnet\u002Fauth\u002F04b.identity-auth-jwt","01.csharp\u002F11.aspnet\u002F03.auth\u002F04b.identity-auth-jwt",{"title":818,"path":819,"stem":820},"Identity: Підтвердження Email та Скидання Пароля","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fidentity-email-confirmation","01.csharp\u002F11.aspnet\u002F03.auth\u002F05.identity-email-confirmation",{"title":822,"path":823,"stem":824},"Identity: Двофакторна Аутентифікація (2FA)","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fidentity-two-factor","01.csharp\u002F11.aspnet\u002F03.auth\u002F06.identity-two-factor",{"title":826,"path":827,"stem":828},"Identity: Внутрішня Архітектура та Кастомізація","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fidentity-internals","01.csharp\u002F11.aspnet\u002F03.auth\u002F07.identity-internals",{"title":830,"path":831,"stem":832},"OAuth 2.0 та зовнішні провайдери","\u002Fcsharp\u002Faspnet\u002Fauth\u002Foauth-external-providers","01.csharp\u002F11.aspnet\u002F03.auth\u002F08.oauth-external-providers",{"title":834,"path":835,"stem":836},"Безпека на практиці: CORS, HTTPS та захист від атак","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fsecurity-hardening","01.csharp\u002F11.aspnet\u002F03.auth\u002F09.security-hardening",{"title":838,"path":839,"stem":840},"Теорія OAuth 2.0: Поняття, Аналогії та Флоу","\u002Fcsharp\u002Faspnet\u002Fauth\u002Foauth-theory","01.csharp\u002F11.aspnet\u002F03.auth\u002F10.oauth-theory",{"title":842,"path":843,"stem":844},"OIDC, OAuth 2.0 та Keycloak в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Foidc-keycloak","01.csharp\u002F11.aspnet\u002F03.auth\u002F10.oidc-keycloak",{"title":846,"path":847,"stem":848},"API Keys аутентифікація в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fapi-keys","01.csharp\u002F11.aspnet\u002F03.auth\u002F11.api-keys",{"title":850,"path":851,"stem":852},"Rate Limiting та Throttling в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Frate-limiting","01.csharp\u002F11.aspnet\u002F03.auth\u002F12.rate-limiting",{"title":854,"path":855,"stem":856},"Refresh Token Rotation в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Frefresh-token-rotation","01.csharp\u002F11.aspnet\u002F03.auth\u002F13.refresh-token-rotation",{"title":858,"path":859,"stem":860},"Certificate Authentication та mTLS в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fcertificate-auth","01.csharp\u002F11.aspnet\u002F03.auth\u002F14.certificate-auth",{"title":862,"path":863,"stem":864},"RBAC, ABAC та ReBAC в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Frbac-abac-rebac","01.csharp\u002F11.aspnet\u002F03.auth\u002F15.rbac-abac-rebac",{"title":866,"path":867,"stem":868},"Multi-tenancy та ізоляція даних в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fmulti-tenancy","01.csharp\u002F11.aspnet\u002F03.auth\u002F16.multi-tenancy",{"title":870,"icon":871,"path":872,"stem":873,"children":874,"page":59},"Нотифікації","i-lucide-bell","\u002Fcsharp\u002Faspnet\u002Fnotifications","01.csharp\u002F11.aspnet\u002F04.notifications",[875,879,883,887,891,895,899,903,907,911,915,919,923],{"title":876,"path":877,"stem":878},"In-App нотифікації через базу даних","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fin-app-database-notifications","01.csharp\u002F11.aspnet\u002F04.notifications\u002F01.in-app-database-notifications",{"title":880,"path":881,"stem":882},"Polling: Регулярний запит оновлень","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fpolling","01.csharp\u002F11.aspnet\u002F04.notifications\u002F02.polling",{"title":884,"path":885,"stem":886},"Server-Sent Events: Однострімовий push від сервера","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fserver-sent-events","01.csharp\u002F11.aspnet\u002F04.notifications\u002F03.server-sent-events",{"title":888,"path":889,"stem":890},"WebSockets: Двостороннє з'єднання в реальному часі","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fwebsockets","01.csharp\u002F11.aspnet\u002F04.notifications\u002F04.websockets",{"title":892,"path":893,"stem":894},"SignalR: Абстракція над транспортами реального часу","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fsignalr","01.csharp\u002F11.aspnet\u002F04.notifications\u002F05.signalr",{"title":896,"path":897,"stem":898},"Background Services: Фонові задачі в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fbackground-services","01.csharp\u002F11.aspnet\u002F04.notifications\u002F06.background-services",{"title":900,"path":901,"stem":902},"Web Push нотифікації","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fweb-push","01.csharp\u002F11.aspnet\u002F04.notifications\u002F07.web-push",{"title":904,"path":905,"stem":906},"Email нотифікації","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Femail-notifications","01.csharp\u002F11.aspnet\u002F04.notifications\u002F08.email-notifications",{"title":908,"path":909,"stem":910},"Порівняння підходів: Як вибрати правильну технологію нотифікацій","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fchoosing-the-right-approach","01.csharp\u002F11.aspnet\u002F04.notifications\u002F09.choosing-the-right-approach",{"title":912,"path":913,"stem":914},"Hangfire: Надійне планування фонових задач","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fhangfire","01.csharp\u002F11.aspnet\u002F04.notifications\u002F10.hangfire",{"title":916,"path":917,"stem":918},"Практика: Конвертація зображень у WebP через Hangfire","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fhangfire-image-webp","01.csharp\u002F11.aspnet\u002F04.notifications\u002F11.hangfire-image-webp",{"title":920,"path":921,"stem":922},"Практика: Підготовка відео до HLS-стрімінгу через Hangfire","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fhangfire-video-hls","01.csharp\u002F11.aspnet\u002F04.notifications\u002F12.hangfire-video-hls",{"title":924,"path":925,"stem":926},"Telegram-нотифікації: від одного повідомлення до масових розсилок і мульти-канального підходу","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Ftelegram-notifications","01.csharp\u002F11.aspnet\u002F04.notifications\u002F13.telegram-notifications",{"title":928,"icon":929,"path":930,"stem":931,"children":932,"page":59},"Інтернаціоналізація","i-lucide-languages","\u002Fcsharp\u002Faspnet\u002Fi18n","01.csharp\u002F11.aspnet\u002F05.i18n",[933,937],{"title":934,"path":935,"stem":936},"Інтернаціоналізація (i18n) у Minimal API: від A до Я","\u002Fcsharp\u002Faspnet\u002Fi18n\u002Finternationalization","01.csharp\u002F11.aspnet\u002F05.i18n\u002F01.internationalization",{"title":938,"path":939,"stem":940},"Humanizer: людиномовні рядки у .NET","\u002Fcsharp\u002Faspnet\u002Fi18n\u002Fhumanizer","01.csharp\u002F11.aspnet\u002F05.i18n\u002F02.humanizer",{"title":942,"icon":943,"path":944,"stem":945,"children":946,"page":59},"Кешування","i-lucide-layers","\u002Fcsharp\u002Faspnet\u002Fcaching","01.csharp\u002F11.aspnet\u002F06.caching",[947,951,955,959,963],{"title":948,"path":949,"stem":950},"Огляд кешування: чотири рівні і коли що обирати","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fcaching","01.csharp\u002F11.aspnet\u002F06.caching\u002F01.caching",{"title":952,"path":953,"stem":954},"IMemoryCache: кеш в оперативній пам'яті","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fmemory-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F02.memory-cache",{"title":956,"path":957,"stem":958},"IDistributedCache і Redis: розподілений кеш","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fdistributed-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F03.distributed-cache",{"title":960,"path":961,"stem":962},"Response Cache: HTTP-кешування через Cache-Control","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fresponse-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F04.response-cache",{"title":964,"path":965,"stem":966},"Output Cache: серверний кеш HTTP-відповідей (.NET 7+)","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Foutput-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F05.output-cache",{"title":968,"icon":969,"path":970,"stem":971,"children":972,"page":59},"Тестування","i-lucide-test-tube","\u002Fcsharp\u002Faspnet\u002Ftesting","01.csharp\u002F11.aspnet\u002F07.testing",[973,977,981,985,989,993,997,1001,1005,1009,1013,1017,1021,1025,1029,1033,1037,1041,1045,1049,1053],{"title":974,"path":975,"stem":976},"Що таке тестування? Від інтуїції до науки","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fwhat-is-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F01.what-is-testing",{"title":978,"path":979,"stem":980},"Піраміда тестування — Стратегія, а не Догма","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftesting-pyramid","01.csharp\u002F11.aspnet\u002F07.testing\u002F02.testing-pyramid",{"title":982,"path":983,"stem":984},"Дві Школи Тестування — Лондон проти Детройту","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftesting-schools","01.csharp\u002F11.aspnet\u002F07.testing\u002F03.testing-schools",{"title":986,"path":987,"stem":988},"TDD та BDD — Тести як Дизайн-інструмент","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftdd-and-bdd","01.csharp\u002F11.aspnet\u002F07.testing\u002F04.tdd-and-bdd",{"title":990,"path":991,"stem":992},"Що саме тестувати — Техніки аналізу та Циклomatична складність","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fwhat-to-test","01.csharp\u002F11.aspnet\u002F07.testing\u002F05.what-to-test",{"title":994,"path":995,"stem":996},"Тестові Фреймворки — Навіщо вони і що всередині","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftest-frameworks","01.csharp\u002F11.aspnet\u002F07.testing\u002F06.test-frameworks",{"title":998,"path":999,"stem":1000},"xUnit — Факти, Теорії та Lifecycle тестів","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fxunit-basics","01.csharp\u002F11.aspnet\u002F07.testing\u002F07.xunit-basics",{"title":1002,"path":1003,"stem":1004},"xUnit Advanced — Fixtures, Кастомізація та Розширення","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fxunit-advanced","01.csharp\u002F11.aspnet\u002F07.testing\u002F08.xunit-advanced",{"title":1006,"path":1007,"stem":1008},"Moq — Глибоке занурення в мокування","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fmocking-with-moq","01.csharp\u002F11.aspnet\u002F07.testing\u002F09.mocking-with-moq",{"title":1010,"path":1011,"stem":1012},"Тестування Баз Даних — EF Core, SQLite та Testcontainers","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fdatabase-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F10.database-testing",{"title":1014,"path":1015,"stem":1016},"Integration Testing — Частина 1 [Теорія та WebApplicationFactory]","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fintegration-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F11.integration-testing",{"title":1018,"path":1019,"stem":1020},"Інтеграційне тестування — Практика","\u002Fcsharp\u002Faspnet\u002Ftesting\u002F11a.integration-testing-practice","01.csharp\u002F11.aspnet\u002F07.testing\u002F11a.integration-testing-practice",{"title":1022,"path":1023,"stem":1024},"Integration Testing — Частина 2 [Просунуті Сценарії та Testcontainers]","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fintegration-testing-advanced","01.csharp\u002F11.aspnet\u002F07.testing\u002F12.integration-testing-advanced",{"title":1026,"path":1027,"stem":1028},"Професійний Postman: Колекції, Змінні та GitHub Інтеграція","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fpostman-professional","01.csharp\u002F11.aspnet\u002F07.testing\u002F13.postman-professional",{"title":1030,"path":1031,"stem":1032},"HttpClient у Тестах Частина 1: Архітектура та MockHttpMessageHandler","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fhttpclient-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F14.httpclient-testing",{"title":1034,"path":1035,"stem":1036},"HttpClient у Тестах Частина 2: WireMock.Net та Resilience","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fwiremock-net","01.csharp\u002F11.aspnet\u002F07.testing\u002F15.wiremock-net",{"title":1038,"path":1039,"stem":1040},"Патерни та Анти-патерни Тестування: Test Smells","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftesting-patterns","01.csharp\u002F11.aspnet\u002F07.testing\u002F16.testing-patterns",{"title":1042,"path":1043,"stem":1044},"Просунуті інструменти: Time, Snapshots та Властивості","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fadvanced-testing-tools","01.csharp\u002F11.aspnet\u002F07.testing\u002F17.advanced-testing-tools",{"title":1046,"path":1047,"stem":1048},"Тестування Архітектури з NetArchTest","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Farchitecture-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F18.architecture-testing",{"title":1050,"path":1051,"stem":1052},"Тестування Продуктивності: BenchmarkDotNet, NBomber та k6","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fperformance-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F19.performance-testing",{"title":1054,"path":1055,"stem":1056},"Залишок плану для курсу \"Тестування ASP.NET Minimal API\"","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fremaining_plan","01.csharp\u002F11.aspnet\u002F07.testing\u002Fremaining_plan",{"title":1058,"icon":1059,"path":1060,"stem":1061,"children":1062,"page":59},"Платежі","i-lucide-credit-card","\u002Fcsharp\u002Faspnet\u002Fpayments","01.csharp\u002F11.aspnet\u002F08.payments",[1063,1067,1071,1075,1079,1083,1087,1091,1095,1099,1103,1107],{"title":1064,"path":1065,"stem":1066},"Основи платіжної інфраструктури","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpayment-fundamentals","01.csharp\u002F11.aspnet\u002F08.payments\u002F01.payment-fundamentals",{"title":1068,"path":1069,"stem":1070},"Методи оплати в Україні","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpayment-methods-ukraine","01.csharp\u002F11.aspnet\u002F08.payments\u002F02.payment-methods-ukraine",{"title":1072,"path":1073,"stem":1074},"PCI DSS та безпека платежів","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpci-dss-security","01.csharp\u002F11.aspnet\u002F08.payments\u002F03.pci-dss-security",{"title":1076,"path":1077,"stem":1078},"Архітектура платіжної підсистеми","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpayment-architecture","01.csharp\u002F11.aspnet\u002F08.payments\u002F04.payment-architecture",{"title":1080,"path":1081,"stem":1082},"Інтеграція LiqPay (ПриватБанк)","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fliqpay-integration","01.csharp\u002F11.aspnet\u002F08.payments\u002F05.liqpay-integration",{"title":1084,"path":1085,"stem":1086},"Інтеграція Monobank Acquiring API","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fmonobank-acquiring","01.csharp\u002F11.aspnet\u002F08.payments\u002F06.monobank-acquiring",{"title":1088,"path":1089,"stem":1090},"Інтеграція Stripe","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fstripe-integration","01.csharp\u002F11.aspnet\u002F08.payments\u002F07.stripe-integration",{"title":1092,"path":1093,"stem":1094},"Webhooks — глибоке занурення","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fwebhooks-deep-dive","01.csharp\u002F11.aspnet\u002F08.payments\u002F08.webhooks-deep-dive",{"title":1096,"path":1097,"stem":1098},"Підписки та рекурентні платежі","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fsubscriptions-recurring","01.csharp\u002F11.aspnet\u002F08.payments\u002F09.subscriptions-recurring",{"title":1100,"path":1101,"stem":1102},"Повернення коштів та диспути","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Frefunds-disputes","01.csharp\u002F11.aspnet\u002F08.payments\u002F10.refunds-disputes",{"title":1104,"path":1105,"stem":1106},"Тестування платіжних інтеграцій","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Ftesting-payments","01.csharp\u002F11.aspnet\u002F08.payments\u002F11.testing-payments",{"title":1108,"path":1109,"stem":1110},"Чекліст виходу в Production","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fproduction-checklist","01.csharp\u002F11.aspnet\u002F08.payments\u002F12.production-checklist",{"title":1112,"icon":1113,"items":1114,"path":1127,"stem":1128,"children":1129,"page":59},"Популярні бібліотеки","lucide:box",[1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126],"01.fluent-validation","02.mapster","03.erroror-result-pattern","04.serilog","05.mediatr","06.polly","07.health-checks","08.feature-management","09.fluent-email","10.quest-pdf","11.bogus","12.humanizer-guard","\u002Fcsharp\u002Faspnet\u002Flibraries","01.csharp\u002F11.aspnet\u002F09.libraries",[1130,1134,1138,1142,1146,1150,1154,1158,1162,1166,1170,1174,1178],{"title":1131,"path":1132,"stem":1133},"Валідація з FluentValidation в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ffluent-validation","01.csharp\u002F11.aspnet\u002F09.libraries\u002F01.fluent-validation",{"title":1135,"path":1136,"stem":1137},"Маппінг об","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fmapster","01.csharp\u002F11.aspnet\u002F09.libraries\u002F02.mapster",{"title":1139,"path":1140,"stem":1141},"Обробка помилок з ErrorOr та Result Pattern в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ferroror-result-pattern","01.csharp\u002F11.aspnet\u002F09.libraries\u002F03.erroror-result-pattern",{"title":1143,"path":1144,"stem":1145},"Структуроване логування з Serilog в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fserilog","01.csharp\u002F11.aspnet\u002F09.libraries\u002F04.serilog",{"title":1147,"path":1148,"stem":1149},"CQRS та Mediator з MediatR в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fmediatr","01.csharp\u002F11.aspnet\u002F09.libraries\u002F05.mediatr",{"title":1151,"path":1152,"stem":1153},"Відмовостійкість з Polly в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fpolly","01.csharp\u002F11.aspnet\u002F09.libraries\u002F06.polly",{"title":1155,"path":1156,"stem":1157},"Health Checks в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fhealth-checks","01.csharp\u002F11.aspnet\u002F09.libraries\u002F07.health-checks",{"title":1159,"path":1160,"stem":1161},"Feature Management та Feature Flags в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ffeature-management","01.csharp\u002F11.aspnet\u002F09.libraries\u002F08.feature-management",{"title":1163,"path":1164,"stem":1165},"Відправка Email з FluentEmail в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ffluent-email","01.csharp\u002F11.aspnet\u002F09.libraries\u002F09.fluent-email",{"title":1167,"path":1168,"stem":1169},"Генерація PDF з QuestPDF в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fquest-pdf","01.csharp\u002F11.aspnet\u002F09.libraries\u002F10.quest-pdf",{"title":1171,"path":1172,"stem":1173},"Генерація тестових даних з Bogus в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fbogus","01.csharp\u002F11.aspnet\u002F09.libraries\u002F11.bogus",{"title":1175,"path":1176,"stem":1177},"Humanizer та Guard Clauses в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fhumanizer-guard","01.csharp\u002F11.aspnet\u002F09.libraries\u002F12.humanizer-guard",{"title":1179,"path":1180,"stem":1181},"План модуля 10.libraries — Популярні бібліотеки ASP.NET","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fplan","01.csharp\u002F11.aspnet\u002F09.libraries\u002Fplan",{"title":1183,"icon":1184,"path":1185,"stem":1186,"children":1187,"page":59},"Razor Pages","i-lucide-layout-template","\u002Fcsharp\u002Faspnet\u002Frazor-pages","01.csharp\u002F11.aspnet\u002F10.razor-pages",[1188,1192,1196,1200,1204,1208],{"title":1189,"path":1190,"stem":1191},"Від Minimal API до Razor Pages: концептуальний перехід","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Ffrom-minimal-api","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F01.from-minimal-api",{"title":1193,"path":1194,"stem":1195},"PageModel: логіка сторінки Razor Pages","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Fpage-model","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F02.page-model",{"title":1197,"path":1198,"stem":1199},"Razor синтаксис: шаблонізатор у .cshtml","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Frazor-syntax","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F03.razor-syntax",{"title":1201,"path":1202,"stem":1203},"Tag Helpers: типізований HTML","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Ftag-helpers","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F04.tag-helpers",{"title":1205,"path":1206,"stem":1207},"Форми і валідація: повний цикл обробки даних","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Fforms-validation","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F05.forms-validation",{"title":1209,"path":1210,"stem":1211},"Практичний проєкт: TaskManager на Razor Pages","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Fproject-task-manager","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F06.project-task-manager",{"title":1213,"path":1214,"stem":1215,"children":1216,"page":59},"ASP.NET Core MVC","\u002Fcsharp\u002Faspnet\u002Fmvc","01.csharp\u002F11.aspnet\u002F11.mvc",[1217,1221,1225,1229,1233,1237,1241,1245,1249,1253,1257,1261,1265,1269,1273,1277,1281,1285],{"title":1218,"path":1219,"stem":1220},"Патерн MVC: архітектура, що змінила веб","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fmvc-pattern","01.csharp\u002F11.aspnet\u002F11.mvc\u002F01.mvc-pattern",{"title":1222,"path":1223,"stem":1224},"Від Razor Pages до MVC: концептуальний перехід","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Ffrom-razor-pages","01.csharp\u002F11.aspnet\u002F11.mvc\u002F02.from-razor-pages",{"title":1226,"path":1227,"stem":1228},"Controllers та Actions: серце MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fcontrollers-actions","01.csharp\u002F11.aspnet\u002F11.mvc\u002F03.controllers-actions",{"title":1230,"path":1231,"stem":1232},"Маршрутизація в MVC: Convention vs Attribute Routing","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Frouting-mvc","01.csharp\u002F11.aspnet\u002F11.mvc\u002F04.routing-mvc",{"title":1234,"path":1235,"stem":1236},"Model Binding: від HTTP до C#","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fmodel-binding","01.csharp\u002F11.aspnet\u002F11.mvc\u002F05.model-binding",{"title":1238,"path":1239,"stem":1240},"Views, ViewData, ViewBag, TempData і ViewModel","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fviews-viewdata-tempdata","01.csharp\u002F11.aspnet\u002F11.mvc\u002F06.views-viewdata-tempdata",{"title":1242,"path":1243,"stem":1244},"Filters: аспектно-орієнтоване програмування в MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Ffilters","01.csharp\u002F11.aspnet\u002F11.mvc\u002F07.filters",{"title":1246,"path":1247,"stem":1248},"Areas: структурування великих застосунків","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fareas","01.csharp\u002F11.aspnet\u002F11.mvc\u002F08.areas",{"title":1250,"path":1251,"stem":1252},"View Components: повторювані незалежні блоки UI","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fview-components","01.csharp\u002F11.aspnet\u002F11.mvc\u002F09.view-components",{"title":1254,"path":1255,"stem":1256},"Display та Editor Templates","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fdisplay-editor-templates","01.csharp\u002F11.aspnet\u002F11.mvc\u002F10.display-editor-templates",{"title":1258,"path":1259,"stem":1260},"Валідація: IValidatableObject та FluentValidation","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fvalidation-advanced","01.csharp\u002F11.aspnet\u002F11.mvc\u002F11.validation-advanced",{"title":1262,"path":1263,"stem":1264},"HTMX: інтерактивність через HTML-атрибути","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fhtmx","01.csharp\u002F11.aspnet\u002F11.mvc\u002F12.htmx",{"title":1266,"path":1267,"stem":1268},"HTMX у ASP.NET Core MVC: серверна інтеграція","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fajax-htmx-mvc","01.csharp\u002F11.aspnet\u002F11.mvc\u002F13.ajax-htmx-mvc",{"title":1270,"path":1271,"stem":1272},"Практичний проєкт: Каталог товарів з HTMX","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fhtmx-project","01.csharp\u002F11.aspnet\u002F11.mvc\u002F14.htmx-project",{"title":1274,"path":1275,"stem":1276},"Завантаження та обробка файлів","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Ffile-upload","01.csharp\u002F11.aspnet\u002F11.mvc\u002F15.file-upload",{"title":1278,"path":1279,"stem":1280},"Глобалізація та Локалізація MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fglobalization-localization","01.csharp\u002F11.aspnet\u002F11.mvc\u002F16.globalization-localization",{"title":1282,"path":1283,"stem":1284},"Підсумковий проєкт: Блог-платформа","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fmvc-project","01.csharp\u002F11.aspnet\u002F11.mvc\u002F17.mvc-project",{"title":1286,"path":1287,"stem":1288},"План курсу: ASP.NET Core MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fplan","01.csharp\u002F11.aspnet\u002F11.mvc\u002Fplan",{"title":1290,"path":1291,"stem":1292,"children":1293,"page":59},"Web Api","\u002Fcsharp\u002Faspnet\u002Fweb-api","01.csharp\u002F11.aspnet\u002F12.web-api",[1294,1298,1302,1306,1310,1314,1318,1322,1326,1330,1334,1338,1342],{"title":1295,"path":1296,"stem":1297},"Від Minimal API до Controller-based API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Ffrom-minimal-api-to-controllers","01.csharp\u002F11.aspnet\u002F12.web-api\u002F01.from-minimal-api-to-controllers",{"title":1299,"path":1300,"stem":1301},"ControllerBase, ActionResult\u003CT> та Response Types","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fcontroller-base-actionresult","01.csharp\u002F11.aspnet\u002F12.web-api\u002F02.controller-base-actionresult",{"title":1303,"path":1304,"stem":1305},"Content Negotiation - JSON, XML та власні форматери","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fcontent-negotiation","01.csharp\u002F11.aspnet\u002F12.web-api\u002F03.content-negotiation",{"title":1307,"path":1308,"stem":1309},"Версіонування API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fapi-versioning","01.csharp\u002F11.aspnet\u002F12.web-api\u002F04.api-versioning",{"title":1311,"path":1312,"stem":1313},"ProblemDetails та структурована обробка помилок","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fproblemdetails-error-handling","01.csharp\u002F11.aspnet\u002F12.web-api\u002F05.problemdetails-error-handling",{"title":1315,"path":1316,"stem":1317},"Фільтри у Web API контексті","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Ffilters-for-api","01.csharp\u002F11.aspnet\u002F12.web-api\u002F06.filters-for-api",{"title":1319,"path":1320,"stem":1321},"Пагінація, фільтрація та сортування","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fpagination-filtering-sorting","01.csharp\u002F11.aspnet\u002F12.web-api\u002F07.pagination-filtering-sorting",{"title":1323,"path":1324,"stem":1325},"HATEOAS та Resource Expansion","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fhateoas-resource-expansion","01.csharp\u002F11.aspnet\u002F12.web-api\u002F08.hateoas-resource-expansion",{"title":1327,"path":1328,"stem":1329},"Гібридна архітектура - Minimal API + Controllers","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fminimal-api-vs-controllers-hybrid","01.csharp\u002F11.aspnet\u002F12.web-api\u002F09.minimal-api-vs-controllers-hybrid",{"title":1331,"path":1332,"stem":1333},"Документація API - Swashbuckle, NSwag та генерація клієнтів","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fapi-documentation-generation","01.csharp\u002F11.aspnet\u002F12.web-api\u002F10.api-documentation-generation",{"title":1335,"path":1336,"stem":1337},"Health Checks та моніторинг API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fhealth-checks-monitoring","01.csharp\u002F11.aspnet\u002F12.web-api\u002F11.health-checks-monitoring",{"title":1339,"path":1340,"stem":1341},"Підсумковий проєкт - Production-Ready REST API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fweb-api-project","01.csharp\u002F11.aspnet\u002F12.web-api\u002F12.web-api-project",{"title":1343,"path":1344,"stem":1345},"План курсу: ASP.NET Core Web API (Controllers)","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fplan","01.csharp\u002F11.aspnet\u002F12.web-api\u002Fplan",{"title":1347,"icon":1348,"path":1349,"stem":1350,"children":1351,"page":59},"Моніторинг","i-lucide-activity","\u002Fcsharp\u002Faspnet\u002Fmonitoring","01.csharp\u002F11.aspnet\u002F13.monitoring",[1352,1356,1360],{"title":1353,"path":1354,"stem":1355},"Спостережуваність: від console.log до production-систем","\u002Fcsharp\u002Faspnet\u002Fmonitoring\u002Fobservability-intro","01.csharp\u002F11.aspnet\u002F13.monitoring\u002F01.observability-intro",{"title":1357,"path":1358,"stem":1359},"Health Checks: перший рівень observability","\u002Fcsharp\u002Faspnet\u002Fmonitoring\u002Fhealth-checks","01.csharp\u002F11.aspnet\u002F13.monitoring\u002F02.health-checks",{"title":1361,"path":1362,"stem":1363},"Вбудовані метрики .NET 10 та System.Diagnostics.Metrics","\u002Fcsharp\u002Faspnet\u002Fmonitoring\u002Fdotnet-metrics","01.csharp\u002F11.aspnet\u002F13.monitoring\u002F03.dotnet-metrics",{"title":1365,"icon":1366,"path":1367,"stem":1368,"children":1369,"page":59},"Desktop UI","i-lucide-app-window","\u002Fcsharp\u002Fdesktop-ui","01.csharp\u002F12.desktop-ui",[1370,1374,1378,1382,1386,1390,1394,1398,1402,1406,1410,1414,1418,1422,1426,1430,1434,1438,1442,1446,1450,1454,1458,1462,1466,1470,1474,1478,1482,1486,1490,1494,1498,1502,1506,1510,1514,1518,1522,1526,1530,1534,1538,1542,1546,1550,1554,1558,1562,1566,1570,1574,1578,1582,1586,1590,1594,1598,1602,1606,1610,1614,1618,1622,1626,1630,1634,1638,1642,1646,1650],{"title":1371,"path":1372,"stem":1373},"Що таке десктопна розробка?","\u002Fcsharp\u002Fdesktop-ui\u002Fwhat-is-desktop-dev","01.csharp\u002F12.desktop-ui\u002F01.what-is-desktop-dev",{"title":1375,"path":1376,"stem":1377},"Архітектура WPF — як влаштований графічний інтерфейс","\u002Fcsharp\u002Fdesktop-ui\u002Fwpf-architecture","01.csharp\u002F12.desktop-ui\u002F02.wpf-architecture",{"title":1379,"path":1380,"stem":1381},"Перший WPF-проєкт — від нуля до вікна","\u002Fcsharp\u002Fdesktop-ui\u002Ffirst-wpf-app","01.csharp\u002F12.desktop-ui\u002F03.first-wpf-app",{"title":1383,"path":1384,"stem":1385},"Перший Avalonia-проєкт: WPF для всіх платформ","\u002Fcsharp\u002Fdesktop-ui\u002F03a.first-avalonia-app","01.csharp\u002F12.desktop-ui\u002F03a.first-avalonia-app",{"title":1387,"path":1388,"stem":1389},"XAML: декларативний інтерфейс","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-basics","01.csharp\u002F12.desktop-ui\u002F04.xaml-basics",{"title":1391,"path":1392,"stem":1393},"Fluent UI у WPF — сучасний дизайн Windows 11","\u002Fcsharp\u002Fdesktop-ui\u002F04a.wpf-fluent-ui","01.csharp\u002F12.desktop-ui\u002F04a.wpf-fluent-ui",{"title":1395,"path":1396,"stem":1397},"WPF UI — сучасна бібліотека Fluent контролів","\u002Fcsharp\u002Fdesktop-ui\u002F04b.wpf-ui-library","01.csharp\u002F12.desktop-ui\u002F04b.wpf-ui-library",{"title":1399,"path":1400,"stem":1401},"HandyControl — велика бібліотека UI контролів для WPF","\u002Fcsharp\u002Fdesktop-ui\u002F04c.handycontrol-library","01.csharp\u002F12.desktop-ui\u002F04c.handycontrol-library",{"title":1403,"path":1404,"stem":1405},"Простори імен та ресурси XAML","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-namespaces-resources","01.csharp\u002F12.desktop-ui\u002F05.xaml-namespaces-resources",{"title":1407,"path":1408,"stem":1409},"XAML в Avalonia: ключові відмінності від WPF","\u002Fcsharp\u002Fdesktop-ui\u002F05a.avalonia-xaml-differences","01.csharp\u002F12.desktop-ui\u002F05a.avalonia-xaml-differences",{"title":1411,"path":1412,"stem":1413},"Розширення розмітки XAML (Markup Extensions)","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-markup-extensions","01.csharp\u002F12.desktop-ui\u002F06.xaml-markup-extensions",{"title":1415,"path":1416,"stem":1417},"Панелі Layout: StackPanel, WrapPanel, DockPanel","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-panels-part1","01.csharp\u002F12.desktop-ui\u002F07.layout-panels-part1",{"title":1419,"path":1420,"stem":1421},"Grid, Canvas, UniformGrid","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-panels-part2","01.csharp\u002F12.desktop-ui\u002F07.layout-panels-part2",{"title":1423,"path":1424,"stem":1425},"Просунуті техніки Layout","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-advanced","01.csharp\u002F12.desktop-ui\u002F08.layout-advanced",{"title":1427,"path":1428,"stem":1429},"Адаптивний Layout та найкращі практики","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-responsive","01.csharp\u002F12.desktop-ui\u002F09.layout-responsive",{"title":1431,"path":1432,"stem":1433},"Layout в Avalonia: відмінності та нові можливості","\u002Fcsharp\u002Fdesktop-ui\u002F09a.layout-avalonia","01.csharp\u002F12.desktop-ui\u002F09a.layout-avalonia",{"title":1435,"path":1436,"stem":1437},"Button, Image, ProgressBar та інші базові контроли","\u002Fcsharp\u002Fdesktop-ui\u002Fbasic-controls","01.csharp\u002F12.desktop-ui\u002F10.basic-controls",{"title":1439,"path":1440,"stem":1441},"Контроли в Avalonia: відмінності від WPF","\u002Fcsharp\u002Fdesktop-ui\u002F10a.controls-avalonia","01.csharp\u002F12.desktop-ui\u002F10a.controls-avalonia",{"title":1443,"path":1444,"stem":1445},"Текстові контроли — TextBlock, TextBox, RichTextBox","\u002Fcsharp\u002Fdesktop-ui\u002Ftext-controls","01.csharp\u002F12.desktop-ui\u002F11.text-controls",{"title":1447,"path":1448,"stem":1449},"Контроли вибору — CheckBox, RadioButton, ComboBox, ListBox, DatePicker","\u002Fcsharp\u002Fdesktop-ui\u002Fselection-controls","01.csharp\u002F12.desktop-ui\u002F12.selection-controls",{"title":1451,"path":1452,"stem":1453},"Content Model — GroupBox, Expander, TabControl, StatusBar","\u002Fcsharp\u002Fdesktop-ui\u002Fcontent-controls","01.csharp\u002F12.desktop-ui\u002F13.content-controls",{"title":1455,"path":1456,"stem":1457},"UI\u002FUX принципи десктопних застосунків","\u002Fcsharp\u002Fdesktop-ui\u002F13a.ui-ux-principles","01.csharp\u002F12.desktop-ui\u002F13a.ui-ux-principles",{"title":1459,"path":1460,"stem":1461},"Dependency Properties — Концепція та Value Resolution","\u002Fcsharp\u002Fdesktop-ui\u002Fdependency-properties-part1","01.csharp\u002F12.desktop-ui\u002F14.dependency-properties-part1",{"title":1463,"path":1464,"stem":1465},"Avalonia Property System — StyledProperty та DirectProperty","\u002Fcsharp\u002Fdesktop-ui\u002F14a.avalonia-property-system","01.csharp\u002F12.desktop-ui\u002F14a.avalonia-property-system",{"title":1467,"path":1468,"stem":1469},"Attached Properties — Властивості без меж","\u002Fcsharp\u002Fdesktop-ui\u002Fattached-properties","01.csharp\u002F12.desktop-ui\u002F15.attached-properties",{"title":1471,"path":1472,"stem":1473},"Routed Events — Маршрутизація подій у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Frouted-events","01.csharp\u002F12.desktop-ui\u002F16.routed-events",{"title":1475,"path":1476,"stem":1477},"Data Binding — Від Code-Behind до Декларативності","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-basics-part1","01.csharp\u002F12.desktop-ui\u002F17.data-binding-basics-part1",{"title":1479,"path":1480,"stem":1481},"INotifyPropertyChanged — Живе оновлення UI","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-basics-part2","01.csharp\u002F12.desktop-ui\u002F17.data-binding-basics-part2",{"title":1483,"path":1484,"stem":1485},"Compiled Bindings в Avalonia — Безпека на етапі компіляції","\u002Fcsharp\u002Fdesktop-ui\u002F17a.avalonia-compiled-bindings","01.csharp\u002F12.desktop-ui\u002F17a.avalonia-compiled-bindings",{"title":1487,"path":1488,"stem":1489},"Просунутий Data Binding — ElementName, RelativeSource, MultiBinding","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-advanced","01.csharp\u002F12.desktop-ui\u002F18.data-binding-advanced",{"title":1491,"path":1492,"stem":1493},"Value Converters — Перетворення типів даних у Data Binding","\u002Fcsharp\u002Fdesktop-ui\u002Fvalue-converters","01.csharp\u002F12.desktop-ui\u002F19.value-converters",{"title":1495,"path":1496,"stem":1497},"Data Templates — Візуалізація об'єктів у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-templates","01.csharp\u002F12.desktop-ui\u002F20.data-templates",{"title":1499,"path":1500,"stem":1501},"Collections Binding Part 1 — ObservableCollection та ItemsControl","\u002Fcsharp\u002Fdesktop-ui\u002Fcollections-binding-part1","01.csharp\u002F12.desktop-ui\u002F21.collections-binding-part1",{"title":1503,"path":1504,"stem":1505},"Collections Binding Part 2 — ICollectionView, Filtering, Sorting та Virtualization","\u002Fcsharp\u002Fdesktop-ui\u002Fcollections-binding-part2","01.csharp\u002F12.desktop-ui\u002F21.collections-binding-part2",{"title":1507,"path":1508,"stem":1509},"MVVM Pattern — Від Spaghetti Code до архітектури","\u002Fcsharp\u002Fdesktop-ui\u002Fmvvm-pattern","01.csharp\u002F12.desktop-ui\u002F22.mvvm-pattern",{"title":1511,"path":1512,"stem":1513},"ViewModel Implementation — Від BaseViewModel до валідації","\u002Fcsharp\u002Fdesktop-ui\u002Fviewmodel-implementation","01.csharp\u002F12.desktop-ui\u002F23.viewmodel-implementation",{"title":1515,"path":1516,"stem":1517},"Commands — Від event handlers до декларативних команд","\u002Fcsharp\u002Fdesktop-ui\u002Fcommands","01.csharp\u002F12.desktop-ui\u002F24.commands",{"title":1519,"path":1520,"stem":1521},"MVVM Toolkit — MVVM без boilerplate через Source Generators","\u002Fcsharp\u002Fdesktop-ui\u002Fmvvm-toolkit","01.csharp\u002F12.desktop-ui\u002F25.mvvm-toolkit",{"title":1523,"path":1524,"stem":1525},"Messenger Pattern — Комунікація між ViewModel без прямих посилань","\u002Fcsharp\u002Fdesktop-ui\u002Fmessenger-pattern","01.csharp\u002F12.desktop-ui\u002F26.messenger-pattern",{"title":1527,"path":1528,"stem":1529},"Стилі WPF — CSS для десктопу","\u002Fcsharp\u002Fdesktop-ui\u002Fstyles-basics","01.csharp\u002F12.desktop-ui\u002F27.styles-basics",{"title":1531,"path":1532,"stem":1533},"CSS-like стилі Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002F27a.avalonia-css-styling","01.csharp\u002F12.desktop-ui\u002F27a.avalonia-css-styling",{"title":1535,"path":1536,"stem":1537},"Control Templates — Частина 1. Концепція та TemplateBinding","\u002Fcsharp\u002Fdesktop-ui\u002Fcontrol-templates-part1","01.csharp\u002F12.desktop-ui\u002F28.control-templates-part1",{"title":1539,"path":1540,"stem":1541},"Control Templates — Частина 2. Named Parts та ContentPresenter","\u002Fcsharp\u002Fdesktop-ui\u002Fcontrol-templates-part2","01.csharp\u002F12.desktop-ui\u002F28.control-templates-part2",{"title":1543,"path":1544,"stem":1545},"Control Themes в Avalonia — нова ера стилізації","\u002Fcsharp\u002Fdesktop-ui\u002F28a.avalonia-control-themes","01.csharp\u002F12.desktop-ui\u002F28a.avalonia-control-themes",{"title":1547,"path":1548,"stem":1549},"Triggers та Visual State Manager у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Ftriggers-visual-states","01.csharp\u002F12.desktop-ui\u002F29.triggers-visual-states",{"title":1551,"path":1552,"stem":1553},"Pseudo-classes в Avalonia — замість WPF Triggers","\u002Fcsharp\u002Fdesktop-ui\u002F29a.avalonia-pseudo-classes","01.csharp\u002F12.desktop-ui\u002F29a.avalonia-pseudo-classes",{"title":1555,"path":1556,"stem":1557},"Теми та ресурсні словники у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fresources-themes","01.csharp\u002F12.desktop-ui\u002F30.resources-themes",{"title":1559,"path":1560,"stem":1561},"Avalonia Themes — Fluent Design та система тематизації","\u002Fcsharp\u002Fdesktop-ui\u002F30a.avalonia-themes-fluent","01.csharp\u002F12.desktop-ui\u002F30a.avalonia-themes-fluent",{"title":1563,"path":1564,"stem":1565},"Контроли колекцій — глибоке занурення","\u002Fcsharp\u002Fdesktop-ui\u002Fcollection-controls","01.csharp\u002F12.desktop-ui\u002F31.collection-controls",{"title":1567,"path":1568,"stem":1569},"DataGrid — колонки та базове відображення","\u002Fcsharp\u002Fdesktop-ui\u002Fdatagrid-part1","01.csharp\u002F12.desktop-ui\u002F32.datagrid-part1",{"title":1571,"path":1572,"stem":1573},"DataGrid — сортування, фільтрація, редагування","\u002Fcsharp\u002Fdesktop-ui\u002Fdatagrid-part2","01.csharp\u002F12.desktop-ui\u002F32.datagrid-part2",{"title":1575,"path":1576,"stem":1577},"TreeView та GridView","\u002Fcsharp\u002Fdesktop-ui\u002Ftreeview-listview","01.csharp\u002F12.desktop-ui\u002F33.treeview-listview",{"title":1579,"path":1580,"stem":1581},"Меню, Toolbar, ContextMenu, StatusBar","\u002Fcsharp\u002Fdesktop-ui\u002Fmenus-toolbars","01.csharp\u002F12.desktop-ui\u002F34.menus-toolbars",{"title":1583,"path":1584,"stem":1585},"Навігація та керування вікнами. Частина 1: вікна та сторінки","\u002Fcsharp\u002Fdesktop-ui\u002Fnavigation-windows-part1","01.csharp\u002F12.desktop-ui\u002F35.navigation-windows-part1",{"title":1587,"path":1588,"stem":1589},"Навігація та керування вікнами. Частина 2: MVVM-навігація","\u002Fcsharp\u002Fdesktop-ui\u002Fnavigation-windows-part2","01.csharp\u002F12.desktop-ui\u002F35.navigation-windows-part2",{"title":1591,"path":1592,"stem":1593},"Avalonia — Навігація та діалоги","\u002Fcsharp\u002Fdesktop-ui\u002F35a.avalonia-navigation-dialogs","01.csharp\u002F12.desktop-ui\u002F35a.avalonia-navigation-dialogs",{"title":1595,"path":1596,"stem":1597},"Діалоги та File Pickers у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fdialogs-file-pickers","01.csharp\u002F12.desktop-ui\u002F36.dialogs-file-pickers",{"title":1599,"path":1600,"stem":1601},"UserControl: компонентний підхід у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fuser-controls","01.csharp\u002F12.desktop-ui\u002F37.user-controls",{"title":1603,"path":1604,"stem":1605},"Custom Controls: Lookless Controls у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fcustom-controls","01.csharp\u002F12.desktop-ui\u002F38.custom-controls",{"title":1607,"path":1608,"stem":1609},"Avalonia TemplatedControl — Lookless Controls","\u002Fcsharp\u002Fdesktop-ui\u002F38a.avalonia-templated-controls","01.csharp\u002F12.desktop-ui\u002F38a.avalonia-templated-controls",{"title":1611,"path":1612,"stem":1613},"Анімації у WPF: Storyboard та Easing Functions","\u002Fcsharp\u002Fdesktop-ui\u002Fanimations-transitions","01.csharp\u002F12.desktop-ui\u002F39.animations-transitions",{"title":1615,"path":1616,"stem":1617},"Анімації в Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002F39a.avalonia-animations","01.csharp\u002F12.desktop-ui\u002F39a.avalonia-animations",{"title":1619,"path":1620,"stem":1621},"2D Графіка та Мультимедіа у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fmedia-graphics","01.csharp\u002F12.desktop-ui\u002F40.media-graphics",{"title":1623,"path":1624,"stem":1625},"Dependency Injection у WPF та Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002Fdi-integration","01.csharp\u002F12.desktop-ui\u002F41.di-integration",{"title":1627,"path":1628,"stem":1629},"SQLite та EF Core у десктопних додатках","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-persistence-part1","01.csharp\u002F12.desktop-ui\u002F42.data-persistence-part1",{"title":1631,"path":1632,"stem":1633},"Repository Pattern та Unit of Work","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-persistence-part2","01.csharp\u002F12.desktop-ui\u002F43.data-persistence-part2",{"title":1635,"path":1636,"stem":1637},"Тестування ViewModels","\u002Fcsharp\u002Fdesktop-ui\u002Fviewmodel-testing","01.csharp\u002F12.desktop-ui\u002F44.viewmodel-testing",{"title":1639,"path":1640,"stem":1641},"Avalonia Headless Testing — тестування UI без вікон","\u002Fcsharp\u002Fdesktop-ui\u002F44a.avalonia-headless-testing","01.csharp\u002F12.desktop-ui\u002F44a.avalonia-headless-testing",{"title":1643,"path":1644,"stem":1645},"Кросплатформна розробка з Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002Favalonia-cross-platform","01.csharp\u002F12.desktop-ui\u002F45.avalonia-cross-platform",{"title":1647,"path":1648,"stem":1649},"Пакування та розгортання Avalonia додатків","\u002Fcsharp\u002Fdesktop-ui\u002Favalonia-packaging-deployment","01.csharp\u002F12.desktop-ui\u002F46.avalonia-packaging-deployment",{"title":1651,"path":1652,"stem":1653},"Розгортання WPF застосунків","\u002Fcsharp\u002Fdesktop-ui\u002Fwpf-packaging-deployment","01.csharp\u002F12.desktop-ui\u002F47.wpf-packaging-deployment",{"title":1655,"icon":658,"path":1656,"stem":1657,"children":1658,"page":59},"Network Programming","\u002Fcsharp\u002Fnetwork-programming","01.csharp\u002F13.network-programming",[1659,1663,1667,1671,1675,1679,1683,1687,1691,1695,1699],{"title":1660,"path":1661,"stem":1662},"Основи комп'ютерних мереж","\u002Fcsharp\u002Fnetwork-programming\u002Ffoundations","01.csharp\u002F13.network-programming\u002F01.foundations",{"title":1664,"path":1665,"stem":1666},"Модель OSI та стек TCP\u002FIP","\u002Fcsharp\u002Fnetwork-programming\u002Fosi-model","01.csharp\u002F13.network-programming\u002F02.osi-model",{"title":1668,"path":1669,"stem":1670},"IP-протокол та адресація","\u002Fcsharp\u002Fnetwork-programming\u002Fip-addressing","01.csharp\u002F13.network-programming\u002F03.ip-addressing",{"title":1672,"path":1673,"stem":1674},"UDP — протокол без з'єднання","\u002Fcsharp\u002Fnetwork-programming\u002Fudp","01.csharp\u002F13.network-programming\u002F05.udp",{"title":1676,"path":1677,"stem":1678},"UDP Broadcast та Multicast","\u002Fcsharp\u002Fnetwork-programming\u002Fudp-broadcast-multicast","01.csharp\u002F13.network-programming\u002F06.udp-broadcast-multicast",{"title":1680,"path":1681,"stem":1682},"HTTP — протокол вебу","\u002Fcsharp\u002Fnetwork-programming\u002Fhttp-fundamentals","01.csharp\u002F13.network-programming\u002F07.http-fundamentals",{"title":1684,"path":1685,"stem":1686},"HttpListener — вбудований HTTP-сервер .NET","\u002Fcsharp\u002Fnetwork-programming\u002F07a.http-listener","01.csharp\u002F13.network-programming\u002F07a.http-listener",{"title":1688,"path":1689,"stem":1690},"HTTP Advanced — cookies, аутентифікація та HTTPS","\u002Fcsharp\u002Fnetwork-programming\u002Fhttp-advanced","01.csharp\u002F13.network-programming\u002F08.http-advanced",{"title":1692,"path":1693,"stem":1694},"SMTP та протоколи електронної пошти","\u002Fcsharp\u002Fnetwork-programming\u002Fsmtp","01.csharp\u002F13.network-programming\u002F09.smtp",{"title":1696,"path":1697,"stem":1698},"WebSocket — повнодуплексний протокол реального часу","\u002Fcsharp\u002Fnetwork-programming\u002Fwebsockets","01.csharp\u002F13.network-programming\u002F10.websockets",{"title":1700,"path":1701,"stem":1702},"TLS\u002FSSL — криптографічний захист мережевих з'єднань","\u002Fcsharp\u002Fnetwork-programming\u002Ftls-ssl","01.csharp\u002F13.network-programming\u002F11.tls-ssl",{"title":1704,"path":1705,"stem":1706},"C# & .NET: The Ultimate Roadmap","\u002Fcsharp\u002Froadmap","01.csharp\u002Froadmap",{"title":1708,"icon":1709,"path":1710,"stem":1711,"children":1712,"page":59},"C++","i-devicon-cplusplus","\u002Fcpp","02.cpp",[1713,1717,1721,1725,1729,1733,1737,1741,1745,1748,1752,1756,1760,1764,1768,1772,1776,1780,1784,1788,1792,1796,1800,1804,1808,1812,1816,1820,1824,1828,1832,1836,1840,1844,1848,1852,1856,1860,1864,1868,1872,1876,1880,1884,1888,1892,1896,1900,1904,1908],{"title":1714,"path":1715,"stem":1716},"Вступ у програмування та алгоритми","\u002Fcpp\u002Fintro-algorithms","02.cpp\u002F01.intro-algorithms",{"title":1718,"path":1719,"stem":1720},"Code Style: угоди про оформлення коду","\u002Fcpp\u002Fcode-style","02.cpp\u002F02.code-style",{"title":1722,"path":1723,"stem":1724},"Середовище розробки та перший проєкт","\u002Fcpp\u002Fide-setup","02.cpp\u002F03.ide-setup",{"title":1726,"path":1727,"stem":1728},"Вивід даних на екран","\u002Fcpp\u002Fdata-output","02.cpp\u002F04.data-output",{"title":1730,"path":1731,"stem":1732},"Типи даних, змінні та константи","\u002Fcpp\u002Fdata-types-variables","02.cpp\u002F05.data-types-variables",{"title":1734,"path":1735,"stem":1736},"Ввід даних з клавіатури","\u002Fcpp\u002Fdata-input","02.cpp\u002F06.data-input",{"title":1738,"path":1739,"stem":1740},"Оператори, перетворення типів та логічні операції","\u002Fcpp\u002Foperators-type-conversion","02.cpp\u002F07.operators-type-conversion",{"title":1742,"path":1743,"stem":1744},"Цикли","\u002Fcpp\u002Floops","02.cpp\u002F08.loops",{"title":32,"path":1746,"stem":1747},"\u002Fcpp\u002Farrays","02.cpp\u002F09.arrays",{"title":1749,"path":1750,"stem":1751},"Алгоритми сортування та аналіз складності","\u002Fcpp\u002Fsorting","02.cpp\u002F10.sorting",{"title":1753,"path":1754,"stem":1755},"Алгоритми пошуку","\u002Fcpp\u002Fsearching","02.cpp\u002F11.searching",{"title":1757,"path":1758,"stem":1759},"Функції: основи","\u002Fcpp\u002Ffunctions-basics","02.cpp\u002F12.functions-basics",{"title":1761,"path":1762,"stem":1763},"Функції: прототипи, область видимості та додаткові можливості","\u002Fcpp\u002Ffunctions-scope","02.cpp\u002F13.functions-scope",{"title":1765,"path":1766,"stem":1767},"Функції: перевантаження та шаблони","\u002Fcpp\u002Ffunctions-overloading-templates","02.cpp\u002F14.functions-overloading-templates",{"title":1769,"path":1770,"stem":1771},"Вказівники: основи","\u002Fcpp\u002Fpointers-basics","02.cpp\u002F15.pointers-basics",{"title":1773,"path":1774,"stem":1775},"Посилання (References)","\u002Fcpp\u002Freferences","02.cpp\u002F16.references",{"title":1777,"path":1778,"stem":1779},"Вказівники, const і масиви","\u002Fcpp\u002Fpointers-const-arrays","02.cpp\u002F17.pointers-const-arrays",{"title":1781,"path":1782,"stem":1783},"Адресна арифметика","\u002Fcpp\u002Fpointer-arithmetic","02.cpp\u002F18.pointer-arithmetic",{"title":1785,"path":1786,"stem":1787},"Динамічна пам'ять","\u002Fcpp\u002Fdynamic-memory","02.cpp\u002F19.dynamic-memory",{"title":1789,"path":1790,"stem":1791},"Вказівники типу void","\u002Fcpp\u002Fvoid-pointers","02.cpp\u002F20.void-pointers",{"title":1793,"path":1794,"stem":1795},"Вказівники на вказівники","\u002Fcpp\u002Fpointers-to-pointers","02.cpp\u002F21.pointers-to-pointers",{"title":1797,"path":1798,"stem":1799},"Оператор доступу до членів через вказівник (->)","\u002Fcpp\u002Fmember-access-operator","02.cpp\u002F22.member-access-operator",{"title":1801,"path":1802,"stem":1803},"Цикл for-each (Range-based for)","\u002Fcpp\u002Fforeach-loop","02.cpp\u002F23.foreach-loop",{"title":1805,"path":1806,"stem":1807},"Вказівники на функції","\u002Fcpp\u002Ffunction-pointers","02.cpp\u002F24.function-pointers",{"title":1809,"path":1810,"stem":1811},"Лямбда-вирази","\u002Fcpp\u002Flambdas","02.cpp\u002F25.lambdas",{"title":1813,"path":1814,"stem":1815},"Лямбда-захоплення","\u002Fcpp\u002Flambda-captures","02.cpp\u002F26.lambda-captures",{"title":1817,"path":1818,"stem":1819},"Еліпсис","\u002Fcpp\u002Fellipsis","02.cpp\u002F27.ellipsis",{"title":1821,"path":1822,"stem":1823},"Безпечні альтернативи еліпсису","\u002Fcpp\u002F27a.ellipsis","02.cpp\u002F27a.ellipsis",{"title":1825,"path":1826,"stem":1827},"Аргументи командного рядка","\u002Fcpp\u002Fcommand-line-arguments","02.cpp\u002F28.command-line-arguments",{"title":1829,"path":1830,"stem":1831},"Перерахування (enum)","\u002Fcpp\u002Fenum","02.cpp\u002F29.enum",{"title":1833,"path":1834,"stem":1835},"Класи-перерахування (enum class)","\u002Fcpp\u002Fenum-class","02.cpp\u002F30.enum-class",{"title":1837,"path":1838,"stem":1839},"Псевдоніми типів (typedef і using)","\u002Fcpp\u002Ftype-aliases","02.cpp\u002F31.type-aliases",{"title":1841,"path":1842,"stem":1843},"Системи числення та двійкова арифметика","\u002Fcpp\u002Fnumber-systems","02.cpp\u002F32.number-systems",{"title":1845,"path":1846,"stem":1847},"Структури (struct): агрегування даних","\u002Fcpp\u002Fstruct","02.cpp\u002F33.struct",{"title":1849,"path":1850,"stem":1851},"Структури у функціях","\u002Fcpp\u002Fstruct-functions","02.cpp\u002F34.struct-functions",{"title":1853,"path":1854,"stem":1855},"Масиви структур і вкладені структури","\u002Fcpp\u002Fstruct-arrays","02.cpp\u002F35.struct-arrays",{"title":1857,"path":1858,"stem":1859},"Патерни struct та межі застосування","\u002Fcpp\u002Fstruct-patterns","02.cpp\u002F36.struct-patterns",{"title":1861,"path":1862,"stem":1863},"Символи та таблиця ASCII","\u002Fcpp\u002Fascii-characters","02.cpp\u002F37.ascii-characters",{"title":1865,"path":1866,"stem":1867},"Unicode та кодування UTF","\u002Fcpp\u002Funicode-utf","02.cpp\u002F38.unicode-utf",{"title":1869,"path":1870,"stem":1871},"C-style рядки","\u002Fcpp\u002Fc-strings","02.cpp\u002F39.c-strings",{"title":1873,"path":1874,"stem":1875},"Вступ до std::string","\u002Fcpp\u002Fstd-string-intro","02.cpp\u002F40.std-string-intro",{"title":1877,"path":1878,"stem":1879},"Довжина, ємність та доступ до символів std::string","\u002Fcpp\u002Fstd-string-capacity-access","02.cpp\u002F41.std-string-capacity-access",{"title":1881,"path":1882,"stem":1883},"Модифікація std::string: присвоювання, додавання, вставка, видалення та заміна","\u002Fcpp\u002Fstd-string-modification","02.cpp\u002F42.std-string-modification",{"title":1885,"path":1886,"stem":1887},"Пошук у std::string: find, npos та практичні патерни","\u002Fcpp\u002Fstd-string-search","02.cpp\u002F43.std-string-search",{"title":1889,"path":1890,"stem":1891},"std::string_view: невласницький погляд на рядок без копіювання","\u002Fcpp\u002Fstd-string-view","02.cpp\u002F44.std-string-view",{"title":1893,"path":1894,"stem":1895},"Об'єднання (union): один блок пам'яті, кілька інтерпретацій","\u002Fcpp\u002Funion","02.cpp\u002F45.union",{"title":1897,"path":1898,"stem":1899},"Організація коду: файли, препроцесор, простори імен","\u002Fcpp\u002Fmultifile-programs","02.cpp\u002F46.multifile-programs",{"title":1901,"path":1902,"stem":1903},"Робота з файлами: C-стиль (stdio.h)","\u002Fcpp\u002Fc-style-files","02.cpp\u002F47.c-style-files",{"title":1905,"path":1906,"stem":1907},"Робота з файлами: C++-стиль (fstream)","\u002Fcpp\u002Fcpp-style-files","02.cpp\u002F48.cpp-style-files",{"title":1909,"path":1910,"stem":1911},"План навчання: Курс C++ — Продовження (Статті 29–60+)","\u002Fcpp\u002Fcurriculum-plan","02.cpp\u002Fcurriculum-plan",{"title":1913,"icon":1914,"path":1915,"stem":1916,"children":1917,"page":59},"JavaScript","i-devicon-javascript","\u002Fjavascript","03.javascript",[1918,1944,1998,2020,2324,2362],{"title":1919,"icon":1920,"path":1921,"stem":1922,"children":1923,"page":59},"Events","i-lucide-mouse-pointer-click","\u002Fjavascript\u002Fevents","03.javascript\u002F01.events",[1924,1928,1932,1936,1940],{"title":1925,"path":1926,"stem":1927},"Вступ до подій браузера","\u002Fjavascript\u002Fevents\u002Fintro","03.javascript\u002F01.events\u002F01.intro",{"title":1929,"path":1930,"stem":1931},"Бульбашковий механізм (Bubbling) та занурення (Capturing)","\u002Fjavascript\u002Fevents\u002Fbubbling-capturing","03.javascript\u002F01.events\u002F02.bubbling-capturing",{"title":1933,"path":1934,"stem":1935},"Делегування подій (Event Delegation)","\u002Fjavascript\u002Fevents\u002Fdelegate-events","03.javascript\u002F01.events\u002F03.delegate-events",{"title":1937,"path":1938,"stem":1939},"Типові дії браузера та preventDefault()","\u002Fjavascript\u002Fevents\u002Fprevent-default","03.javascript\u002F01.events\u002F04.prevent-default",{"title":1941,"path":1942,"stem":1943},"Запуск користувацьких подій (Custom Events)","\u002Fjavascript\u002Fevents\u002Fcustom-events","03.javascript\u002F01.events\u002F05.custom-events",{"title":1945,"icon":1946,"path":1947,"stem":1948,"children":1949,"page":59},"Network","i-lucide-globe","\u002Fjavascript\u002Fnetwork","03.javascript\u002F02.network",[1950,1954,1958,1962,1966,1970,1974,1978,1982,1986,1990,1994],{"title":1951,"path":1952,"stem":1953},"Fetch API - Сучасний підхід до HTTP-запитів","\u002Fjavascript\u002Fnetwork\u002F01-fetch-api","03.javascript\u002F02.network\u002F01-fetch-api",{"title":1955,"path":1956,"stem":1957},"FormData - Робота з формами та файлами","\u002Fjavascript\u002Fnetwork\u002F02-formdata","03.javascript\u002F02.network\u002F02-formdata",{"title":1959,"path":1960,"stem":1961},"Відстеження прогресу завантаження","\u002Fjavascript\u002Fnetwork\u002F03-download-progress","03.javascript\u002F02.network\u002F03-download-progress",{"title":1963,"path":1964,"stem":1965},"Переривання fetch-запитів","\u002Fjavascript\u002Fnetwork\u002F04-abort-requests","03.javascript\u002F02.network\u002F04-abort-requests",{"title":1967,"path":1968,"stem":1969},"CORS - Запити між різними джерелами","\u002Fjavascript\u002Fnetwork\u002F05-cors","03.javascript\u002F02.network\u002F05-cors",{"title":1971,"path":1972,"stem":1973},"Fetch API - Повний довідник опцій","\u002Fjavascript\u002Fnetwork\u002F06-fetch-options","03.javascript\u002F02.network\u002F06-fetch-options",{"title":1975,"path":1976,"stem":1977},"URL Objects - Робота з посиланнями","\u002Fjavascript\u002Fnetwork\u002F07-url-objects","03.javascript\u002F02.network\u002F07-url-objects",{"title":1979,"path":1980,"stem":1981},"XMLHttpRequest - AJAX та низькорівневі запити","\u002Fjavascript\u002Fnetwork\u002F08-xmlhttprequest","03.javascript\u002F02.network\u002F08-xmlhttprequest",{"title":1983,"path":1984,"stem":1985},"Відновлюване завантаження файлів","\u002Fjavascript\u002Fnetwork\u002F09-resumable-upload","03.javascript\u002F02.network\u002F09-resumable-upload",{"title":1987,"path":1988,"stem":1989},"Cookies, document.cookie та світ після \"Cookiepocalypse\"","\u002Fjavascript\u002Fnetwork\u002F10-cookies","03.javascript\u002F02.network\u002F10-cookies",{"title":1991,"path":1992,"stem":1993},"js-cookie: Керування Cookies без Болю","\u002Fjavascript\u002Fnetwork\u002F11-js-cookie","03.javascript\u002F02.network\u002F11-js-cookie",{"title":1995,"path":1996,"stem":1997},"Axios: Потужний HTTP-клієнт для JavaScript","\u002Fjavascript\u002Fnetwork\u002F12-axios","03.javascript\u002F02.network\u002F12-axios",{"title":1999,"icon":2000,"path":2001,"stem":2002,"children":2003,"page":59},"Bom","i-lucide-monitor","\u002Fjavascript\u002Fbom","03.javascript\u002F03.bom",[2004,2008,2012,2016],{"title":2005,"path":2006,"stem":2007},"LocalStorage, SessionStorage та patterns збереження даних","\u002Fjavascript\u002Fbom\u002F01-localstorage","03.javascript\u002F03.bom\u002F01-localstorage",{"title":2009,"path":2010,"stem":2011},"Location Object - Керування адресою сторінки","\u002Fjavascript\u002Fbom\u002F02-location-object","03.javascript\u002F03.bom\u002F02-location-object",{"title":2013,"path":2014,"stem":2015},"History API - Керування історією браузера","\u002Fjavascript\u002Fbom\u002F03-history-api","03.javascript\u002F03.bom\u002F03-history-api",{"title":2017,"path":2018,"stem":2019},"Navigator Object - Ідентифікація та Можливості Пристрою","\u002Fjavascript\u002Fbom\u002F04-navigator-object","03.javascript\u002F03.bom\u002F04-navigator-object",{"title":2021,"icon":2022,"path":2023,"stem":2024,"children":2025},"React","i-devicon-react","\u002Fjavascript\u002Freact","03.javascript\u002F04.react\u002Findex",[2026,2027,2031,2035,2039,2043,2106,2141,2293],{"title":2021,"path":2023,"stem":2024},{"title":2028,"path":2029,"stem":2030},"Робота з Формами в React","\u002Fjavascript\u002Freact\u002Freact-forms","03.javascript\u002F04.react\u002F01.react-forms",{"title":2032,"path":2033,"stem":2034},"React Hook Form: Професійна Робота з Формами","\u002Fjavascript\u002Freact\u002Freact-hook-form","03.javascript\u002F04.react\u002F02.react-hook-form",{"title":2036,"path":2037,"stem":2038},"React Hook Form: Глибоке Розуміння Архітектури та Оптимізації","\u002Fjavascript\u002Freact\u002Freact-hook-form-new","03.javascript\u002F04.react\u002F02.react-hook-form-new",{"title":2040,"path":2041,"stem":2042},"Axios та React: Професійна Архітектура Запитів","\u002Fjavascript\u002Freact\u002Fdata-fetching-axios","03.javascript\u002F04.react\u002F03.data-fetching-axios",{"title":2044,"icon":132,"path":2045,"stem":2046,"children":2047},"Tanstack Query","\u002Fjavascript\u002Freact\u002Ftanstack-query","03.javascript\u002F04.react\u002F04.tanstack-query\u002Findex",[2048,2050,2054,2058,2062,2066,2070,2074,2078,2082,2086,2090,2094,2098,2102],{"title":2049,"path":2045,"stem":2046},"TanStack Query: Майстерність Керування Станом Сервера",{"title":2051,"path":2052,"stem":2053},"Парадигма Server State: Чому useEffect недостатньо","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fserver-state-paradigm","03.javascript\u002F04.react\u002F04.tanstack-query\u002F01.server-state-paradigm",{"title":2055,"path":2056,"stem":2057},"Встановлення та Налаштування: Фундамент","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Finstallation-and-devtools","03.javascript\u002F04.react\u002F04.tanstack-query\u002F02.installation-and-devtools",{"title":2059,"path":2060,"stem":2061},"Основи Запитів та Магія Ключів","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fquery-basics-and-keys","03.javascript\u002F04.react\u002F04.tanstack-query\u002F03.query-basics-and-keys",{"title":2063,"path":2064,"stem":2065},"Синхронізація Даних: Життєвий Цикл Запиту","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fdata-synchronization","03.javascript\u002F04.react\u002F04.tanstack-query\u002F04.data-synchronization",{"title":2067,"path":2068,"stem":2069},"Мутації та Інвалідація: Зміна Даних","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fmutations-and-invalidation","03.javascript\u002F04.react\u002F04.tanstack-query\u002F05.mutations-and-invalidation",{"title":2071,"path":2072,"stem":2073},"Оптимістичні Оновлення: Швидше за Світло","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Foptimistic-updates","03.javascript\u002F04.react\u002F04.tanstack-query\u002F06.optimistic-updates",{"title":2075,"path":2076,"stem":2077},"Пагінація та Infinite Scroll","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fpagination-and-load-more","03.javascript\u002F04.react\u002F04.tanstack-query\u002F07.pagination-and-load-more",{"title":2079,"path":2080,"stem":2081},"Просунуті Патерни та Оптимізація","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fadvanced-patterns","03.javascript\u002F04.react\u002F04.tanstack-query\u002F08.advanced-patterns",{"title":2083,"path":2084,"stem":2085},"Архітектура та Best Practices","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Farchitecture-and-best-practices","03.javascript\u002F04.react\u002F04.tanstack-query\u002F09.architecture-and-best-practices",{"title":2087,"path":2088,"stem":2089},"Server-Side Rendering (SSR) та Гідратація","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fserver-side-rendering","03.javascript\u002F04.react\u002F04.tanstack-query\u002F10.server-side-rendering",{"title":2091,"path":2092,"stem":2093},"Стратегії Тестування","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Ftesting-strategies","03.javascript\u002F04.react\u002F04.tanstack-query\u002F11.testing-strategies",{"title":2095,"path":2096,"stem":2097},"Аутентифікація та Обробка Помилок","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fauthentication-and-errors","03.javascript\u002F04.react\u002F04.tanstack-query\u002F12.authentication-and-errors",{"title":2099,"path":2100,"stem":2101},"React Suspense та Майбутнє","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Freact-suspense","03.javascript\u002F04.react\u002F04.tanstack-query\u002F13.react-suspense",{"title":2103,"path":2104,"stem":2105},"Глибоке Занурення в Продуктивність","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fperformance-deep-dive","03.javascript\u002F04.react\u002F04.tanstack-query\u002F14.performance-deep-dive",{"title":2107,"icon":2022,"path":2108,"stem":2109,"children":2110},"React Router","\u002Fjavascript\u002Freact\u002Freact-router","03.javascript\u002F04.react\u002F05.react-router\u002Findex",[2111,2113,2117,2121,2125,2129,2133,2137],{"title":2112,"path":2108,"stem":2109},"React Router: Навігаційна система сучасного вебу",{"title":2114,"path":2115,"stem":2116},"Налаштування та Базовий Роутинг","\u002Fjavascript\u002Freact\u002Freact-router\u002Fsetup-and-basic-routing","03.javascript\u002F04.react\u002F05.react-router\u002F01.setup-and-basic-routing",{"title":2118,"path":2119,"stem":2120},"Динамічна Навігація","\u002Fjavascript\u002Freact\u002Freact-router\u002Fnavigation-and-links","03.javascript\u002F04.react\u002F05.react-router\u002F02.navigation-and-links",{"title":2122,"path":2123,"stem":2124},"Вкладені Маршрути та Макети","\u002Fjavascript\u002Freact\u002Freact-router\u002Fnested-routes-and-layouts","03.javascript\u002F04.react\u002F05.react-router\u002F03.nested-routes-and-layouts",{"title":2126,"path":2127,"stem":2128},"Динамічні Маршрути та Параметри","\u002Fjavascript\u002Freact\u002Freact-router\u002Fdynamic-routing","03.javascript\u002F04.react\u002F05.react-router\u002F04.dynamic-routing",{"title":2130,"path":2131,"stem":2132},"Data APIs: Loaders та Actions","\u002Fjavascript\u002Freact\u002Freact-router\u002Fdata-loading","03.javascript\u002F04.react\u002F05.react-router\u002F05.data-loading",{"title":2134,"path":2135,"stem":2136},"Просунуті Патерни","\u002Fjavascript\u002Freact\u002Freact-router\u002Fadvanced-patterns","03.javascript\u002F04.react\u002F05.react-router\u002F06.advanced-patterns",{"title":2138,"path":2139,"stem":2140},"Legacy Routing: Компонентний підхід","\u002Fjavascript\u002Freact\u002Freact-router\u002Flegacy-routing","03.javascript\u002F04.react\u002F05.react-router\u002F07.legacy-routing",{"title":2142,"icon":132,"path":2143,"stem":2144,"children":2145},"Redux","\u002Fjavascript\u002Freact\u002Fredux","03.javascript\u002F04.react\u002F06.redux\u002Findex",[2146,2148,2164,2193,2202,2223,2239,2268],{"title":2147,"path":2143,"stem":2144},"Redux: Еволюція управління станом",{"title":14,"icon":15,"path":2149,"stem":2150,"children":2151,"page":59},"\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals",[2152,2156,2160],{"title":2153,"path":2154,"stem":2155},"Вступ до State Management","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fintro-state-management","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F01.intro-state-management",{"title":2157,"path":2158,"stem":2159},"Філософія Redux та Три Принципи","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fredux-philosophy","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F02.redux-philosophy",{"title":2161,"path":2162,"stem":2163},"Чисті функції та Іммутабельність","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fpure-functions-immutability","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F03.pure-functions-immutability",{"title":2165,"icon":132,"path":2166,"stem":2167,"children":2168,"page":59},"Classic Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux",[2169,2173,2177,2181,2185,2189],{"title":2170,"path":2171,"stem":2172},"Створення Store (Classic Redux)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fstore-setup","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F01.store-setup",{"title":2174,"path":2175,"stem":2176},"Actions, Constants та Action Creators","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Factions-constants","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F02.actions-constants",{"title":2178,"path":2179,"stem":2180},"Логіка Reducers","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Freducers","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F03.reducers",{"title":2182,"path":2183,"stem":2184},"Комбінування Reducers (Root Reducer)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fdata-flow","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F04.data-flow",{"title":2186,"path":2187,"stem":2188},"Підключення до React (React-Redux)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Freact-redux-connection","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F05.react-redux-connection",{"title":2190,"path":2191,"stem":2192},"Middleware та Асинхронність (Redux Thunk)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fmiddleware-thunk","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F06.middleware-thunk",{"title":2194,"icon":132,"path":2195,"stem":2196,"children":2197,"page":59},"Transition To Rtk","\u002Fjavascript\u002Freact\u002Fredux\u002Ftransition-to-rtk","03.javascript\u002F04.react\u002F06.redux\u002F03.transition-to-rtk",[2198],{"title":2199,"path":2200,"stem":2201},"Проблеми класичного Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Ftransition-to-rtk\u002Fproblems-with-classic","03.javascript\u002F04.react\u002F06.redux\u002F03.transition-to-rtk\u002F01.problems-with-classic",{"title":2203,"icon":132,"path":2204,"stem":2205,"children":2206,"page":59},"Redux Toolkit","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit",[2207,2211,2215,2219],{"title":2208,"path":2209,"stem":2210},"Налаштування Store з configureStore","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fconfigure-store","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F01.configure-store",{"title":2212,"path":2213,"stem":2214},"createSlice: Революція в Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fcreate-slice","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F02.create-slice",{"title":2216,"path":2217,"stem":2218},"Асинхронність з createAsyncThunk","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fasync-thunks","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F03.async-thunks",{"title":2220,"path":2221,"stem":2222},"04. Entity Adapter: Керування нормалізованим станом","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fentity-adapter","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F04.entity-adapter",{"title":2224,"icon":92,"path":2225,"stem":2226,"children":2227,"page":59},"Advanced","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced",[2228,2232,2236],{"title":2229,"path":2230,"stem":2231},"Мемоізація та Селектори: Повний Гайд по Reselect","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Fselectors-reselect","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F01.selectors-reselect",{"title":2233,"path":2234,"stem":2235},"RTK Query: Архітектура Серверного Кешу","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Frtk-query-intro","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F02.rtk-query-intro",{"title":2083,"path":2237,"stem":2238},"\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Farchitecture-best-practices","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F03.architecture-best-practices",{"title":2240,"icon":132,"path":2241,"stem":2242,"children":2243,"page":59},"Project Kanban","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban",[2244,2248,2252,2256,2260,2264],{"title":2245,"path":2246,"stem":2247},"Проєкт: Kanban Board (Trello Clone)","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fproject-overview","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F01.project-overview",{"title":2249,"path":2250,"stem":2251},"Налаштування та Типізація","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fsetup-and-types","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F02.setup-and-types",{"title":2253,"path":2254,"stem":2255},"Board Slice: Серце Дошки","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fboard-slice","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F03.board-slice",{"title":2257,"path":2258,"stem":2259},"Логіка Drag & Drop","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fdrag-and-drop-logic","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F04.drag-and-drop-logic",{"title":2261,"path":2262,"stem":2263},"Інтеграція з RTK Query","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Frtk-query-integration","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F05.rtk-query-integration",{"title":2265,"path":2266,"stem":2267},"Optimistic Updates","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Foptimistic-updates","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F06.optimistic-updates",{"title":2269,"icon":132,"path":2270,"stem":2271,"children":2272,"page":59},"Testing","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting","03.javascript\u002F04.react\u002F06.redux\u002F07.testing",[2273,2277,2281,2285,2289],{"title":2274,"path":2275,"stem":2276},"Тестування Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Fintro-testing","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F01.intro-testing",{"title":2278,"path":2279,"stem":2280},"Тестування Reducers","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-reducers","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F02.testing-reducers",{"title":2282,"path":2283,"stem":2284},"Тестування Селекторів","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-selectors","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F03.testing-selectors",{"title":2286,"path":2287,"stem":2288},"Тестування Компонентів (Integration)","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-components","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F04.testing-components",{"title":2290,"path":2291,"stem":2292},"Тестування Async Thunks","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-thunks","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F05.testing-thunks",{"title":2294,"icon":132,"path":2295,"stem":2296,"children":2297},"Ui Libraries","\u002Fjavascript\u002Freact\u002Fui-libraries","03.javascript\u002F04.react\u002F07.ui-libraries\u002Findex",[2298,2300,2304,2308,2312,2316,2320],{"title":2299,"path":2295,"stem":2296},"UI Бібліотеки в React",{"title":2301,"path":2302,"stem":2303},"Вступ до UI Бібліотек: Навіщо Винаходити Велосипед Двічі?","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fintroduction-to-ui-libraries","03.javascript\u002F04.react\u002F07.ui-libraries\u002F01.introduction-to-ui-libraries",{"title":2305,"path":2306,"stem":2307},"Філософія shadcn\u002Fui: \"Not a Component Library\"","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-philosophy","03.javascript\u002F04.react\u002F07.ui-libraries\u002F02.shadcn-philosophy",{"title":2309,"path":2310,"stem":2311},"Установка та Налаштування shadcn\u002Fui","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-installation","03.javascript\u002F04.react\u002F07.ui-libraries\u002F03.shadcn-installation",{"title":2313,"path":2314,"stem":2315},"Базові Компоненти shadcn\u002Fui: Фундамент Інтерфейсу","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-basics","03.javascript\u002F04.react\u002F07.ui-libraries\u002F04.shadcn-components-basics",{"title":2317,"path":2318,"stem":2319},"Компоненти Форм: Побудова Інтерактивних Form","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-forms","03.javascript\u002F04.react\u002F07.ui-libraries\u002F05.shadcn-components-forms",{"title":2321,"path":2322,"stem":2323},"Складні Компоненти: Dialog, Dropdown, Table та Command","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-advanced","03.javascript\u002F04.react\u002F07.ui-libraries\u002F06.shadcn-components-advanced",{"title":2325,"icon":2326,"path":2327,"stem":2328,"children":2329,"page":59},"TypeScript","i-devicon-typescript","\u002Fjavascript\u002Ftypescript","03.javascript\u002F05.typescript",[2330,2334,2338,2342,2346,2350,2354,2358],{"title":2331,"path":2332,"stem":2333},"TypeScript: Броня для вашого коду","\u002Fjavascript\u002Ftypescript\u002Fintro-and-basic-types","03.javascript\u002F05.typescript\u002F01.intro-and-basic-types",{"title":2335,"path":2336,"stem":2337},"Майстерність Моделювання Даних: Інтерфейси та Просунуті Типи","\u002Fjavascript\u002Ftypescript\u002Finterfaces-and-advanced-types","03.javascript\u002F05.typescript\u002F02.interfaces-and-advanced-types",{"title":2339,"path":2340,"stem":2341},"Алхімія Типів: Generics та Utility Types","\u002Fjavascript\u002Ftypescript\u002Fgenerics-and-utilities","03.javascript\u002F05.typescript\u002F03.generics-and-utilities",{"title":2343,"path":2344,"stem":2345},"Архітектура та Шаблони: Класи в TypeScript","\u002Fjavascript\u002Ftypescript\u002Fclasses-and-oop","03.javascript\u002F05.typescript\u002F04.classes-and-oop",{"title":2347,"path":2348,"stem":2349},"Продакшн та Екосистема: Advanced Config & Workflow","\u002Fjavascript\u002Ftypescript\u002Fadvanced-patterns-and-config","03.javascript\u002F05.typescript\u002F05.advanced-patterns-and-config",{"title":2351,"path":2352,"stem":2353},"TypeScript у світі React","\u002Fjavascript\u002Ftypescript\u002Freact-basics","03.javascript\u002F05.typescript\u002F06.react-basics",{"title":2355,"path":2356,"stem":2357},"React + TypeScript: Продвинуті патерни","\u002Fjavascript\u002Ftypescript\u002Freact-advanced","03.javascript\u002F05.typescript\u002F07.react-advanced",{"title":2359,"path":2360,"stem":2361},"React + TypeScript: Екосистема та бібліотеки","\u002Fjavascript\u002Ftypescript\u002Freact-ecosystem","03.javascript\u002F05.typescript\u002F08.react-ecosystem",{"title":2363,"path":2364,"stem":2365},"Atomic Design","\u002Fjavascript\u002Fatomic-design","03.javascript\u002F2.atomic-design",{"title":2367,"icon":2368,"path":2369,"stem":2370,"children":2371,"page":59},"Java","i-devicon-java","\u002Fjava","04.java",[2372,2375,2378,2382,2386,2390,2394],{"title":162,"path":2373,"stem":2374},"\u002Fjava\u002Fdata-mapper-part1","04.java\u002F01.data-mapper-part1",{"title":166,"path":2376,"stem":2377},"\u002Fjava\u002Fdata-mapper-part2","04.java\u002F02.data-mapper-part2",{"title":2379,"path":2380,"stem":2381},"Service Layer: Організація бізнес-логіки","\u002Fjava\u002Fservice-layer","04.java\u002F03.service-layer",{"title":2383,"path":2384,"stem":2385},"Rich Domain Model та State Pattern","\u002Fjava\u002Frich-domain-model","04.java\u002F04.rich-domain-model",{"title":2387,"path":2388,"stem":2389},"Патерни для складної бізнес-логіки","\u002Fjava\u002Fbusiness-logic-patterns","04.java\u002F05.business-logic-patterns",{"title":2391,"path":2392,"stem":2393},"Обробка помилок та валідація","\u002Fjava\u002Ferror-handling-validation","04.java\u002F06.error-handling-validation",{"title":2395,"path":2396,"stem":2397,"children":2398,"page":59},"Проектування баз даних","\u002Fjava\u002Fpr2","04.java\u002Fpr2",[2399,2403,2407,2411,2415,2419,2423,2427,2431,2435,2439,2443,2447,2451,2455,2459,2463,2467,2471,2475,2479,2483,2487,2491,2495,2499,2503,2507,2511,2515,2519,2523,2527,2531,2535,2539,2543],{"title":2400,"path":2401,"stem":2402},"Концептуальне моделювання: Мистецтво розуміння предметної області","\u002Fjava\u002Fpr2\u002Fconceptual-modeling","04.java\u002Fpr2\u002F01.conceptual-modeling",{"title":2404,"path":2405,"stem":2406},"Логічне моделювання: Від бізнес-ідей до структур даних","\u002Fjava\u002Fpr2\u002Flogical-modeling","04.java\u002Fpr2\u002F02.logical-modeling",{"title":2408,"path":2409,"stem":2410},"Нормалізація: Гігієна даних та боротьба з аномаліями","\u002Fjava\u002Fpr2\u002Fnormalization","04.java\u002Fpr2\u002F03.normalization",{"title":2412,"path":2413,"stem":2414},"Фізична схема: Від абстракції до DDL","\u002Fjava\u002Fpr2\u002Fphysical-schema","04.java\u002Fpr2\u002F04.physical-schema",{"title":2416,"path":2417,"stem":2418},"Архітектурна класифікація таблиць","\u002Fjava\u002Fpr2\u002Ftable-classification","04.java\u002Fpr2\u002F05.table-classification",{"title":2420,"path":2421,"stem":2422},"Database Migrations: Версіонування схеми з Flyway","\u002Fjava\u002Fpr2\u002Fdatabase-migrations","04.java\u002Fpr2\u002F06.database-migrations",{"title":2424,"path":2425,"stem":2426},"А що, якби це була не реляційна БД?","\u002Fjava\u002Fpr2\u002Fbeyond-relational","04.java\u002Fpr2\u002F07.beyond-relational",{"title":2428,"path":2429,"stem":2430},"Object-Relational Impedance Mismatch: Два світи, що не хочуть дружити","\u002Fjava\u002Fpr2\u002Fimpedance-mismatch","04.java\u002Fpr2\u002F09.impedance-mismatch",{"title":2432,"path":2433,"stem":2434},"JDBC: Перший контакт із базою даних","\u002Fjava\u002Fpr2\u002Fjdbc-fundamentals","04.java\u002Fpr2\u002F10.jdbc-fundamentals",{"title":2436,"path":2437,"stem":2438},"Якість коду: Spotless, SpotBugs та SonarQube","\u002Fjava\u002Fpr2\u002F10a.code-quality","04.java\u002Fpr2\u002F10a.code-quality",{"title":2440,"path":2441,"stem":2442},"Connection Pool: Патерн Object Pool для JDBC-з'єднань","\u002Fjava\u002Fpr2\u002Fconnection-pool","04.java\u002Fpr2\u002F11.connection-pool",{"title":2444,"path":2445,"stem":2446},"Row Data Gateway: Об'єкт як обгортка рядка таблиці","\u002Fjava\u002Fpr2\u002Frow-data-gateway","04.java\u002Fpr2\u002F12.row-data-gateway",{"title":2448,"path":2449,"stem":2450},"Table Data Gateway: Фасад таблиці як архітектурний відступ","\u002Fjava\u002Fpr2\u002Ftable-data-gateway","04.java\u002Fpr2\u002F13.table-data-gateway",{"title":2452,"path":2453,"stem":2454},"Repository + Data Mapper: Правильна шарова архітектура з JDBC","\u002Fjava\u002Fpr2\u002Frepository-data-mapper","04.java\u002Fpr2\u002F14.repository-data-mapper",{"title":2456,"path":2457,"stem":2458},"Identity Map: Кешування сутностей у рамках сесії","\u002Fjava\u002Fpr2\u002Fidentity-map","04.java\u002Fpr2\u002F15.identity-map",{"title":2460,"path":2461,"stem":2462},"Unit of Work: Відстеження змін і координація JDBC-транзакцій","\u002Fjava\u002Fpr2\u002Funit-of-work","04.java\u002Fpr2\u002F16.unit-of-work",{"title":2464,"path":2465,"stem":2466},"Strategy: Замінювані SQL-стратегії для підтримки різних СУБД","\u002Fjava\u002Fpr2\u002Fstrategy-sql","04.java\u002Fpr2\u002F17.strategy-sql",{"title":2468,"path":2469,"stem":2470},"Proxy: Lazy Loading для One-To-Many колекцій","\u002Fjava\u002Fpr2\u002Fproxy-lazy-loading","04.java\u002Fpr2\u002F18.proxy-lazy-loading",{"title":2472,"path":2473,"stem":2474},"Generic Repository через Java Reflection: анотації та динамічний SQL","\u002Fjava\u002Fpr2\u002Fgeneric-repository-reflection","04.java\u002Fpr2\u002F19.generic-repository-reflection",{"title":2476,"path":2477,"stem":2478},"Specification Pattern: Композиція бізнес-правил для складних запитів","\u002Fjava\u002Fpr2\u002Fspecification-pattern","04.java\u002Fpr2\u002F20.specification-pattern",{"title":2480,"path":2481,"stem":2482},"Розширені можливості Specification Pattern: підзапити, агрегації та гібридний підхід","\u002Fjava\u002Fpr2\u002F20a.advanced-specifications","04.java\u002Fpr2\u002F20a.advanced-specifications",{"title":2484,"path":2485,"stem":2486},"Асинхронність у JDBC: Від блокуючих викликів до CompletableFuture","\u002Fjava\u002Fpr2\u002Fasynchronous-jdbc","04.java\u002Fpr2\u002F21.asynchronous-jdbc",{"title":2488,"path":2489,"stem":2490},"Інтеграційне тестування JDBC-репозиторіїв: Embedded H2 та патерн AAA","\u002Fjava\u002Fpr2\u002Fintegration-testing-h2","04.java\u002Fpr2\u002F22.integration-testing-h2",{"title":2492,"path":2493,"stem":2494},"Testcontainers: Тестування з реальною PostgreSQL у Docker-контейнерах","\u002Fjava\u002Fpr2\u002Fintegration-testing-testcontainers","04.java\u002Fpr2\u002F23.integration-testing-testcontainers",{"title":2496,"path":2497,"stem":2498},"Google Guice: Впровадження залежностей у JavaFX-проєкті","\u002Fjava\u002Fpr2\u002Fdependency-injection-guice","04.java\u002Fpr2\u002F24.dependency-injection-guice",{"title":2500,"path":2501,"stem":2502},"JavaFX: Основи побудови графічних інтерфейсів","\u002Fjava\u002Fpr2\u002Fjavafx-fundamentals","04.java\u002Fpr2\u002F25.javafx-fundamentals",{"title":2504,"path":2505,"stem":2506},"Properties та Bindings: Реактивність у JavaFX","\u002Fjava\u002Fpr2\u002Fjavafx-properties-bindings","04.java\u002Fpr2\u002F26.javafx-properties-bindings",{"title":2508,"path":2509,"stem":2510},"MVC vs MVP vs MVVM: Еволюція архітектурних патернів UI","\u002Fjava\u002Fpr2\u002Fui-architecture-patterns","04.java\u002Fpr2\u002F27.ui-architecture-patterns",{"title":2512,"path":2513,"stem":2514},"MVVM на практиці: Побудова ViewModel","\u002Fjava\u002Fpr2\u002Fmvvm-viewmodel-implementation","04.java\u002Fpr2\u002F28.mvvm-viewmodel-implementation",{"title":2516,"path":2517,"stem":2518},"View та Controller: Зв'язування з ViewModel через FXML","\u002Fjava\u002Fpr2\u002Fmvvm-view-controller","04.java\u002Fpr2\u002F29.mvvm-view-controller",{"title":2520,"path":2521,"stem":2522},"Інтеграція MVVM з Guice: Автоматична ін'єкція залежностей","\u002Fjava\u002Fpr2\u002Fmvvm-guice-integration","04.java\u002Fpr2\u002F30.mvvm-guice-integration",{"title":2524,"path":2525,"stem":2526},"Валідація та обробка помилок у MVVM","\u002Fjava\u002Fpr2\u002Fmvvm-validation-error-handling","04.java\u002Fpr2\u002F31.mvvm-validation-error-handling",{"title":2528,"path":2529,"stem":2530},"Навігація та управління екранами у JavaFX MVVM","\u002Fjava\u002Fpr2\u002Fmvvm-navigation-screen-management","04.java\u002Fpr2\u002F32.mvvm-navigation-screen-management",{"title":2532,"path":2533,"stem":2534},"Тестування JavaFX MVVM-додатків","\u002Fjava\u002Fpr2\u002Fmvvm-testing","04.java\u002Fpr2\u002F33.mvvm-testing",{"title":2536,"path":2537,"stem":2538},"Стилізація та теми у JavaFX: CSS та User Experience","\u002Fjava\u002Fpr2\u002Fjavafx-styling-themes","04.java\u002Fpr2\u002F34.javafx-styling-themes",{"title":2540,"path":2541,"stem":2542},"AtlantaFX: Сучасні теми для JavaFX додатків","\u002Fjava\u002Fpr2\u002Fatlantafx-modern-themes","04.java\u002Fpr2\u002F35.atlantafx-modern-themes",{"title":2544,"path":2545,"stem":2546},"Пакування та розповсюдження JavaFX-додатків","\u002Fjava\u002Fpr2\u002Fjar-packaging-distribution","04.java\u002Fpr2\u002F36.jar-packaging-distribution",{"title":2548,"icon":2549,"path":2550,"stem":2551,"children":2552,"page":59},"Python","i-devicon-python","\u002Fpython","05.python",[2553,2557,2560,2564,2568,2572,2576,2580,2584,2588,2592,2596,2600,2604,2608,2669],{"title":2554,"path":2555,"stem":2556},"Модулі, Пакети та Віртуальні Середовища","\u002Fpython\u002Fmodules-packages-venv","05.python\u002F00.modules-packages-venv",{"title":71,"path":2558,"stem":2559},"\u002Fpython\u002Fclasses-objects","05.python\u002F01.classes-objects",{"title":2561,"path":2562,"stem":2563},"Інкапсуляція, Керування Доступом та Властивості","\u002Fpython\u002Fencapsulation","05.python\u002F02.encapsulation",{"title":2565,"path":2566,"stem":2567},"Наслідування, MRO та суперсила super()","\u002Fpython\u002Finheritance-mro","05.python\u002F03.inheritance-mro",{"title":2569,"path":2570,"stem":2571},"Абстракція — ABC проти Статичних Протоколів (PEP 544)","\u002Fpython\u002Fabstraction-protocols","05.python\u002F04.abstraction-protocols",{"title":2573,"path":2574,"stem":2575},"Магічні методи (Dunder) та Емуляція протоколів","\u002Fpython\u002Fdunder-methods","05.python\u002F05.dunder-methods",{"title":2577,"path":2578,"stem":2579},"Декоратори та Керування життєвим циклом методів","\u002Fpython\u002Fdecorators-static-class","05.python\u002F06.decorators-static-class",{"title":2581,"path":2582,"stem":2583},"Дескриптори — Магія доступу до атрибутів","\u002Fpython\u002Fdescriptors","05.python\u002F07.descriptors",{"title":2585,"path":2586,"stem":2587},"Метакласи — Динамічне створення класів під капотом CPython","\u002Fpython\u002Fmetaclasses","05.python\u002F08.metaclasses",{"title":2589,"path":2590,"stem":2591},"Dataclasses, NamedTuple та сучасні контейнери Python","\u002Fpython\u002Fmodern-containers","05.python\u002F09.modern-containers",{"title":2593,"path":2594,"stem":2595},"GIL та модель конкурентності CPython — фундамент перед потоками і процесами","\u002Fpython\u002Fgil-concurrency-intro","05.python\u002F11.gil-concurrency-intro",{"title":2597,"path":2598,"stem":2599},"Threading — конкурентність для I\u002FO-bound задач","\u002Fpython\u002Fthreading","05.python\u002F12.threading",{"title":2601,"path":2602,"stem":2603},"Multiprocessing — справжній паралелізм для CPU-bound задач","\u002Fpython\u002Fmultiprocessing","05.python\u002F13.multiprocessing",{"title":2605,"path":2606,"stem":2607},"asyncio — кооперативна конкурентність та event loop","\u002Fpython\u002Fasyncio","05.python\u002F14.asyncio",{"title":2609,"icon":92,"path":2610,"stem":2611,"children":2612,"page":59},"FastAPI","\u002Fpython\u002Ffastapi","05.python\u002Ffastapi",[2613,2617,2621,2625,2629,2633,2637,2641,2645,2649,2653,2657,2661,2665],{"title":2614,"path":2615,"stem":2616},"Глибокий Typing та Pydantic v2 — від анотацій до валідації","\u002Fpython\u002Ffastapi\u002Ftyping-pydantic","05.python\u002Ffastapi\u002F15.typing-pydantic",{"title":2618,"path":2619,"stem":2620},"WSGI, ASGI та Python Web-екосистема","\u002Fpython\u002Ffastapi\u002Fwsgi-asgi-ecosystem","05.python\u002Ffastapi\u002F16.wsgi-asgi-ecosystem",{"title":2622,"path":2623,"stem":2624},"FastAPI: Перший додаток, Uvicorn та OpenAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-intro","05.python\u002Ffastapi\u002F17.fastapi-intro",{"title":2626,"path":2627,"stem":2628},"Маршрутизація, параметри запитів та APIRouter","\u002Fpython\u002Ffastapi\u002Ffastapi-routing-params","05.python\u002Ffastapi\u002F18.fastapi-routing-params",{"title":2630,"path":2631,"stem":2632},"Pydantic v2 у FastAPI — схеми, валідація та серіалізація","\u002Fpython\u002Ffastapi\u002Ffastapi-pydantic-schemas","05.python\u002Ffastapi\u002F19.fastapi-pydantic-schemas",{"title":2634,"path":2635,"stem":2636},"Dependency Injection — серце архітектури FastAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-dependency-injection","05.python\u002Ffastapi\u002F20.fastapi-dependency-injection",{"title":2638,"path":2639,"stem":2640},"Обробка помилок, Middleware та CORS у FastAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-errors-middleware","05.python\u002Ffastapi\u002F21.fastapi-errors-middleware",{"title":2642,"path":2643,"stem":2644},"SQLAlchemy 2.0 — ORM, Core та Async Engine","\u002Fpython\u002Ffastapi\u002Fsqlalchemy-orm","05.python\u002Ffastapi\u002F22.sqlalchemy-orm",{"title":2646,"path":2647,"stem":2648},"Alembic — міграції бази даних","\u002Fpython\u002Ffastapi\u002Falembic-migrations","05.python\u002Ffastapi\u002F23.alembic-migrations",{"title":2650,"path":2651,"stem":2652},"Repository Pattern та Clean Architecture у FastAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-repository-clean-arch","05.python\u002Ffastapi\u002F24.fastapi-repository-clean-arch",{"title":2654,"path":2655,"stem":2656},"Автентифікація та авторизація — JWT, OAuth2, RBAC","\u002Fpython\u002Ffastapi\u002Ffastapi-auth-security","05.python\u002Ffastapi\u002F25.fastapi-auth-security",{"title":2658,"path":2659,"stem":2660},"Тестування FastAPI — pytest, httpx, fixtures","\u002Fpython\u002Ffastapi\u002Ffastapi-testing","05.python\u002Ffastapi\u002F26.fastapi-testing",{"title":2662,"path":2663,"stem":2664},"Async на повну — Background Tasks, WebSockets, SSE та Celery","\u002Fpython\u002Ffastapi\u002Ffastapi-async-advanced","05.python\u002Ffastapi\u002F27.fastapi-async-advanced",{"title":2666,"path":2667,"stem":2668},"Deployment — Docker, CI\u002FCD, Monitoring","\u002Fpython\u002Ffastapi\u002Ffastapi-deployment","05.python\u002Ffastapi\u002F28.fastapi-deployment",{"title":2670,"path":2671,"stem":2672},"[object Object]","\u002Fpython\u002Foop-plan","05.python\u002Foop-plan",{"title":2674,"icon":2675,"path":2676,"stem":2677,"children":2678,"page":59},"Бази даних","i-lucide-database","\u002Fdatabases","06.databases",[2679,2709,2732,2769,2798,2816,2850,2862,2871],{"title":2680,"icon":2681,"path":2682,"stem":2683,"children":2684,"page":59},"Intro","i-lucide-play","\u002Fdatabases\u002Fintro","06.databases\u002F01.intro",[2685,2689,2693,2697,2701,2705],{"title":2686,"path":2687,"stem":2688},"Введення в теорію баз даних","\u002Fdatabases\u002Fintro\u002Fintroduction-to-databases","06.databases\u002F01.intro\u002F01.introduction-to-databases",{"title":2690,"path":2691,"stem":2692},"Реляційна модель даних","\u002Fdatabases\u002Fintro\u002Frelational-model-theory","06.databases\u002F01.intro\u002F02.relational-model-theory",{"title":2694,"path":2695,"stem":2696},"ER-моделювання","\u002Fdatabases\u002Fintro\u002Fer-modeling","06.databases\u002F01.intro\u002F03.er-modeling",{"title":2698,"path":2699,"stem":2700},"Логічне проектування БД","\u002Fdatabases\u002Fintro\u002Flogical-schema","06.databases\u002F01.intro\u002F04.logical-schema",{"title":2702,"path":2703,"stem":2704},"Класифікація таблиць","\u002Fdatabases\u002Fintro\u002Ftable-classification","06.databases\u002F01.intro\u002F05.table-classification",{"title":2706,"path":2707,"stem":2708},"PlantUML для баз даних","\u002Fdatabases\u002Fintro\u002Fplantuml-diagrams","06.databases\u002F01.intro\u002F06.plantuml-diagrams",{"title":2710,"icon":2675,"path":2711,"stem":2712,"children":2713,"page":59},"MS SQL Server Start","\u002Fdatabases\u002Fms-sql-server-start","06.databases\u002F02.ms-sql-server-start",[2714,2718,2724,2728],{"title":2715,"path":2716,"stem":2717},"Типи даних у MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fdata-types","06.databases\u002F02.ms-sql-server-start\u002F01.data-types",{"title":2719,"path":2720,"stem":2721,"children":2722},"Індекси у MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fsql-indexes","06.databases\u002F02.ms-sql-server-start\u002F02.sql-indexes",[2723],{"title":2719,"path":2720,"stem":2721},{"title":2725,"path":2726,"stem":2727},"Системні бази даних MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fsystem-databases","06.databases\u002F02.ms-sql-server-start\u002F03.system-databases",{"title":2729,"path":2730,"stem":2731},"Огляд мови SQL та запитів","\u002Fdatabases\u002Fms-sql-server-start\u002Fsql-queries-overview","06.databases\u002F02.ms-sql-server-start\u002F04.sql-queries-overview",{"title":2733,"icon":2675,"path":2734,"stem":2735,"children":2736,"page":59},"SQL","\u002Fdatabases\u002Fsql","06.databases\u002F03.sql",[2737,2741,2745,2749,2753,2757,2761,2765],{"title":2738,"path":2739,"stem":2740},"Налаштування демонстраційної бази даних","\u002Fdatabases\u002Fsql\u002Fsample-database-setup","06.databases\u002F03.sql\u002F00.sample-database-setup",{"title":2742,"path":2743,"stem":2744},"DDL - Створення таблиць (CREATE TABLE)","\u002Fdatabases\u002Fsql\u002Fddl-create-table","06.databases\u002F03.sql\u002F01.ddl-create-table",{"title":2746,"path":2747,"stem":2748},"DDL - Зміна та видалення таблиць (ALTER, DROP)","\u002Fdatabases\u002Fsql\u002Fddl-alter-drop-table","06.databases\u002F03.sql\u002F02.ddl-alter-drop-table",{"title":2750,"path":2751,"stem":2752},"SELECT запити - Основи","\u002Fdatabases\u002Fsql\u002Fselect-queries-fundamentals","06.databases\u002F03.sql\u002F03.select-queries-fundamentals",{"title":2754,"path":2755,"stem":2756},"SELECT запити - Розширені можливості","\u002Fdatabases\u002Fsql\u002Fselect-queries-advanced","06.databases\u002F03.sql\u002F04.select-queries-advanced",{"title":2758,"path":2759,"stem":2760},"INSERT запити - Додавання даних","\u002Fdatabases\u002Fsql\u002Finsert-queries","06.databases\u002F03.sql\u002F05.insert-queries",{"title":2762,"path":2763,"stem":2764},"UPDATE та DELETE запити","\u002Fdatabases\u002Fsql\u002Fupdate-delete-queries","06.databases\u002F03.sql\u002F06.update-delete-queries",{"title":2766,"path":2767,"stem":2768},"Транзакції в SQL","\u002Fdatabases\u002Fsql\u002Ftransactions","06.databases\u002F03.sql\u002F07.transactions",{"title":2770,"icon":2675,"path":2771,"stem":2772,"children":2773,"page":59},"Multi Table Databases","\u002Fdatabases\u002Fmulti-table-databases","06.databases\u002F04.multi-table-databases",[2774,2778,2782,2786,2790,2794],{"title":2775,"path":2776,"stem":2777},"Зв'язки та нормалізація БД","\u002Fdatabases\u002Fmulti-table-databases\u002Frelationships-and-normalization","06.databases\u002F04.multi-table-databases\u002F00.relationships-and-normalization",{"title":2779,"path":2780,"stem":2781},"INNER JOIN - З'єднання таблиць","\u002Fdatabases\u002Fmulti-table-databases\u002Finner-join","06.databases\u002F04.multi-table-databases\u002F01.inner-join",{"title":2783,"path":2784,"stem":2785},"OUTER JOINs - LEFT, RIGHT, FULL","\u002Fdatabases\u002Fmulti-table-databases\u002Fouter-joins","06.databases\u002F04.multi-table-databases\u002F02.outer-joins",{"title":2787,"path":2788,"stem":2789},"CROSS та SELF JOINs","\u002Fdatabases\u002Fmulti-table-databases\u002Fcross-self-joins","06.databases\u002F04.multi-table-databases\u002F03.cross-self-joins",{"title":2791,"path":2792,"stem":2793},"Підзапити (Subqueries)","\u002Fdatabases\u002Fmulti-table-databases\u002Fsubqueries","06.databases\u002F04.multi-table-databases\u002F04.subqueries",{"title":2795,"path":2796,"stem":2797},"Агрегації з JOIN","\u002Fdatabases\u002Fmulti-table-databases\u002Faggregations-with-joins","06.databases\u002F04.multi-table-databases\u002F05.aggregations-with-joins",{"title":2799,"icon":2800,"path":2801,"stem":2802,"children":2803,"page":59},"Aggregate Functions","i-lucide-calculator","\u002Fdatabases\u002Faggregate-functions","06.databases\u002F05.aggregate-functions",[2804,2808,2812],{"title":2805,"path":2806,"stem":2807},"Функції агрегування в MS SQL Server","\u002Fdatabases\u002Faggregate-functions\u002Fintroduction-aggregate-functions","06.databases\u002F05.aggregate-functions\u002F01.introduction-aggregate-functions",{"title":2809,"path":2810,"stem":2811},"Групування даних в MS SQL Server","\u002Fdatabases\u002Faggregate-functions\u002Fgrouping-data","06.databases\u002F05.aggregate-functions\u002F02.grouping-data",{"title":2813,"path":2814,"stem":2815},"Підзапити з агрегатними функціями","\u002Fdatabases\u002Faggregate-functions\u002Fsubqueries-aggregates","06.databases\u002F05.aggregate-functions\u002F03.subqueries-aggregates",{"title":2817,"icon":2818,"path":2819,"stem":2820,"children":2821,"page":59},"Тригери та зберігаємі процедури","i-lucide-database-zap","\u002Fdatabases\u002Ftriggers-stored-procedures","06.databases\u002F07.triggers-stored-procedures",[2822,2826,2830,2834,2838,2842,2846],{"title":2823,"path":2824,"stem":2825},"DML-тригери","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fdml-triggers","06.databases\u002F07.triggers-stored-procedures\u002F01.dml-triggers",{"title":2827,"path":2828,"stem":2829},"DDL-тригери","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fddl-triggers","06.databases\u002F07.triggers-stored-procedures\u002F02.ddl-triggers",{"title":2831,"path":2832,"stem":2833},"Transact-SQL розширення","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Ftransact-sql-extensions","06.databases\u002F07.triggers-stored-procedures\u002F03.transact-sql-extensions",{"title":2835,"path":2836,"stem":2837},"Транзакції","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Ftransactions","06.databases\u002F07.triggers-stored-procedures\u002F04.transactions",{"title":2839,"path":2840,"stem":2841},"Зберігаємі процедури","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fstored-procedures","06.databases\u002F07.triggers-stored-procedures\u002F05.stored-procedures",{"title":2843,"path":2844,"stem":2845},"Користувацькі функції","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fuser-defined-functions","06.databases\u002F07.triggers-stored-procedures\u002F06.user-defined-functions",{"title":2847,"path":2848,"stem":2849},"Безпека баз даних","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fsecurity","06.databases\u002F07.triggers-stored-procedures\u002F08.security",{"title":2847,"icon":793,"path":2851,"stem":2852,"children":2853,"page":59},"\u002Fdatabases\u002Fsecurity","06.databases\u002F08.security",[2854,2858],{"title":2855,"path":2856,"stem":2857},"Вступ до безпеки баз даних","\u002Fdatabases\u002Fsecurity\u002Fintroduction","06.databases\u002F08.security\u002F01.introduction",{"title":2859,"path":2860,"stem":2861},"Системні представлення та метадані","\u002Fdatabases\u002Fsecurity\u002Fsystem-views","06.databases\u002F08.security\u002F02.system-views",{"title":2863,"icon":2864,"path":2865,"stem":2866,"children":2867,"page":59},"Резервне копіювання та відновлення","i-lucide-database-backup","\u002Fdatabases\u002Fbackup-recovery","06.databases\u002F09.backup-recovery",[2868],{"title":2863,"path":2869,"stem":2870},"\u002Fdatabases\u002Fbackup-recovery\u002Fbackup-restore","06.databases\u002F09.backup-recovery\u002F01.backup-restore",{"title":2872,"icon":2873,"path":2874,"stem":2875,"children":2876,"page":59},"Повнотекстовий пошук","i-lucide-search","\u002Fdatabases\u002Ffull-text-search","06.databases\u002F10.full-text-search",[2877],{"title":2872,"path":2878,"stem":2879},"\u002Fdatabases\u002Ffull-text-search\u002Ffull-text-search","06.databases\u002F10.full-text-search\u002F01.full-text-search",{"title":2881,"icon":2882,"path":2883,"stem":2884,"children":2885,"page":59},"Tools","i-lucide-wrench","\u002Ftools","07.tools",[2886,2962],{"title":2887,"icon":2888,"path":2889,"stem":2890,"children":2891},"Docker","i-simple-icons-docker","\u002Ftools\u002Fdocker","07.tools\u002F01.docker\u002Findex",[2892,2894,2898,2902,2906,2910,2914,2918,2922,2926,2930,2934,2938,2942,2946,2950,2954,2958],{"title":2893,"path":2889,"stem":2890},"Docker: від нуля до production",{"title":2895,"path":2896,"stem":2897},"Контейнеризація — від проблеми до рішення","\u002Ftools\u002Fdocker\u002Fcontainerization-concept","07.tools\u002F01.docker\u002F01.containerization-concept",{"title":2899,"path":2900,"stem":2901},"Docker — що це і навіщо?","\u002Ftools\u002Fdocker\u002Fdocker-what-and-why","07.tools\u002F01.docker\u002F02.docker-what-and-why",{"title":2903,"path":2904,"stem":2905},"Архітектура Docker Engine","\u002Ftools\u002Fdocker\u002Fdocker-architecture","07.tools\u002F01.docker\u002F03.docker-architecture",{"title":2907,"path":2908,"stem":2909},"Встановлення Docker","\u002Ftools\u002Fdocker\u002Finstallation","07.tools\u002F01.docker\u002F04.installation",{"title":2911,"path":2912,"stem":2913},"Перший контейнер — docker run","\u002Ftools\u002Fdocker\u002Ffirst-container","07.tools\u002F01.docker\u002F05.first-container",{"title":2915,"path":2916,"stem":2917},"Життєвий цикл контейнера","\u002Ftools\u002Fdocker\u002Fcontainer-lifecycle","07.tools\u002F01.docker\u002F06.container-lifecycle",{"title":2919,"path":2920,"stem":2921},"Docker Images — фундаментальні концепції","\u002Ftools\u002Fdocker\u002Fdocker-images-fundamentals","07.tools\u002F01.docker\u002F07.docker-images-fundamentals",{"title":2923,"path":2924,"stem":2925},"Dockerfile — основи","\u002Ftools\u002Fdocker\u002Fdockerfile-basics","07.tools\u002F01.docker\u002F08.dockerfile-basics",{"title":2927,"path":2928,"stem":2929},"Dockerfile — просунуті техніки","\u002Ftools\u002Fdocker\u002Fdockerfile-advanced","07.tools\u002F01.docker\u002F09.dockerfile-advanced",{"title":2931,"path":2932,"stem":2933},"Build Context та кешування шарів","\u002Ftools\u002Fdocker\u002Fbuild-context-and-cache","07.tools\u002F01.docker\u002F10.build-context-and-cache",{"title":2935,"path":2936,"stem":2937},"Реєстри Docker-образів","\u002Ftools\u002Fdocker\u002Fimage-registries","07.tools\u002F01.docker\u002F11.image-registries",{"title":2939,"path":2940,"stem":2941},"Контейнеризація .NET додатків","\u002Ftools\u002Fdocker\u002Fdotnet-containerization","07.tools\u002F01.docker\u002F12.dotnet-containerization",{"title":2943,"path":2944,"stem":2945},"Томи та збереження даних","\u002Ftools\u002Fdocker\u002Fvolumes-and-data","07.tools\u002F01.docker\u002F13.volumes-and-data",{"title":2947,"path":2948,"stem":2949},"Основи мережі в Docker","\u002Ftools\u002Fdocker\u002Fnetworking-basics","07.tools\u002F01.docker\u002F14.networking-basics",{"title":2951,"path":2952,"stem":2953},"Змінні оточення та конфігурація","\u002Ftools\u002Fdocker\u002Fenvironment-and-configuration","07.tools\u002F01.docker\u002F15.environment-and-configuration",{"title":2955,"path":2956,"stem":2957},"Docker Compose — оркестрація контейнерів","\u002Ftools\u002Fdocker\u002Fdocker-compose-basics","07.tools\u002F01.docker\u002F16.docker-compose-basics",{"title":2959,"path":2960,"stem":2961},"Docker Compose — Multi-Service застосунки","\u002Ftools\u002Fdocker\u002Fcompose-multi-service","07.tools\u002F01.docker\u002F17.compose-multi-service",{"title":2963,"icon":2964,"path":2965,"stem":2966,"children":2967},"Kubernetes","simple-icons:kubernetes","\u002Ftools\u002Fkubernetes","07.tools\u002F02.kubernetes\u002Findex",[2968,2970,2974,2978,2982,2986,2990,2994,2998],{"title":2969,"path":2965,"stem":2966},"Kubernetes: від розробки до production",{"title":2971,"path":2972,"stem":2973},"Kubernetes — коли Docker Compose більше не вистачає","\u002Ftools\u002Fkubernetes\u002Fwhy-kubernetes","07.tools\u002F02.kubernetes\u002F01.why-kubernetes",{"title":2975,"path":2976,"stem":2977},"Архітектура Kubernetes — анатомія кластера","\u002Ftools\u002Fkubernetes\u002Fkubernetes-architecture","07.tools\u002F02.kubernetes\u002F02.kubernetes-architecture",{"title":2979,"path":2980,"stem":2981},"Локальне середовище — minikube, kind та k3s","\u002Ftools\u002Fkubernetes\u002Flocal-environment","07.tools\u002F02.kubernetes\u002F03.local-environment",{"title":2983,"path":2984,"stem":2985},"Pod — атомарна одиниця Kubernetes","\u002Ftools\u002Fkubernetes\u002Fpods-and-containers","07.tools\u002F02.kubernetes\u002F04.pods-and-containers",{"title":2987,"path":2988,"stem":2989},"Патерни використання Pod","\u002Ftools\u002Fkubernetes\u002Fpod-patterns","07.tools\u002F02.kubernetes\u002F05.pod-patterns",{"title":2991,"path":2992,"stem":2993},"Deployment — декларативне управління Pod","\u002Ftools\u002Fkubernetes\u002Fdeployment-basics","07.tools\u002F02.kubernetes\u002F06.deployment-basics",{"title":2995,"path":2996,"stem":2997},"Rolling Updates та управління життєвим циклом Deployment","\u002Ftools\u002Fkubernetes\u002Fdeployment-rolling-updates","07.tools\u002F02.kubernetes\u002F07.deployment-rolling-updates",{"title":2999,"path":3000,"stem":3001},"Service — мережева абстракція для Pod","\u002Ftools\u002Fkubernetes\u002Fservices-networking","07.tools\u002F02.kubernetes\u002F08.services-networking",{"title":3003,"icon":3004,"path":3005,"stem":3006,"children":3007,"page":59},"Software Engineering","i-lucide-code-2","\u002Fsoftware-engineering","09.software-engineering",[3008,3012,3016,3020,3024,3028,3032,3036,3040,3044,3048],{"title":3009,"path":3010,"stem":3011},"1. Аналіз предметної області. Експертні знання та складність","\u002Fsoftware-engineering\u002Fintro-subdomains","09.software-engineering\u002F01.intro-subdomains",{"title":3013,"path":3014,"stem":3015},"2. Обмежені контексти. Інтеграція обмежених контекстів","\u002Fsoftware-engineering\u002Fintegrating-limited-contexts","09.software-engineering\u002F02.integrating-limited-contexts",{"title":3017,"path":3018,"stem":3019},"3. Реалізація простої бізнес-логіки","\u002Fsoftware-engineering\u002Fsimple","09.software-engineering\u002F03.simple",{"title":3021,"path":3022,"stem":3023},"4. Опрацювання складної бізнес-логіки","\u002Fsoftware-engineering\u002Fcomplex-business-logic","09.software-engineering\u002F04.complex-business-logic",{"title":3025,"path":3026,"stem":3027},"5. Моделювання фактора часу. Подієво-орієнтована архітектура.","\u002Fsoftware-engineering\u002Fmodelling-the-time-factor","09.software-engineering\u002F05.modelling-the-time-factor",{"title":3029,"path":3030,"stem":3031},"6. Архітектурні патерни","\u002Fsoftware-engineering\u002Farchitectural-patterns","09.software-engineering\u002F06.architectural-patterns",{"title":3033,"path":3034,"stem":3035},"Паттерни взаємодії","\u002Fsoftware-engineering\u002Fpatterns-of-interaction","09.software-engineering\u002F07.patterns-of-interaction",{"title":3037,"path":3038,"stem":3039},"Евристика проєктування","\u002Fsoftware-engineering\u002Fdesign-heuristics","09.software-engineering\u002F08.design-heuristics",{"title":3041,"path":3042,"stem":3043},"Еволюція проєктних рішень","\u002Fsoftware-engineering\u002Fevolution-of-design-solutions","09.software-engineering\u002F09.evolution-of-design-solutions",{"title":3045,"path":3046,"stem":3047},"EventStorming","\u002Fsoftware-engineering\u002Feventstorming","09.software-engineering\u002F10.eventstorming",{"title":3049,"path":3050,"stem":3051},"DDD на практиці","\u002Fsoftware-engineering\u002Fddd-in-practice","09.software-engineering\u002F11.ddd-in-practice",{"title":3053,"icon":943,"path":3054,"stem":3055,"children":3056,"page":59},"DDD","\u002Fddd","10.ddd",[3057,3061,3065,3069,3073,3077,3081,3085,3089,3093,3097,3101,3105],{"title":3058,"path":3059,"stem":3060},"Аналіз предметної області","\u002Fddd\u002Fdomain-analysis","10.ddd\u002F01.domain-analysis",{"title":3062,"path":3063,"stem":3064},"Експертні знання про предметну область","\u002Fddd\u002Fdomain-expert-knowledge","10.ddd\u002F02.domain-expert-knowledge",{"title":3066,"path":3067,"stem":3068},"Як осмислити складність предметної області","\u002Fddd\u002Fmanaging-domain-complexity","10.ddd\u002F03.managing-domain-complexity",{"title":3070,"path":3071,"stem":3072},"Інтеграція обмежених контекстів","\u002Fddd\u002Fbounded-context-integration","10.ddd\u002F04.bounded-context-integration",{"title":3074,"path":3075,"stem":3076},"Реалізація простої бізнес-логіки","\u002Fddd\u002Fsimple-business-logic","10.ddd\u002F05.simple-business-logic",{"title":3078,"path":3079,"stem":3080},"Обробка складної бізнес-логіки","\u002Fddd\u002Fcomplex-business-logic","10.ddd\u002F06.complex-business-logic",{"title":3082,"path":3083,"stem":3084},"Моделювання фактора часу","\u002Fddd\u002Ftime-modeling","10.ddd\u002F07.time-modeling",{"title":3086,"path":3087,"stem":3088},"Глава 8. Архітектурні Патерни","\u002Fddd\u002Farchitectural-patterns","10.ddd\u002F08.architectural-patterns",{"title":3090,"path":3091,"stem":3092},"Глава 9. Патерни Взаємодії","\u002Fddd\u002Finteraction-patterns","10.ddd\u002F09.interaction-patterns",{"title":3094,"path":3095,"stem":3096},"Глава 10. Проектні Евристики","\u002Fddd\u002Fdesign-heuristics","10.ddd\u002F10.design-heuristics",{"title":3098,"path":3099,"stem":3100},"Глава 11. Еволюція Проектних Рішень","\u002Fddd\u002Fevolution-of-design-decisions","10.ddd\u002F11.evolution-of-design-decisions",{"title":3102,"path":3103,"stem":3104},"Глава 12. EventStorming","\u002Fddd\u002Fevent-storming","10.ddd\u002F12.event-storming",{"title":3106,"path":3107,"stem":3108},"Глава 13. DDD на Практиці","\u002Fddd\u002Fddd-in-practice","10.ddd\u002F13.ddd-in-practice",{"title":3110,"icon":3111,"path":3112,"stem":3113,"children":3114,"page":59},"Media Streaming","i-lucide-video","\u002Fmedia-streaming","11.media-streaming",[3115,3119,3123,3127,3131,3135,3139],{"title":3116,"path":3117,"stem":3118},"01. Магія Стрімінгу: Що відбувається, коли ви натискаєте \"Play\"","\u002Fmedia-streaming\u002Fintroduction","11.media-streaming\u002F01.introduction",{"title":3120,"path":3121,"stem":3122},"02. Анатомія Медіа: Кодеки, Контейнери та Стиснення","\u002Fmedia-streaming\u002Faudio-video-anatomy","11.media-streaming\u002F02.audio-video-anatomy",{"title":3124,"path":3125,"stem":3126},"03. The Gym: FFmpeg Deep Dive","\u002Fmedia-streaming\u002Fffmpeg-gym","11.media-streaming\u002F03.ffmpeg-gym",{"title":3128,"path":3129,"stem":3130},"04. HLS Protocol: HTTP Live Streaming у Деталях","\u002Fmedia-streaming\u002Fhls-protocol","11.media-streaming\u002F04.hls-protocol",{"title":3132,"path":3133,"stem":3134},"05. DASH Protocol: Відкритий Стандарт","\u002Fmedia-streaming\u002Fdash-protocol","11.media-streaming\u002F05.dash-protocol",{"title":3136,"path":3137,"stem":3138},"06. Масштабування: CDN та Adaptive Bitrate","\u002Fmedia-streaming\u002Fcdn-and-adaptive-bitrate","11.media-streaming\u002F06.cdn-and-adaptive-bitrate",{"title":3140,"path":3141,"stem":3142},"07. Війна із Затримкою (Latency)","\u002Fmedia-streaming\u002Frealtime-latency","11.media-streaming\u002F07.realtime-latency",{"title":3144,"icon":3145,"path":3146,"stem":3147,"children":3148,"page":59},"HTML & CSS","i-devicon-html5","\u002Fhtml-css","12.html-css",[3149,3153,3157,3161,3165,3169,3173,3177,3181,3185,3189,3193,3197,3201,3205,3209,3213,3217,3221,3225,3229,3233,3237,3241,3245,3249,3253,3257,3261,3265],{"title":3150,"path":3151,"stem":3152},"Вступ до HTML. Структура документа","\u002Fhtml-css\u002Fintro-html-structure","12.html-css\u002F01.intro-html-structure",{"title":3154,"path":3155,"stem":3156},"Форматування тексту в HTML","\u002Fhtml-css\u002Fhtml-text-formatting","12.html-css\u002F02.html-text-formatting",{"title":3158,"path":3159,"stem":3160},"Посилання та зображення в HTML","\u002Fhtml-css\u002Fhtml-links-images","12.html-css\u002F03.html-links-images",{"title":3162,"path":3163,"stem":3164},"Списки та таблиці в HTML","\u002Fhtml-css\u002Fhtml-lists-tables","12.html-css\u002F04.html-lists-tables",{"title":3166,"path":3167,"stem":3168},"Форми в HTML","\u002Fhtml-css\u002Fhtml-forms","12.html-css\u002F05.html-forms",{"title":3170,"path":3171,"stem":3172},"Семантичні елементи HTML5","\u002Fhtml-css\u002Fhtml-semantic-elements","12.html-css\u002F06.html-semantic-elements",{"title":3174,"path":3175,"stem":3176},"Мультимедіа та розширені елементи HTML","\u002Fhtml-css\u002Fhtml-multimedia-advanced","12.html-css\u002F07.html-multimedia-advanced",{"title":3178,"path":3179,"stem":3180},"Мікророзмітка та SEO в HTML","\u002Fhtml-css\u002Fhtml-microdata-seo","12.html-css\u002F08.html-microdata-seo",{"title":3182,"path":3183,"stem":3184},"Вступ до CSS. Селектори та специфічність","\u002Fhtml-css\u002Fcss-intro-selectors","12.html-css\u002F09.css-intro-selectors",{"title":3186,"path":3187,"stem":3188},"Блокова модель CSS. Відступи. Box Sizing","\u002Fhtml-css\u002Fcss-box-model","12.html-css\u002F10.css-box-model",{"title":3190,"path":3191,"stem":3192},"Розміри у CSS: повний довідник одиниць і ключових слів","\u002Fhtml-css\u002F10a.css-sizing","12.html-css\u002F10a.css-sizing",{"title":3194,"path":3195,"stem":3196},"Типографіка в CSS. Шрифти та текст","\u002Fhtml-css\u002Fcss-typography","12.html-css\u002F11.css-typography",{"title":3198,"path":3199,"stem":3200},"Кольори та фони в CSS","\u002Fhtml-css\u002Fcss-colors-backgrounds","12.html-css\u002F12.css-colors-backgrounds",{"title":3202,"path":3203,"stem":3204},"Тіні та фільтри в CSS","\u002Fhtml-css\u002F12b.css-shadows-filters","12.html-css\u002F12b.css-shadows-filters",{"title":3206,"path":3207,"stem":3208},"CSS Flexbox: Фундамент гнучких макетів","\u002Fhtml-css\u002Fcss-flexbox-fundamentals","12.html-css\u002F13.css-flexbox-fundamentals",{"title":3210,"path":3211,"stem":3212},"CSS Flexbox: Вирівнювання та Позиціонування","\u002Fhtml-css\u002Fcss-flexbox-alignment-sizing-and-patterns","12.html-css\u002F14.css-flexbox-alignment-sizing-and-patterns",{"title":3214,"path":3215,"stem":3216},"CSS Grid. Двовимірний макет. Частина 1","\u002Fhtml-css\u002Fcss-layout-grid","12.html-css\u002F15.css-layout-grid",{"title":3218,"path":3219,"stem":3220},"CSS Grid. Двовимірний макет. Частина 2","\u002Fhtml-css\u002Fcss-layout-grid-advanced","12.html-css\u002F16.css-layout-grid-advanced",{"title":3222,"path":3223,"stem":3224},"Позиціонування в CSS. Z-index. Stacking Context","\u002Fhtml-css\u002Fcss-positioning","12.html-css\u002F17.css-positioning",{"title":3226,"path":3227,"stem":3228},"CSS Анімації та Переходи","\u002Fhtml-css\u002Fcss-animations-transitions","12.html-css\u002F18.css-animations-transitions",{"title":3230,"path":3231,"stem":3232},"Адаптивний дизайн. Media Queries. Частина 1","\u002Fhtml-css\u002Fcss-responsive-media-queries","12.html-css\u002F19.css-responsive-media-queries",{"title":3234,"path":3235,"stem":3236},"Адаптивний дизайн. Частина 2: clamp(), Container Queries, @layer","\u002Fhtml-css\u002Fcss-responsive-advanced","12.html-css\u002F20.css-responsive-advanced",{"title":3238,"path":3239,"stem":3240},"CSS Custom Properties. Методології. Сучасний CSS","\u002Fhtml-css\u002Fcss-variables-methodologies","12.html-css\u002F21.css-variables-methodologies",{"title":3242,"path":3243,"stem":3244},"Сучасний CSS 2023–2025: Нові можливості","\u002Fhtml-css\u002Fcss-modern-features","12.html-css\u002F22.css-modern-features",{"title":3246,"path":3247,"stem":3248},"CSS Nesting, @layer, @scope та @property: нативний препроцесор","\u002Fhtml-css\u002F22a.css-nesting-modern-syntax","12.html-css\u002F22a.css-nesting-modern-syntax",{"title":3250,"path":3251,"stem":3252},"CSS для форм та інтерактивних станів","\u002Fhtml-css\u002Fcss-forms-interactive-states","12.html-css\u002F23.css-forms-interactive-states",{"title":3254,"path":3255,"stem":3256},"Доступність у CSS (CSS Accessibility)","\u002Fhtml-css\u002Fcss-accessibility","12.html-css\u002F24.css-accessibility",{"title":3258,"path":3259,"stem":3260},"CSS-функції та сучасні sizing primitives","\u002Fhtml-css\u002Fcss-functions-sizing","12.html-css\u002F25.css-functions-sizing",{"title":3262,"path":3263,"stem":3264},"Rendering Pipeline і CSS Performance","\u002Fhtml-css\u002Fcss-rendering-performance","12.html-css\u002F26.css-rendering-performance",{"title":3266,"path":3267,"stem":3268},"CSS Best Practices: типові ситуації та правильні рішення","\u002Fhtml-css\u002Fcss-best-practices","12.html-css\u002F27.css-best-practices",{"title":3270,"path":3271,"stem":3272,"children":3273,"page":59},"AWS","\u002Faws","13.aws",[3274,3278,3282,3286,3290,3294,3298,3302,3306,3310,3314,3318,3322,3326,3330,3334,3338,3342],{"title":3275,"path":3276,"stem":3277},"Реєстрація AWS акаунту та студентські програми","\u002Faws\u002Faccount-registration","13.aws\u002F00.account-registration",{"title":3279,"path":3280,"stem":3281},"Вступ до хмарних обчислень та AWS","\u002Faws\u002Fintroduction-to-cloud","13.aws\u002F01.introduction-to-cloud",{"title":3283,"path":3284,"stem":3285},"AWS IAM — Identity and Access Management","\u002Faws\u002Fiam","13.aws\u002F02.iam",{"title":3287,"path":3288,"stem":3289},"AWS IAM CLI — Довідник команд","\u002Faws\u002F02a.iam-doc","13.aws\u002F02a.iam-doc",{"title":3291,"path":3292,"stem":3293},"Docker та контейнеризація в AWS — ECR, ECS та Fargate","\u002Faws\u002Fdocker-ecs","13.aws\u002F03.docker-ecs",{"title":3295,"path":3296,"stem":3297},"AWS ECR \u002F ECS CLI — Довідник команд","\u002Faws\u002F03a.docker-ecs-doc","13.aws\u002F03a.docker-ecs-doc",{"title":3299,"path":3300,"stem":3301},"Amazon EC2 — Elastic Compute Cloud","\u002Faws\u002Fec2","13.aws\u002F04.ec2",{"title":3303,"path":3304,"stem":3305},"AWS EC2 CLI — Довідник команд","\u002Faws\u002F04a.ec2-doc","13.aws\u002F04a.ec2-doc",{"title":3307,"path":3308,"stem":3309},"Elastic Load Balancing та Auto Scaling","\u002Faws\u002Falb-asg","13.aws\u002F05.alb-asg",{"title":3311,"path":3312,"stem":3313},"Amazon S3 — Simple Storage Service","\u002Faws\u002Fs3","13.aws\u002F06.s3",{"title":3315,"path":3316,"stem":3317},"Amazon CloudFront — Content Delivery Network","\u002Faws\u002Fcloudfront","13.aws\u002F07.cloudfront",{"title":3319,"path":3320,"stem":3321},"Amazon RDS — Relational Database Service","\u002Faws\u002Frds","13.aws\u002F08.rds",{"title":3323,"path":3324,"stem":3325},"Amazon DynamoDB — NoSQL Database","\u002Faws\u002Fdynamodb","13.aws\u002F09.dynamodb",{"title":3327,"path":3328,"stem":3329},"AWS Lambda та Serverless Compute","\u002Faws\u002Flambda","13.aws\u002F10.lambda",{"title":3331,"path":3332,"stem":3333},"Amazon Bedrock - Foundation Models, RAG та Agents","\u002Faws\u002Fbedrock","13.aws\u002F22.bedrock",{"title":3335,"path":3336,"stem":3337},"Amazon Rekognition - Комп'ютерний зір","\u002Faws\u002Frekognition","13.aws\u002F23.rekognition",{"title":3339,"path":3340,"stem":3341},"Amazon Textract - Інтелектуальний аналіз документів","\u002Faws\u002Ftextract","13.aws\u002F24.textract",{"title":3343,"path":3344,"stem":3345},"Amazon Polly, Transcribe, Comprehend та Translate","\u002Faws\u002Faudio-nlp-services","13.aws\u002F25.audio-nlp-services",{"title":3347,"path":3348,"stem":3349,"children":3350,"page":59},"Ai Development","\u002Fai-development","14.ai-development",[3351],{"title":3352,"path":3353,"stem":3354,"children":3355,"page":59},"Foundations","\u002Fai-development\u002Ffoundations","14.ai-development\u002F00.foundations",[3356],{"title":3357,"path":3358,"stem":3359},"Модуль 0.1. Що таке Large Language Model (LLM)","\u002Fai-development\u002Ffoundations\u002Fwhat-is-llm","14.ai-development\u002F00.foundations\u002F01.what-is-llm",{"title":3361,"path":3362,"stem":3363,"children":3364,"page":59},"React Native","\u002Freact-native","15.react-native",[3365,3386],{"title":3366,"path":3367,"stem":3368,"children":3369,"page":59},"Version1","\u002Freact-native\u002Fversion1","15.react-native\u002Fversion1",[3370,3374,3378,3382],{"title":3371,"path":3372,"stem":3373},"Що таке React Native","\u002Freact-native\u002Fversion1\u002Fwhat-is-react-native","15.react-native\u002Fversion1\u002F01.what-is-react-native",{"title":3375,"path":3376,"stem":3377},"Як влаштований React Native «під капотом»","\u002Freact-native\u002Fversion1\u002Freact-native-architecture","15.react-native\u002Fversion1\u002F02.react-native-architecture",{"title":3379,"path":3380,"stem":3381},"Від React до React Native: ключові відмінності","\u002Freact-native\u002Fversion1\u002Freact-native-vs-react","15.react-native\u002Fversion1\u002F03.react-native-vs-react",{"title":3383,"path":3384,"stem":3385},"View та Text — фундаментальні будівельні блоки","\u002Freact-native\u002Fversion1\u002Fview-and-text","15.react-native\u002Fversion1\u002F04.view-and-text",{"title":3387,"path":3388,"stem":3389,"children":3390,"page":59},"Version2","\u002Freact-native\u002Fversion2","15.react-native\u002Fversion2",[3391,3395,3399,3403,3407,3411,3415,3419,3423,3427,3431,3435,3439,3443,3447,3451,3455,3459,3463,3467,3471,3475,3479,3483,3487,3491],{"title":3392,"path":3393,"stem":3394},"React Native — навіщо він потрібен","\u002Freact-native\u002Fversion2\u002Fwhy-react-native","15.react-native\u002Fversion2\u002F01.why-react-native",{"title":3396,"path":3397,"stem":3398},"Налаштування середовища розробки","\u002Freact-native\u002Fversion2\u002Fenvironment-setup","15.react-native\u002Fversion2\u002F02.environment-setup",{"title":3400,"path":3401,"stem":3402},"Expo і класичний React Native — два шляхи одного фреймворку","\u002Freact-native\u002Fversion2\u002Fexpo-vs-cli-landscape","15.react-native\u002Fversion2\u002F03.expo-vs-cli-landscape",{"title":3404,"path":3405,"stem":3406},"Середовище Expo — перший запуск","\u002Freact-native\u002Fversion2\u002Fexpo-setup-and-tooling","15.react-native\u002Fversion2\u002F04.expo-setup-and-tooling",{"title":3408,"path":3409,"stem":3410},"Структура проєкту та перші UI-примітиви","\u002Freact-native\u002Fversion2\u002Fproject-structure-and-conventions","15.react-native\u002Fversion2\u002F05.project-structure-and-conventions",{"title":3412,"path":3413,"stem":3414},"Базові компоненти React Native","\u002Freact-native\u002Fversion2\u002Fcore-components","15.react-native\u002Fversion2\u002F06.core-components",{"title":3416,"path":3417,"stem":3418},"Flexbox і layout у React Native","\u002Freact-native\u002Fversion2\u002Fflexbox-and-layout","15.react-native\u002Fversion2\u002F07.flexbox-and-layout",{"title":3420,"path":3421,"stem":3422},"StyleSheet і теми (light \u002F dark)","\u002Freact-native\u002Fversion2\u002Fstylesheet-and-theming","15.react-native\u002Fversion2\u002F08.stylesheet-and-theming",{"title":3424,"path":3425,"stem":3426},"Списки та віртуалізація","\u002Freact-native\u002Fversion2\u002Flists-and-virtualization","15.react-native\u002Fversion2\u002F09.lists-and-virtualization",{"title":3428,"path":3429,"stem":3430},"Форми, ввід і валідація","\u002Freact-native\u002Fversion2\u002Fforms-input-validation","15.react-native\u002Fversion2\u002F10.forms-input-validation",{"title":3432,"path":3433,"stem":3434},"Основи Expo Router","\u002Freact-native\u002Fversion2\u002Fexpo-router-basics","15.react-native\u002Fversion2\u002F11.expo-router-basics",{"title":3436,"path":3437,"stem":3438},"Вкладені навігатори та модалки","\u002Freact-native\u002Fversion2\u002Fnested-navigators-and-modals","15.react-native\u002Fversion2\u002F12.nested-navigators-and-modals",{"title":3440,"path":3441,"stem":3442},"Deep linking і параметри маршрутів","\u002Freact-native\u002Fversion2\u002Fdeep-linking-and-params","15.react-native\u002Fversion2\u002F13.deep-linking-and-params",{"title":3444,"path":3445,"stem":3446},"Робота з мережею та життєвий цикл застосунку","\u002Freact-native\u002Fversion2\u002Fnetworking-and-app-lifecycle","15.react-native\u002Fversion2\u002F14.networking-and-app-lifecycle",{"title":3448,"path":3449,"stem":3450},"Redux Toolkit на мобільних платформах","\u002Freact-native\u002Fversion2\u002Fredux-toolkit-on-mobile","15.react-native\u002Fversion2\u002F15.redux-toolkit-on-mobile",{"title":3452,"path":3453,"stem":3454},"RTK Query на мобільних платформах","\u002Freact-native\u002Fversion2\u002Frtk-query-mobile","15.react-native\u002Fversion2\u002F16.rtk-query-mobile",{"title":3456,"path":3457,"stem":3458},"Автентифікація та Безпечне Зберігання","\u002Freact-native\u002Fversion2\u002Fauth-secure-storage","15.react-native\u002Fversion2\u002F18.auth-secure-storage",{"title":3460,"path":3461,"stem":3462},"Локальне сховище — AsyncStorage, MMKV, SQLite","\u002Freact-native\u002Fversion2\u002Flocal-storage-mmkv-sqlite","15.react-native\u002Fversion2\u002F19.local-storage-mmkv-sqlite",{"title":3464,"path":3465,"stem":3466},"Офлайн-First і синхронізація","\u002Freact-native\u002Fversion2\u002Foffline-first-sync","15.react-native\u002Fversion2\u002F20.offline-first-sync",{"title":3468,"path":3469,"stem":3470},"Камера, медіа та файлова система","\u002Freact-native\u002Fversion2\u002Fcamera-media-filesystem","15.react-native\u002Fversion2\u002F21.camera-media-filesystem",{"title":3472,"path":3473,"stem":3474},"Карти та геолокація","\u002Freact-native\u002Fversion2\u002Fmaps-and-location","15.react-native\u002Fversion2\u002F22.maps-and-location",{"title":3476,"path":3477,"stem":3478},"Жести та дотики","\u002Freact-native\u002Fversion2\u002Fgestures-and-touch","15.react-native\u002Fversion2\u002F23.gestures-and-touch",{"title":3480,"path":3481,"stem":3482},"Анімації з Reanimated","\u002Freact-native\u002Fversion2\u002Freanimated-animations","15.react-native\u002Fversion2\u002F24.reanimated-animations",{"title":3484,"path":3485,"stem":3486},"Push і локальні сповіщення","\u002Freact-native\u002Fversion2\u002Fpush-and-local-notifications","15.react-native\u002Fversion2\u002F25.push-and-local-notifications",{"title":3488,"path":3489,"stem":3490},"Доступність та інтернаціоналізація","\u002Freact-native\u002Fversion2\u002Faccessibility-and-i18n","15.react-native\u002Fversion2\u002F26.accessibility-and-i18n",{"title":3492,"path":3493,"stem":3494},"EAS Build та профілі збірки","\u002Freact-native\u002Fversion2\u002Feas-build-and-profiles","15.react-native\u002Fversion2\u002F29.eas-build-and-profiles",{"title":3496,"path":3497,"stem":3498,"children":3499,"page":59},"Ai Python","\u002Fai-python","16.ai-python",[3500,3504,3508],{"title":3501,"path":3502,"stem":3503},"Вступ до штучного інтелекту та машинного навчання","\u002Fai-python\u002Fintro-to-ai","16.ai-python\u002F01.intro-to-ai",{"title":3505,"path":3506,"stem":3507},"Знайомство з Jupyter Notebook та JupyterLab","\u002Fai-python\u002Fjupyter-notebook","16.ai-python\u002F02.jupyter-notebook",{"title":3509,"path":3510,"stem":3511},"Робота з даними з використанням NumPy і pandas","\u002Fai-python\u002Fnumpy-pandas","16.ai-python\u002F03.numpy-pandas",{"title":3513,"icon":658,"path":3514,"stem":3515,"children":3516,"page":59},"Клієнт-серверна архітектура","\u002Fclient-server-architecture","17.client-server-architecture",[3517,3521],{"title":3518,"path":3519,"stem":3520},"Архітектура клієнт-серверних систем та основи Go","\u002Fclient-server-architecture\u002Fclient-server-architecture-and-go","17.client-server-architecture\u002F01.client-server-architecture-and-go",{"title":3522,"path":3523,"stem":3524},"Система типів та модель пам’яті мови Go","\u002Fclient-server-architecture\u002Ftype-system-and-memory-model","17.client-server-architecture\u002F02.type-system-and-memory-model",{"title":3526,"icon":1946,"path":3527,"stem":3528,"children":3529,"page":59},"Розробка WEB-застосувань","\u002Fweb-development","18.web-development",[3530,3575,3613,3642],{"title":3531,"icon":658,"path":3532,"stem":3533,"children":3534,"page":59},"Архітектура комп'ютерних мереж та мережеві протоколи","\u002Fweb-development\u002Fnetwork-architecture-and-protocols","18.web-development\u002F01.network-architecture-and-protocols",[3535,3539,3543,3547,3551,3555,3559,3563,3567,3571],{"title":3536,"path":3537,"stem":3538},"Еволюція веброзробки та модель клієнт-сервер","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fweb-evolution-client-server","18.web-development\u002F01.network-architecture-and-protocols\u002F01.web-evolution-client-server",{"title":3540,"path":3541,"stem":3542},"Еталонна модель OSI","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fosi-model","18.web-development\u002F01.network-architecture-and-protocols\u002F02.osi-model",{"title":3544,"path":3545,"stem":3546},"Стек протоколів TCP\u002FIP","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Ftcp-ip-stack","18.web-development\u002F01.network-architecture-and-protocols\u002F03.tcp-ip-stack",{"title":3548,"path":3549,"stem":3550},"IP-адресація, порти та сокети","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fip-addressing-ports-sockets","18.web-development\u002F01.network-architecture-and-protocols\u002F04.ip-addressing-ports-sockets",{"title":3552,"path":3553,"stem":3554},"Протоколи TCP та UDP","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Ftcp-udp-protocols","18.web-development\u002F01.network-architecture-and-protocols\u002F05.tcp-udp-protocols",{"title":3556,"path":3557,"stem":3558},"Система доменних імен DNS","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fdns-system","18.web-development\u002F01.network-architecture-and-protocols\u002F06.dns-system",{"title":3560,"path":3561,"stem":3562},"Протокол SMTP та поштові протоколи","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fsmtp-email-protocols","18.web-development\u002F01.network-architecture-and-protocols\u002F07.smtp-email-protocols",{"title":3564,"path":3565,"stem":3566},"Протокол WebSocket","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fwebsocket-protocol","18.web-development\u002F01.network-architecture-and-protocols\u002F08.websocket-protocol",{"title":3568,"path":3569,"stem":3570},"Протокол SSH","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fssh-protocol","18.web-development\u002F01.network-architecture-and-protocols\u002F09.ssh-protocol",{"title":3572,"path":3573,"stem":3574},"Огляд сучасних серверних технологій","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fmodern-backend-technologies","18.web-development\u002F01.network-architecture-and-protocols\u002F10.modern-backend-technologies",{"title":3576,"icon":3577,"path":3578,"stem":3579,"children":3580,"page":59},"Протокол HTTP та захищена передача даних HTTPS","i-lucide-lock","\u002Fweb-development\u002Fhttp-and-https","18.web-development\u002F02.http-and-https",[3581,3585,3589,3593,3597,3601,3605,3609],{"title":3582,"path":3583,"stem":3584},"Вступ до протоколу HTTP та еволюція веб-технологій","\u002Fweb-development\u002Fhttp-and-https\u002Fintroduction-and-evolution","18.web-development\u002F02.http-and-https\u002F01.introduction-and-evolution",{"title":3586,"path":3587,"stem":3588},"Анатомія HTTP-запиту","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-request-structure","18.web-development\u002F02.http-and-https\u002F02.http-request-structure",{"title":3590,"path":3591,"stem":3592},"Анатомія HTTP-відповіді","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-response-structure","18.web-development\u002F02.http-and-https\u002F03.http-response-structure",{"title":3594,"path":3595,"stem":3596},"Методи HTTP та їхня семантика","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-methods","18.web-development\u002F02.http-and-https\u002F04.http-methods",{"title":3598,"path":3599,"stem":3600},"Коди статусу HTTP та їхнє призначення","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-status-codes","18.web-development\u002F02.http-and-https\u002F05.http-status-codes",{"title":3602,"path":3603,"stem":3604},"HTTP-заголовки та їхнє призначення","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-headers","18.web-development\u002F02.http-and-https\u002F06.http-headers",{"title":3606,"path":3607,"stem":3608},"CORS та механізми безпеки HTTP","\u002Fweb-development\u002Fhttp-and-https\u002Fcors-and-security","18.web-development\u002F02.http-and-https\u002F07.cors-and-security",{"title":3610,"path":3611,"stem":3612},"HTTPS та криптографічні основи TLS","\u002Fweb-development\u002Fhttp-and-https\u002Fhttps-and-tls","18.web-development\u002F02.http-and-https\u002F08.https-and-tls",{"title":3614,"icon":2326,"path":3615,"stem":3616,"children":3617,"page":59},"Система типів мови TypeScript","\u002Fweb-development\u002Ftypescript-type-system","18.web-development\u002F03.typescript-type-system",[3618,3622,3626,3630,3634,3638],{"title":3619,"path":3620,"stem":3621},"Знайомство з TypeScript Compiler","\u002Fweb-development\u002Ftypescript-type-system\u002Fintroduction-compiler-config","18.web-development\u002F03.typescript-type-system\u002F01.introduction-compiler-config",{"title":3623,"path":3624,"stem":3625},"Примітивні типи даних: string, number, boolean","\u002Fweb-development\u002Ftypescript-type-system\u002Fprimitive-special-types","18.web-development\u002F03.typescript-type-system\u002F02.primitive-special-types",{"title":3627,"path":3628,"stem":3629},"Масиви, кортежі та об","\u002Fweb-development\u002Ftypescript-type-system\u002Farrays-tuples-objects","18.web-development\u002F03.typescript-type-system\u002F03.arrays-tuples-objects",{"title":3631,"path":3632,"stem":3633},"Union типи, Intersection типи та літеральні типи","\u002Fweb-development\u002Ftypescript-type-system\u002Funion-intersection-literals","18.web-development\u002F03.typescript-type-system\u002F04.union-intersection-literals",{"title":3635,"path":3636,"stem":3637},"Type Narrowing (звуження типів)","\u002Fweb-development\u002Ftypescript-type-system\u002Ftype-narrowing","18.web-development\u002F03.typescript-type-system\u002F05.type-narrowing",{"title":3639,"path":3640,"stem":3641},"Типізація функцій","\u002Fweb-development\u002Ftypescript-type-system\u002Ffunctions-typing","18.web-development\u002F03.typescript-type-system\u002F06.functions-typing",{"title":3643,"icon":2326,"path":3644,"stem":3645,"children":3646,"page":59},"Розширені засоби мови TypeScript","\u002Fweb-development\u002Ftypescript-advanced","18.web-development\u002F04.typescript-advanced",[3647,3651,3655,3659,3663,3667],{"title":3648,"path":3649,"stem":3650},"Interfaces та Classes","\u002Fweb-development\u002Ftypescript-advanced\u002Finterfaces-classes","18.web-development\u002F04.typescript-advanced\u002F01.interfaces-classes",{"title":3652,"path":3653,"stem":3654},"Основи Generic типів","\u002Fweb-development\u002Ftypescript-advanced\u002Fgenerics-fundamentals","18.web-development\u002F04.typescript-advanced\u002F02.generics-fundamentals",{"title":3656,"path":3657,"stem":3658},"Enums та Decorators","\u002Fweb-development\u002Ftypescript-advanced\u002Fenums-decorators","18.web-development\u002F04.typescript-advanced\u002F03.enums-decorators",{"title":3660,"path":3661,"stem":3662},"Utility Types","\u002Fweb-development\u002Ftypescript-advanced\u002Futility-types","18.web-development\u002F04.typescript-advanced\u002F04.utility-types",{"title":3664,"path":3665,"stem":3666},"Mapped та Conditional Types","\u002Fweb-development\u002Ftypescript-advanced\u002Fmapped-conditional-types","18.web-development\u002F04.typescript-advanced\u002F05.mapped-conditional-types",{"title":3668,"path":3669,"stem":3670},"Модулі та Strict Mode","\u002Fweb-development\u002Ftypescript-advanced\u002Fmodules-strict-mode","18.web-development\u002F04.typescript-advanced\u002F06.modules-strict-mode",{"title":3672,"path":3673,"stem":3674,"children":3675,"page":59},"Tailwind","\u002Ftailwind","21.tailwind",[3676,3680,3684,3688,3692,3696,3700,3704,3708,3712,3716,3720],{"title":3677,"path":3678,"stem":3679},"Що таке Tailwind CSS і навіщо він потрібен","\u002Ftailwind\u002Ftailwind-intro-philosophy","21.tailwind\u002F01.tailwind-intro-philosophy",{"title":3681,"path":3682,"stem":3683},"Встановлення та налаштування Tailwind CSS v4","\u002Ftailwind\u002Ftailwind-installation-setup","21.tailwind\u002F02.tailwind-installation-setup",{"title":3685,"path":3686,"stem":3687},"Utility-класи: основи та система Tailwind","\u002Ftailwind\u002Ftailwind-utility-classes-core","21.tailwind\u002F03.tailwind-utility-classes-core",{"title":3689,"path":3690,"stem":3691},"Layout: Flexbox та Grid через Tailwind","\u002Ftailwind\u002Ftailwind-flexbox-grid","21.tailwind\u002F04.tailwind-flexbox-grid",{"title":3693,"path":3694,"stem":3695},"Кастомізація теми через @theme у Tailwind v4","\u002Ftailwind\u002Ftailwind-theme-customization","21.tailwind\u002F05.tailwind-theme-customization",{"title":3697,"path":3698,"stem":3699},"Варіанти: hover, focus, responsive, dark mode та нові v4","\u002Ftailwind\u002Ftailwind-variants-states","21.tailwind\u002F06.tailwind-variants-states",{"title":3701,"path":3702,"stem":3703},"Типографіка та система кольорів у Tailwind v4","\u002Ftailwind\u002Ftailwind-typography-colors","21.tailwind\u002F07.tailwind-typography-colors",{"title":3705,"path":3706,"stem":3707},"Компоненти та повторюваність: @apply, @utility та патерни","\u002Ftailwind\u002Ftailwind-components-patterns","21.tailwind\u002F08.tailwind-components-patterns",{"title":3709,"path":3710,"stem":3711},"Темна тема та система дизайн-токенів у Tailwind v4","\u002Ftailwind\u002Ftailwind-dark-mode-theming","21.tailwind\u002F09.tailwind-dark-mode-theming",{"title":3713,"path":3714,"stem":3715},"Довільні значення та контейнерні запити у Tailwind v4","\u002Ftailwind\u002Ftailwind-arbitrary-container-queries","21.tailwind\u002F10.tailwind-arbitrary-container-queries",{"title":3717,"path":3718,"stem":3719},"Анімації, трансформації та 3D у Tailwind v4","\u002Ftailwind\u002Ftailwind-animations-transforms","21.tailwind\u002F11.tailwind-animations-transforms",{"title":3721,"path":3722,"stem":3723},"Tailwind CLI, PostCSS та інтеграція з фреймворками","\u002Ftailwind\u002Ftailwind-cli-tooling","21.tailwind\u002F12.tailwind-cli-tooling",{"title":3725,"path":3726,"stem":3727},"Тестування компонентів діаграм","\u002Ftest-components","98.test-components",{"id":3729,"title":3548,"body":3730,"description":11999,"extension":12000,"links":12001,"meta":12002,"navigation":5703,"path":3549,"seo":12003,"stem":3550,"__hash__":12004},"docs\u002F18.web-development\u002F01.network-architecture-and-protocols\u002F04.ip-addressing-ports-sockets.md",{"type":3731,"value":3732,"toc":11926},"minimark",[3733,3737,3815,3818,3823,3840,3845,3856,3859,3880,3892,3896,3899,3933,3942,3945,3947,3951,3955,3970,3979,3982,4074,4078,4082,4085,4105,4109,4120,4144,4150,4153,4212,4219,4221,4225,4235,4239,4242,4417,4422,4431,4460,4467,4490,4493,4497,4504,4531,4544,4567,4571,4578,4604,4612,4631,4642,4644,4648,4664,4668,4682,4690,4705,4716,4720,4730,4734,4746,4750,4756,4767,4781,4785,4797,4805,4811,4828,4833,5051,5058,5064,5067,5078,5103,5107,5115,5121,5136,5142,5148,5153,5159,5181,5187,5198,5286,5288,5292,5305,5309,5323,5328,5410,5415,5458,5471,5475,5489,5518,5523,5542,5546,5556,5561,5660,5667,5842,5847,5861,5866,5890,5893,5895,5899,5903,5906,5931,5936,5950,5954,5968,5973,5979,5985,6012,6044,6049,6100,6105,6108,6115,6118,6120,6124,6138,6142,6145,6165,6172,6177,6183,6187,6191,6202,6205,6209,6214,6229,6235,6239,6245,6264,6284,6290,6293,6297,6302,6310,6316,6320,6325,6332,6336,6342,6346,6373,6383,6387,6396,6402,6406,6412,6416,6425,6449,6453,6459,6469,6479,6490,6511,6515,6524,6529,6646,6651,6668,6672,6681,6686,6714,6720,6724,6727,6731,6734,6738,6744,6764,6770,6781,6785,6788,6793,6799,6804,6810,6815,6841,6953,6955,6959,6970,6979,6983,6993,7003,7007,7010,7086,7091,7298,7305,7309,7320,7324,7340,7347,7351,7354,7376,7381,7399,7405,7425,7428,7430,7434,7438,7458,7463,7469,7474,7488,7495,7499,7508,7540,7545,7551,7558,7813,7817,7827,7887,7892,8187,8190,8218,8261,8263,8267,8271,8279,8305,8315,8319,8322,8328,8348,8352,8356,8361,8366,8372,8377,8578,8583,8609,8613,8616,8621,8721,8726,8793,8797,8803,8806,8817,8822,8827,8833,8838,8991,9024,9028,9031,9035,9041,9047,9051,9055,9157,9161,9231,9235,9252,9258,9269,9273,9277,9282,9296,9301,9314,9319,9332,9336,9342,9347,9361,9366,9374,9376,9380,9384,9395,9401,9412,9416,9426,9432,9587,9591,9598,9603,9659,9664,9678,9683,9748,9753,9839,9843,9853,9858,9878,9882,9888,9892,9898,9904,9908,9914,9918,9931,9936,10004,10009,10015,10020,10088,10092,10096,10102,10107,10113,10264,10268,10274,10298,10304,10310,10321,10326,10334,10339,10347,10352,10360,10365,10414,10438,10440,10444,10448,10460,10465,10559,10572,10578,10583,10707,10711,10717,10722,10728,10732,10737,10748,10753,10759,10764,10770,10775,10792,10811,10815,10820,10823,10829,10834,10839,10845,10985,10990,11099,11103,11177,11182,11193,11197,11202,11208,11213,11219,11225,11231,11237,11241,11246,11252,11264,11267,11273,11278,11334,11339,11388,11394,11400,11402,11406,11409,11414,11505,11510,11546,11549,11551,11555,11639,11641,11645,11922],[3734,3735,3548],"h1",{"id":3736},"ip-адресація-порти-та-сокети",[3738,3739,3740,3767],"card-group",{},[3741,3742,3745],"card",{"icon":3743,"title":3744},"i-lucide-target","🎯 Мета розділу",[3746,3747,3748,3752,3755,3758,3761,3764],"ul",{},[3749,3750,3751],"li",{},"Глибоко зрозуміти концепцію IP-адреси як унікального ідентифікатора вузла в мережі.",[3749,3753,3754],{},"Опанувати структуру IPv4-адрес: класи, маски підмереж, приватні діапазони, CIDR-нотацію.",[3749,3756,3757],{},"Вивчити IPv6 як наступну генерацію IP-адресації та причини її впровадження.",[3749,3759,3760],{},"Зрозуміти роль портів у мультиплексуванні мережевих з'єднань між застосунками.",[3749,3762,3763],{},"Освоїти поняття сокета як комбінації IP-адреси та порту для унікальної ідентифікації кінцевої точки комунікації.",[3749,3765,3766],{},"Навчитися застосовувати ці знання для налаштування мережевих застосунків.",[3741,3768,3771],{"icon":3769,"title":3770},"i-lucide-key","🔑 Ключові терміни",[3746,3772,3773,3780,3786,3792,3798,3804],{},[3749,3774,3775,3779],{},[3776,3777,3778],"strong",{},"IP-адреса (IP Address):"," унікальний числовий ідентифікатор вузла в мережі TCP\u002FIP.",[3749,3781,3782,3785],{},[3776,3783,3784],{},"IPv4:"," версія протоколу IP з 32-бітовими адресами (4.3 мільярди адрес).",[3749,3787,3788,3791],{},[3776,3789,3790],{},"IPv6:"," версія протоколу IP з 128-бітовими адресами (практично необмежена кількість).",[3749,3793,3794,3797],{},[3776,3795,3796],{},"Маска підмережі (Subnet Mask):"," визначає, яка частина IP-адреси відноситься до мережі, а яка — до хоста.",[3749,3799,3800,3803],{},[3776,3801,3802],{},"Порт (Port):"," 16-бітове число (0-65535), що ідентифікує конкретний процес на вузлі.",[3749,3805,3806,3809,3810,3814],{},[3776,3807,3808],{},"Сокет (Socket):"," комбінація IP-адреси та порту (наприклад, ",[3811,3812,3813],"code",{},"192.168.1.100:8080",").",[3816,3817],"hr",{},[3819,3820,3822],"h2",{"id":3821},"що-таке-ip-адреса-та-навіщо-вона-потрібна","Що таке IP-адреса та навіщо вона потрібна",[3824,3825,3826,3827,3831,3832,3835,3836,3839],"p",{},"У попередніх розділах ми з'ясували, що протокол IP (",[3828,3829,3830],"em",{},"Internet Protocol",") працює на мережевому рівні (Network Layer у OSI, Internet Layer у TCP\u002FIP) та відповідає за маршрутизацію пакетів через множину взаємопов'язаних мереж від джерела до призначення. Але як протокол IP знає, ",[3776,3833,3834],{},"куди саме"," відправляти пакет? Як маршрутизатори визначають напрямок пересилання? Відповідь проста: кожен вузол у мережі TCP\u002FIP має унікальний числовий ідентифікатор — ",[3776,3837,3838],{},"IP-адресу",".",[3841,3842,3844],"h3",{"id":3843},"ip-адреса-як-логічна-адреса-вузла","IP-адреса як логічна адреса вузла",[3824,3846,3847,3848,3851,3852,3855],{},"IP-адреса — це ",[3776,3849,3850],{},"логічний ідентифікатор",", призначений пристрою (комп'ютеру, серверу, маршрутизаторові, смартфону, принтеру, IoT-пристрою) у мережі. На відміну від MAC-адреси, що є фізичним ідентифікатором, «вшитим» виробником у мережеву карту та незмінним протягом життя пристрою, IP-адреса є ",[3776,3853,3854],{},"конфігурованою",": вона може змінюватися залежно від мережі, до якої підключений пристрій.",[3824,3857,3858],{},"Аналогія з поштовою системою допомагає зрозуміти різницю між MAC-адресою та IP-адресою:",[3746,3860,3861,3871],{},[3749,3862,3863,3866,3867,3870],{},[3776,3864,3865],{},"MAC-адреса"," схожа на ",[3776,3868,3869],{},"серійний номер паспорта"," людини: унікальний, незмінний, ідентифікує особу, але не вказує на її місцезнаходження. MAC-адреса працює лише в межах локального сегмента мережі (один Ethernet-комутатор або Wi-Fi-точка доступу).",[3749,3872,3873,3866,3876,3879],{},[3776,3874,3875],{},"IP-адреса",[3776,3877,3878],{},"поштову адресу",": країна, місто, вулиця, будинок, квартира. Вона має ієрархічну структуру, що дозволяє маршрутизаторам приймати рішення про пересилання пакетів без знання точного розташування всіх пристроїв у світі. IP-адреса може змінюватися, якщо ви переїжджаєте (підключаєтеся до іншої мережі).",[3881,3882,3883,3884,3887,3888,3891],"note",{},"Коли ваш ноутбук підключається до домашньої Wi-Fi мережі, він отримує одну IP-адресу (наприклад, ",[3811,3885,3886],{},"192.168.1.50","). Коли ви приносите його до кав'ярні та підключаєтеся до їхньої Wi-Fi, він отримує іншу IP-адресу (наприклад, ",[3811,3889,3890],{},"10.0.5.123","). MAC-адреса мережевої карти залишається незмінною в обох випадках.",[3841,3893,3895],{"id":3894},"дві-версії-протоколу-ip-ipv4-та-ipv6","Дві версії протоколу IP: IPv4 та IPv6",[3824,3897,3898],{},"На сьогодні існують дві версії протоколу IP, що одночасно використовуються в Інтернеті:",[3746,3900,3901,3921],{},[3749,3902,3903,3910,3911,3914,3915,3914,3918,3839],{},[3776,3904,3905,3906,3909],{},"IPv4 (",[3828,3907,3908],{},"Internet Protocol version 4","):"," Розроблена на початку 1980-х, використовує 32-бітові адреси, що дають приблизно 4.3 мільярда унікальних адрес. Записується у десятковій крапковій нотації: ",[3811,3912,3913],{},"192.168.1.1",", ",[3811,3916,3917],{},"8.8.8.8",[3811,3919,3920],{},"172.16.0.1",[3749,3922,3923,3929,3930,3839],{},[3776,3924,3925,3926,3909],{},"IPv6 (",[3828,3927,3928],{},"Internet Protocol version 6"," Розроблена у 1990-х як відповідь на вичерпання адресного простору IPv4. Використовує 128-бітові адреси, що дають 340 ундеціліонів адрес (3.4 × 10³⁸). Записується у шістнадцятковій нотації з двокрапками: ",[3811,3931,3932],{},"2001:0db8:85a3:0000:0000:8a2e:0370:7334",[3824,3934,3935],{},[3936,3937],"img",{"alt":3938,"className":3939,"src":3941},"Порівняння форматів та довжини адрес протоколів IPv4 та IPv6",[3940],"diagram-img","\u002Fimages\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fip-addressing-ports-sockets\u002F01.jpg",[3824,3943,3944],{},"Більшість матеріалу цього розділу присвячена IPv4, оскільки вона все ще домінує в практичній веброзробці, проте ми також детально розглянемо IPv6 та причини її впровадження.",[3816,3946],{},[3819,3948,3950],{"id":3949},"ipv4-структура-та-нотація","IPv4: структура та нотація",[3841,3952,3954],{"id":3953},"анатомія-ipv4-адреси","Анатомія IPv4-адреси",[3824,3956,3957,3958,3961,3962,3965,3966,3969],{},"IPv4-адреса складається з ",[3776,3959,3960],{},"32 біт"," (4 байти), що зазвичай записуються у ",[3776,3963,3964],{},"десятковій крапковій нотації"," (",[3828,3967,3968],{},"dotted-decimal notation","): чотири десяткові числа (від 0 до 255), розділені крапками.",[3824,3971,3972,3975,3976],{},[3776,3973,3974],{},"Приклад:"," ",[3811,3977,3978],{},"192.168.1.100",[3824,3980,3981],{},"Розберемо цю адресу покроково:",[3983,3984,3985,4018,4034],"ol",{},[3749,3986,3987,3975,3990,3992],{},[3776,3988,3989],{},"Десяткова форма:",[3811,3991,3978],{},[3746,3993,3994,4000,4006,4012],{},[3749,3995,3996,3997],{},"Перший октет (байт): ",[3811,3998,3999],{},"192",[3749,4001,4002,4003],{},"Другий октет: ",[3811,4004,4005],{},"168",[3749,4007,4008,4009],{},"Третій октет: ",[3811,4010,4011],{},"1",[3749,4013,4014,4015],{},"Четвертий октет: ",[3811,4016,4017],{},"100",[3749,4019,4020,4023,4024],{},[3776,4021,4022],{},"Двійкова форма:"," Кожен октет — це 8 біт, тому повна адреса — 32 біти:",[4025,4026,4031],"pre",{"className":4027,"code":4029,"language":4030},[4028],"language-text","192       .  168       .  1         .  100\n11000000  .  10101000  .  00000001  .  01100100\n","text",[3811,4032,4029],{"__ignoreMap":4033},"",[3749,4035,4036,3975,4039,4042],{},[3776,4037,4038],{},"Шістнадцяткова форма:",[3811,4040,4041],{},"0xC0A80164",[3746,4043,4044,4053,4060,4067],{},[3749,4045,4046,4048,4049,4052],{},[3811,4047,3999],{}," = ",[3811,4050,4051],{},"C0"," (hex)",[3749,4054,4055,4048,4057,4052],{},[3811,4056,4005],{},[3811,4058,4059],{},"A8",[3749,4061,4062,4048,4064,4052],{},[3811,4063,4011],{},[3811,4065,4066],{},"01",[3749,4068,4069,4048,4071,4052],{},[3811,4070,4017],{},[3811,4072,4073],{},"64",[4075,4076,4077],"tip",{},"Розуміння двійкової форми IP-адреси є критично важливим для роботи з масками підмереж, обчислення діапазонів адрес та розуміння маршрутизації. Хоча у повсякденній роботі ми використовуємо десяткову нотацію, під капотом маршрутизатори та операційні системи оперують двійковими числами.",[3841,4079,4081],{"id":4080},"чому-саме-4-байти","Чому саме 4 байти?",[3824,4083,4084],{},"Вибір 32-бітової адреси був інженерним компромісом на початку 1980-х:",[3746,4086,4087,4093,4099],{},[3749,4088,4089,4092],{},[3776,4090,4091],{},"Достатня кількість адрес на той момент:"," 4.3 мільярда адрес здавалися величезною кількістю для експериментальної мережі ARPANET, що мала лише кілька сотень вузлів. Ніхто не передбачав, що через 30 років кожна людина матиме кілька пристроїв, підключених до Інтернету (смартфон, ноутбук, планшет, розумні годинники, домашні пристрої IoT).",[3749,4094,4095,4098],{},[3776,4096,4097],{},"Ефективність обробки:"," 32-бітові числа добре вписуються у розміри машинних слів комп'ютерних процесорів 1980-х років, що робило операції з IP-адресами ефективними.",[3749,4100,4101,4104],{},[3776,4102,4103],{},"Компактність заголовків:"," Менші адреси означають менший розмір IP-заголовка (20 байт у IPv4), що зменшує накладні витрати при передачі даних.",[3841,4106,4108],{"id":4107},"діапазон-можливих-ipv4-адрес","Діапазон можливих IPv4-адрес",[3824,4110,4111,4112,4115,4116,4119],{},"Оскільки IPv4-адреса — це 32-бітове число, теоретично можливі адреси від ",[3811,4113,4114],{},"0.0.0.0"," до ",[3811,4117,4118],{},"255.255.255.255",":",[3746,4121,4122,4133],{},[3749,4123,4124,3975,4127,4129,4130],{},[3776,4125,4126],{},"Мінімальна адреса:",[3811,4128,4114],{}," (всі біти = 0) — у двійковій формі: ",[3811,4131,4132],{},"00000000.00000000.00000000.00000000",[3749,4134,4135,3975,4138,4140,4141],{},[3776,4136,4137],{},"Максимальна адреса:",[3811,4139,4118],{}," (всі біти = 1) — у двійковій формі: ",[3811,4142,4143],{},"11111111.11111111.11111111.11111111",[3824,4145,4146,4149],{},[3776,4147,4148],{},"Загальна кількість адрес:"," 2³² = 4,294,967,296 адрес (трохи більше 4.3 мільярда).",[3824,4151,4152],{},"Проте не всі ці адреси доступні для призначення звичайним пристроям. Деякі діапазони зарезервовані для спеціальних цілей:",[3746,4154,4155,4163,4179,4193,4201],{},[3749,4156,4157,4162],{},[3776,4158,4159],{},[3811,4160,4161],{},"0.0.0.0\u002F8"," — адреси «цієї мережі», використовуються для позначення джерела під час ініціалізації.",[3749,4164,4165,4170,4171,4174,4175,4178],{},[3776,4166,4167],{},[3811,4168,4169],{},"127.0.0.0\u002F8"," — петлева адреса (",[3828,4172,4173],{},"loopback","), ",[3811,4176,4177],{},"127.0.0.1"," вказує на сам пристрій («localhost»).",[3749,4180,4181,4192],{},[3776,4182,4183,3914,4186,3914,4189],{},[3811,4184,4185],{},"10.0.0.0\u002F8",[3811,4187,4188],{},"172.16.0.0\u002F12",[3811,4190,4191],{},"192.168.0.0\u002F16"," — приватні діапазони (RFC 1918), недоступні з Інтернету, використовуються у локальних мережах.",[3749,4194,4195,4200],{},[3776,4196,4197],{},[3811,4198,4199],{},"224.0.0.0\u002F4"," — мультикастові адреси (для передачі одного пакета багатьом отримувачам одночасно).",[3749,4202,4203,4207,4208,4211],{},[3776,4204,4205],{},[3811,4206,4118],{}," — широкомовна адреса (",[3828,4209,4210],{},"broadcast",") для відправки пакета всім вузлам у локальній мережі.",[3881,4213,4214,4215,4218],{},"З 4.3 мільярда теоретичних IPv4-адрес реально доступних для публічного використання значно менше через зарезервовані діапазони, фрагментацію адресного простору та неефективний розподіл у ранні роки Інтернету (деякі організації отримували цілі блоки ",[3811,4216,4217],{},"\u002F8"," з 16 мільйонами адрес, навіть якщо використовували лише їх невелику частину).",[3816,4220],{},[3819,4222,4224],{"id":4223},"класова-адресація-ipv4-застаріла-але-важлива-для-розуміння","Класова адресація IPv4 (застаріла, але важлива для розуміння)",[3824,4226,4227,4228,3965,4231,4234],{},"На ранніх етапах розвитку Інтернету (1980-ті — початок 1990-х) IPv4-адреси розподілялися за ",[3776,4229,4230],{},"класовою системою",[3828,4232,4233],{},"classful addressing","). Ідея полягала у поділі адресного простору на класи залежно від розміру мережі, що дозволяло простий поділ адреси на частину мережі та частину хоста.",[3841,4236,4238],{"id":4237},"пять-класів-ipv4-адрес","П'ять класів IPv4-адрес",[3824,4240,4241],{},"IPv4-адресний простір був поділений на п'ять класів (A, B, C, D, E), що відрізнялися кількістю бітів, виділених для ідентифікації мережі та хоста:",[4243,4244,4245,4272],"table",{},[4246,4247,4248],"thead",{},[4249,4250,4251,4256,4259,4263,4266,4269],"tr",{},[4252,4253,4255],"th",{"align":4254},"center","Клас",[4252,4257,4258],{"align":4254},"Перші біти",[4252,4260,4262],{"align":4261},"left","Діапазон адрес",[4252,4264,4265],{"align":4254},"Кількість мереж",[4252,4267,4268],{"align":4254},"Хостів на мережу",[4252,4270,4271],{"align":4261},"Призначення",[4273,4274,4275,4305,4334,4363,4391],"tbody",{},[4249,4276,4277,4283,4288,4296,4299,4302],{},[4278,4279,4280],"td",{"align":4254},[3776,4281,4282],{},"A",[4278,4284,4285],{"align":4254},[3811,4286,4287],{},"0",[4278,4289,4290,4292,4293],{"align":4261},[3811,4291,4114],{}," — ",[3811,4294,4295],{},"127.255.255.255",[4278,4297,4298],{"align":4254},"128",[4278,4300,4301],{"align":4254},"16,777,214",[4278,4303,4304],{"align":4261},"Величезні мережі (наприклад, великі корпорації)",[4249,4306,4307,4312,4317,4325,4328,4331],{},[4278,4308,4309],{"align":4254},[3776,4310,4311],{},"B",[4278,4313,4314],{"align":4254},[3811,4315,4316],{},"10",[4278,4318,4319,4292,4322],{"align":4261},[3811,4320,4321],{},"128.0.0.0",[3811,4323,4324],{},"191.255.255.255",[4278,4326,4327],{"align":4254},"16,384",[4278,4329,4330],{"align":4254},"65,534",[4278,4332,4333],{"align":4261},"Середні мережі (університети, компанії)",[4249,4335,4336,4341,4346,4354,4357,4360],{},[4278,4337,4338],{"align":4254},[3776,4339,4340],{},"C",[4278,4342,4343],{"align":4254},[3811,4344,4345],{},"110",[4278,4347,4348,4292,4351],{"align":4261},[3811,4349,4350],{},"192.0.0.0",[3811,4352,4353],{},"223.255.255.255",[4278,4355,4356],{"align":4254},"2,097,152",[4278,4358,4359],{"align":4254},"254",[4278,4361,4362],{"align":4261},"Малі мережі (невеликі організації, офіси)",[4249,4364,4365,4370,4375,4383,4386,4388],{},[4278,4366,4367],{"align":4254},[3776,4368,4369],{},"D",[4278,4371,4372],{"align":4254},[3811,4373,4374],{},"1110",[4278,4376,4377,4292,4380],{"align":4261},[3811,4378,4379],{},"224.0.0.0",[3811,4381,4382],{},"239.255.255.255",[4278,4384,4385],{"align":4254},"—",[4278,4387,4385],{"align":4254},[4278,4389,4390],{"align":4261},"Мультикастинг (групова передача)",[4249,4392,4393,4398,4403,4410,4412,4414],{},[4278,4394,4395],{"align":4254},[3776,4396,4397],{},"E",[4278,4399,4400],{"align":4254},[3811,4401,4402],{},"1111",[4278,4404,4405,4292,4408],{"align":4261},[3811,4406,4407],{},"240.0.0.0",[3811,4409,4118],{},[4278,4411,4385],{"align":4254},[4278,4413,4385],{"align":4254},[4278,4415,4416],{"align":4261},"Зарезервовано для експериментів",[4418,4419,4421],"h4",{"id":4420},"клас-a-великі-мережі","Клас A: Великі мережі",[3824,4423,4424,3975,4427,4430],{},[3776,4425,4426],{},"Структура:",[3811,4428,4429],{},"N.H.H.H"," (N — номер мережі, H — номер хоста)",[3746,4432,4433,4448,4454],{},[3749,4434,4435,4438,4439,4441,4442,4292,4444,4447],{},[3776,4436,4437],{},"Перший біт:"," завжди ",[3811,4440,4287],{},", тому перший октет: ",[3811,4443,4287],{},[3811,4445,4446],{},"127"," (у десятковій формі).",[3749,4449,4450,4453],{},[3776,4451,4452],{},"Біти мережі:"," 8 біт (перший октет) ⇒ 2⁷ = 128 мереж (біт 0 фіксований).",[3749,4455,4456,4459],{},[3776,4457,4458],{},"Біти хоста:"," 24 біти (три останні октети) ⇒ 2²⁴ - 2 = 16,777,214 хостів на мережу (віднімаємо 2 адреси: адресу мережі та широкомовну адресу).",[3824,4461,4462,3975,4464,4466],{},[3776,4463,3974],{},[3811,4465,4185],{}," — приватна мережа класу A.",[3746,4468,4469,4475,4484],{},[3749,4470,4471,4472],{},"Адреса мережі: ",[3811,4473,4474],{},"10.0.0.0",[3749,4476,4477,4478,4292,4481],{},"Діапазон хостів: ",[3811,4479,4480],{},"10.0.0.1",[3811,4482,4483],{},"10.255.255.254",[3749,4485,4486,4487],{},"Широкомовна адреса: ",[3811,4488,4489],{},"10.255.255.255",[3881,4491,4492],{},"Мережі класу A видавалися лише найбільшим організаціям (MIT, IBM, HP, Apple, AT&T), що призвело до неефективного використання адресного простору: організація, що отримала мережу класу A, мала у своєму розпорядженні 16 мільйонів адрес, навіть якщо реально використовувала лише кілька тисяч.",[4418,4494,4496],{"id":4495},"клас-b-середні-мережі","Клас B: Середні мережі",[3824,4498,4499,3975,4501],{},[3776,4500,4426],{},[3811,4502,4503],{},"N.N.H.H",[3746,4505,4506,4518,4526],{},[3749,4507,4508,4438,4511,4441,4513,4292,4515,3839],{},[3776,4509,4510],{},"Перші два біти:",[3811,4512,4316],{},[3811,4514,4298],{},[3811,4516,4517],{},"191",[3749,4519,4520,4522,4523,4525],{},[3776,4521,4452],{}," 16 біт (перші два октети) ⇒ 2¹⁴ = 16,384 мережі (два біти ",[3811,4524,4316],{}," фіксовані).",[3749,4527,4528,4530],{},[3776,4529,4458],{}," 16 біт (два останні октети) ⇒ 2¹⁶ - 2 = 65,534 хости на мережу.",[3824,4532,4533,3975,4535,4537,4538,4115,4541,3814],{},[3776,4534,3974],{},[3811,4536,4188],{}," — приватний діапазон класу B (технічно охоплює 16 мереж класу B від ",[3811,4539,4540],{},"172.16.0.0",[3811,4542,4543],{},"172.31.0.0",[3746,4545,4546],{},[3749,4547,4548,4549,4552,4553],{},"Адреса мережі ",[3811,4550,4551],{},"172.16.0.0\u002F16",":\n",[3746,4554,4555,4562],{},[3749,4556,4477,4557,4292,4559],{},[3811,4558,3920],{},[3811,4560,4561],{},"172.16.255.254",[3749,4563,4486,4564],{},[3811,4565,4566],{},"172.16.255.255",[4418,4568,4570],{"id":4569},"клас-c-малі-мережі","Клас C: Малі мережі",[3824,4572,4573,3975,4575],{},[3776,4574,4426],{},[3811,4576,4577],{},"N.N.N.H",[3746,4579,4580,4592,4599],{},[3749,4581,4582,4438,4585,4441,4587,4292,4589,3839],{},[3776,4583,4584],{},"Перші три біти:",[3811,4586,4345],{},[3811,4588,3999],{},[3811,4590,4591],{},"223",[3749,4593,4594,4596,4597,4525],{},[3776,4595,4452],{}," 24 біти (перші три октети) ⇒ 2²¹ = 2,097,152 мережі (три біти ",[3811,4598,4345],{},[3749,4600,4601,4603],{},[3776,4602,4458],{}," 8 біт (останній октет) ⇒ 2⁸ - 2 = 254 хости на мережу.",[3824,4605,4606,3975,4608,4611],{},[3776,4607,3974],{},[3811,4609,4610],{},"192.168.1.0\u002F24"," — типова домашня мережа класу C.",[3746,4613,4614,4619,4626],{},[3749,4615,4471,4616],{},[3811,4617,4618],{},"192.168.1.0",[3749,4620,4477,4621,4292,4623],{},[3811,4622,3913],{},[3811,4624,4625],{},"192.168.1.254",[3749,4627,4486,4628],{},[3811,4629,4630],{},"192.168.1.255",[4632,4633,4634,4635,3965,4638,4641],"warning",{},"Класова адресація офіційно застаріла з 1993 року, коли була введена система ",[3776,4636,4637],{},"CIDR",[3828,4639,4640],{},"Classless Inter-Domain Routing","), що дозволяє більш гнучкий розподіл адрес без прив'язки до класів. Проте розуміння класів все ще корисне для розуміння історичного контексту та деяких застарілих систем.",[3816,4643],{},[3819,4645,4647],{"id":4646},"маски-підмереж-та-cidr-нотація","Маски підмереж та CIDR-нотація",[3824,4649,4650,4651,4654,4655,3965,4658,4661,4662,3839],{},"Основною проблемою класової адресації була ",[3776,4652,4653],{},"негнучкість",": якщо організації потрібна мережа на 300 хостів, вона не могла отримати мережу класу C (254 хости — замало) і змушена була отримувати мережу класу B (65,534 хости — величезний перевитрата). Рішенням стало впровадження ",[3776,4656,4657],{},"масок підмереж",[3828,4659,4660],{},"subnet masks",") та нотації ",[3776,4663,4637],{},[3841,4665,4667],{"id":4666},"що-таке-маска-підмережі","Що таке маска підмережі",[3824,4669,4670,4673,4674,4677,4678,4681],{},[3776,4671,4672],{},"Маска підмережі"," — це 32-бітове число, що визначає, яка частина IP-адреси відноситься до ",[3776,4675,4676],{},"ідентифікатора мережі",", а яка — до ",[3776,4679,4680],{},"ідентифікатора хоста"," в цій мережі. Маска має таку саму структуру, як IP-адреса (чотири октети), але складається з послідовності одиниць (біти мережі), за якими йдуть нулі (біти хоста).",[3824,4683,4684,3975,4687],{},[3776,4685,4686],{},"Приклад маски:",[3811,4688,4689],{},"255.255.255.0",[3746,4691,4692,4698],{},[3749,4693,4694,3975,4696],{},[3776,4695,3989],{},[3811,4697,4689],{},[3749,4699,4700,3975,4702],{},[3776,4701,4022],{},[3811,4703,4704],{},"11111111.11111111.11111111.00000000",[3824,4706,4707,4708,4711,4712,4715],{},"Ця маска означає, що ",[3776,4709,4710],{},"перші 24 біти"," (три октети) IP-адреси відносяться до мережі, а ",[3776,4713,4714],{},"останні 8 біт"," (один октет) — до хоста.",[3841,4717,4719],{"id":4718},"як-працює-маска-побітова-операція-and","Як працює маска: побітова операція AND",[3824,4721,4722,4723,4726,4727,3839],{},"Щоб визначити, до якої мережі належить певна IP-адреса, виконується ",[3776,4724,4725],{},"побітова операція AND"," між IP-адресою та маскою підмережі. Результат — ",[3776,4728,4729],{},"адреса мережі",[3824,4731,4732],{},[3776,4733,3974],{},[3746,4735,4736,4741],{},[3749,4737,4738,4739],{},"IP-адреса хоста: ",[3811,4740,3978],{},[3749,4742,4743,4744],{},"Маска підмережі: ",[3811,4745,4689],{},[3824,4747,4748],{},[3776,4749,4022],{},[4025,4751,4754],{"className":4752,"code":4753,"language":4030},[4028],"IP-адреса:  11000000.10101000.00000001.01100100  (192.168.1.100)\nМаска:      11111111.11111111.11111111.00000000  (255.255.255.0)\n─────────────────────────────────────────────────── (AND)\nАдреса мережі: 11000000.10101000.00000001.00000000  (192.168.1.0)\n",[3811,4755,4753],{"__ignoreMap":4033},[3824,4757,4758,4759,4761,4762,4764,4765,3839],{},"Результат: хост ",[3811,4760,3978],{}," з маскою ",[3811,4763,4689],{}," належить до мережі ",[3811,4766,4618],{},[4075,4768,4769,4770,4772,4773,4775,4776,4772,4778,4780],{},"Операція AND працює просто: якщо обидва біти ",[3811,4771,4011],{},", результат ",[3811,4774,4011],{},". Якщо хоча б один біт ",[3811,4777,4287],{},[3811,4779,4287],{},". Оскільки маска має одиниці у частині мережі та нулі у частині хоста, AND «обнуляє» біти хоста, залишаючи лише біти мережі.",[3841,4782,4784],{"id":4783},"cidr-нотація-префіксна-довжина","CIDR-нотація: префіксна довжина",[3824,4786,4787,4788,4790,4791,3965,4794,4796],{},"Замість запису повної маски (наприклад, ",[3811,4789,4689],{},"), сучасна практика використовує ",[3776,4792,4793],{},"CIDR-нотацію",[3828,4795,4640],{},"), що вказує кількість бітів мережі через слеш:",[3824,4798,4799,3975,4802],{},[3776,4800,4801],{},"Формат:",[3811,4803,4804],{},"IP-адреса\u002Fпрефікс",[3824,4806,4807,3975,4809],{},[3776,4808,3974],{},[3811,4810,4610],{},[3746,4812,4813,4822],{},[3749,4814,4815,4818,4819,4821],{},[3811,4816,4817],{},"\u002F24"," означає, що ",[3776,4820,4710],{}," — це частина мережі.",[3749,4823,4824,4825,4827],{},"Це еквівалентно масці ",[3811,4826,4689],{}," (24 одиниці, 8 нулів).",[3824,4829,4830],{},[3776,4831,4832],{},"Таблиця відповідності CIDR-префіксів та масок:",[4243,4834,4835,4853],{},[4246,4836,4837],{},[4249,4838,4839,4841,4843,4846,4849],{},[4252,4840,4637],{"align":4254},[4252,4842,4672],{"align":4261},[4252,4844,4845],{"align":4254},"Біти мережі",[4252,4847,4848],{"align":4254},"Біти хоста",[4252,4850,4852],{"align":4851},"right","Кількість хостів",[4273,4854,4855,4874,4893,4909,4930,4951,4972,4993,5013,5032],{},[4249,4856,4857,4861,4866,4869,4872],{},[4278,4858,4859],{"align":4254},[3811,4860,4217],{},[4278,4862,4863],{"align":4261},[3811,4864,4865],{},"255.0.0.0",[4278,4867,4868],{"align":4254},"8",[4278,4870,4871],{"align":4254},"24",[4278,4873,4301],{"align":4851},[4249,4875,4876,4881,4886,4889,4891],{},[4278,4877,4878],{"align":4254},[3811,4879,4880],{},"\u002F16",[4278,4882,4883],{"align":4261},[3811,4884,4885],{},"255.255.0.0",[4278,4887,4888],{"align":4254},"16",[4278,4890,4888],{"align":4254},[4278,4892,4330],{"align":4851},[4249,4894,4895,4899,4903,4905,4907],{},[4278,4896,4897],{"align":4254},[3811,4898,4817],{},[4278,4900,4901],{"align":4261},[3811,4902,4689],{},[4278,4904,4871],{"align":4254},[4278,4906,4868],{"align":4254},[4278,4908,4359],{"align":4851},[4249,4910,4911,4916,4921,4924,4927],{},[4278,4912,4913],{"align":4254},[3811,4914,4915],{},"\u002F25",[4278,4917,4918],{"align":4261},[3811,4919,4920],{},"255.255.255.128",[4278,4922,4923],{"align":4254},"25",[4278,4925,4926],{"align":4254},"7",[4278,4928,4929],{"align":4851},"126",[4249,4931,4932,4937,4942,4945,4948],{},[4278,4933,4934],{"align":4254},[3811,4935,4936],{},"\u002F26",[4278,4938,4939],{"align":4261},[3811,4940,4941],{},"255.255.255.192",[4278,4943,4944],{"align":4254},"26",[4278,4946,4947],{"align":4254},"6",[4278,4949,4950],{"align":4851},"62",[4249,4952,4953,4958,4963,4966,4969],{},[4278,4954,4955],{"align":4254},[3811,4956,4957],{},"\u002F27",[4278,4959,4960],{"align":4261},[3811,4961,4962],{},"255.255.255.224",[4278,4964,4965],{"align":4254},"27",[4278,4967,4968],{"align":4254},"5",[4278,4970,4971],{"align":4851},"30",[4249,4973,4974,4979,4984,4987,4990],{},[4278,4975,4976],{"align":4254},[3811,4977,4978],{},"\u002F28",[4278,4980,4981],{"align":4261},[3811,4982,4983],{},"255.255.255.240",[4278,4985,4986],{"align":4254},"28",[4278,4988,4989],{"align":4254},"4",[4278,4991,4992],{"align":4851},"14",[4249,4994,4995,5000,5005,5008,5011],{},[4278,4996,4997],{"align":4254},[3811,4998,4999],{},"\u002F29",[4278,5001,5002],{"align":4261},[3811,5003,5004],{},"255.255.255.248",[4278,5006,5007],{"align":4254},"29",[4278,5009,5010],{"align":4254},"3",[4278,5012,4947],{"align":4851},[4249,5014,5015,5020,5025,5027,5030],{},[4278,5016,5017],{"align":4254},[3811,5018,5019],{},"\u002F30",[4278,5021,5022],{"align":4261},[3811,5023,5024],{},"255.255.255.252",[4278,5026,4971],{"align":4254},[4278,5028,5029],{"align":4254},"2",[4278,5031,5029],{"align":4851},[4249,5033,5034,5039,5043,5046,5048],{},[4278,5035,5036],{"align":4254},[3811,5037,5038],{},"\u002F32",[4278,5040,5041],{"align":4261},[3811,5042,4118],{},[4278,5044,5045],{"align":4254},"32",[4278,5047,4287],{"align":4254},[4278,5049,5050],{"align":4851},"1 (одна адреса)",[3824,5052,5053],{},[3936,5054],{"alt":5055,"className":5056,"src":5057},"Схема розділення IP-адреси на мережеву та хостову частини за допомогою маски підмережі та CIDR",[3940],"\u002Fimages\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fip-addressing-ports-sockets\u002F02.jpg",[3824,5059,5060,5063],{},[3776,5061,5062],{},"Формула кількості хостів:"," 2^(кількість бітів хоста) - 2",[3824,5065,5066],{},"Віднімаємо 2, оскільки:",[3983,5068,5069,5072],{},[3749,5070,5071],{},"Перша адреса діапазону — адреса мережі (не може бути призначена хосту).",[3749,5073,5074,5075,5077],{},"Остання адреса діапазону — широкомовна адреса (",[3828,5076,4210],{},"), використовується для відправки пакета всім хостам у мережі.",[3881,5079,5080,5091],{},[3824,5081,5082],{},[3776,5083,5084,5085,5088,5089,4119],{},"Виняток для ",[3811,5086,5087],{},"\u002F31"," та ",[3811,5090,5038],{},[3746,5092,5093,5098],{},[3749,5094,5095,5097],{},[3811,5096,5087],{}," використовується для point-to-point з'єднань між маршрутизаторами (RFC 3021), де немає необхідності у адресі мережі та broadcast.",[3749,5099,5100,5102],{},[3811,5101,5038],{}," вказує на одну конкретну адресу хоста (використовується у маршрутах до окремих хостів).",[3841,5104,5106],{"id":5105},"приклад-обчислення-діапазону-адрес","Приклад обчислення діапазону адрес",[3824,5108,5109,3975,5112],{},[3776,5110,5111],{},"Мережа:",[3811,5113,5114],{},"172.16.5.64\u002F26",[3824,5116,5117,5120],{},[3776,5118,5119],{},"Крок 1:"," Визначити маску підмережі.",[3746,5122,5123,5128],{},[3749,5124,5125,5127],{},[3811,5126,4936],{}," означає 26 бітів мережі, 6 бітів хоста.",[3749,5129,5130,5131,4048,5134],{},"Маска: ",[3811,5132,5133],{},"11111111.11111111.11111111.11000000",[3811,5135,4941],{},[3824,5137,5138,5141],{},[3776,5139,5140],{},"Крок 2:"," Визначити адресу мережі (AND між IP та маскою).",[4025,5143,5146],{"className":5144,"code":5145,"language":4030},[4028],"IP:    172.16.5.64   = 10101100.00010000.00000101.01000000\nМаска: 255.255.255.192 = 11111111.11111111.11111111.11000000\n────────────────────────────────────────────────────────── (AND)\nМережа: 172.16.5.64   = 10101100.00010000.00000101.01000000\n",[3811,5147,5145],{"__ignoreMap":4033},[3824,5149,4471,5150],{},[3811,5151,5152],{},"172.16.5.64",[3824,5154,5155,5158],{},[3776,5156,5157],{},"Крок 3:"," Обчислити діапазон хостів.",[3746,5160,5161,5164,5170,5176],{},[3749,5162,5163],{},"Кількість хостів: 2⁶ - 2 = 64 - 2 = 62",[3749,5165,5166,5167],{},"Перша доступна адреса хоста: ",[3811,5168,5169],{},"172.16.5.65",[3749,5171,5172,5173],{},"Остання доступна адреса хоста: ",[3811,5174,5175],{},"172.16.5.126",[3749,5177,4486,5178],{},[3811,5179,5180],{},"172.16.5.127",[3824,5182,5183,5186],{},[3776,5184,5185],{},"Крок 4:"," Визначити наступну мережу.",[3746,5188,5189,5192],{},[3749,5190,5191],{},"Розмір блоку адрес: 2⁶ = 64 адреси",[3749,5193,5194,5195],{},"Наступна мережа: ",[3811,5196,5197],{},"172.16.5.128\u002F26",[5199,5200,5201,5261],"accordion",{},[5202,5203,5206,5209],"accordion-item",{"icon":5204,"label":5205},"i-lucide-help-circle","❓ Як швидко обчислити діапазон без двійкових перетворень?",[3824,5207,5208],{},"Є простий спосіб для обчислення діапазону адрес у межах одного октету (коли маска не виходить за межі октету):",[3983,5210,5211,5219,5235,5242,5254],{},[3749,5212,5213,5214,5216,5217,3814],{},"Знайдіть значення останнього октету маски (наприклад, ",[3811,5215,4941],{}," → останній октет ",[3811,5218,3999],{},[3749,5220,5221,5222,5225,5226,5229,5230,5225,5232,3839],{},"Обчисліть ",[3776,5223,5224],{},"розмір блоку",": ",[3811,5227,5228],{},"256 - значення_октету_маски",". Для ",[3811,5231,3999],{},[3811,5233,5234],{},"256 - 192 = 64",[3749,5236,5237,5238,5241],{},"Адреси мережі кратні розміру блоку: ",[3811,5239,5240],{},"0, 64, 128, 192"," (для останнього октету).",[3749,5243,5244,5245,5247,5248,5250,5251,3814],{},"Для ",[3811,5246,5114],{},": мережа починається з ",[3811,5249,4073],{},", закінчується перед наступним кратним (",[3811,5252,5253],{},"128 - 1 = 127",[3749,5255,4477,5256,4292,5258,5260],{},[3811,5257,5169],{},[3811,5259,5175],{}," (мінус перша та остання адреси блоку).",[5202,5262,5264,5273,5283],{"icon":5204,"label":5263},"❓ Чому не можна використовувати адресу мережі та broadcast-адресу для хостів?",[3824,5265,5266,5269,5270,5272],{},[3776,5267,5268],{},"Адреса мережі"," (всі біти хоста = 0) ідентифікує саму мережу як ціле. Вона використовується у таблицях маршрутизації для позначення напрямку: «пакети до мережі ",[3811,5271,4610],{}," відправляти через інтерфейс X».",[3824,5274,5275,5278,5279,5282],{},[3776,5276,5277],{},"Broadcast-адреса"," (всі біти хоста = 1) призначена для відправки одного пакета ",[3776,5280,5281],{},"всім"," хостам у мережі одночасно. Наприклад, ARP-запити використовують broadcast для запитання «хто має IP-адресу X?».",[3824,5284,5285],{},"Якщо дозволити призначення цих адрес окремим хостам, виникне конфлікт: маршрутизатори та протоколи не зможуть відрізнити «адресу мережі як маршрут» від «адреси конкретного хоста».",[3816,5287],{},[3819,5289,5291],{"id":5290},"приватні-та-публічні-ipv4-адреси","Приватні та публічні IPv4-адреси",[3824,5293,5294,5295,5298,5299,3965,5302,3814],{},"У міру зростання Інтернету стало очевидно, що 4.3 мільярда IPv4-адрес недостатньо для всіх пристроїв у світі. Одним з рішень стало впровадження ",[3776,5296,5297],{},"приватних діапазонів IP-адрес"," (RFC 1918) та технології ",[3776,5300,5301],{},"NAT",[3828,5303,5304],{},"Network Address Translation",[3841,5306,5308],{"id":5307},"приватні-діапазони-ipv4-rfc-1918","Приватні діапазони IPv4 (RFC 1918)",[3824,5310,5311,5314,5315,5318,5319,5322],{},[3776,5312,5313],{},"Приватні адреси"," — це спеціальні діапазони IPv4-адрес, зарезервовані для використання у ",[3776,5316,5317],{},"локальних мережах"," (домашніх, офісних, корпоративних) та ",[3776,5320,5321],{},"не маршрутизовані в Інтернеті",". Маршрутизатори Інтернету налаштовані так, щоб відкидати пакети з приватними адресами джерела або призначення.",[3824,5324,5325],{},[3776,5326,5327],{},"Три приватні діапазони:",[4243,5329,5330,5345],{},[4246,5331,5332],{},[4249,5333,5334,5337,5339,5342],{},[4252,5335,5336],{"align":4261},"Діапазон CIDR",[4252,5338,4262],{"align":4261},[4252,5340,5341],{"align":4851},"Кількість адрес",[4252,5343,5344],{"align":4261},"Типове використання",[4273,5346,5347,5367,5388],{},[4249,5348,5349,5355,5361,5364],{},[4278,5350,5351],{"align":4261},[3776,5352,5353],{},[3811,5354,4185],{},[4278,5356,5357,4292,5359],{"align":4261},[3811,5358,4474],{},[3811,5360,4489],{},[4278,5362,5363],{"align":4851},"16,777,216",[4278,5365,5366],{"align":4261},"Великі корпоративні мережі",[4249,5368,5369,5375,5382,5385],{},[4278,5370,5371],{"align":4261},[3776,5372,5373],{},[3811,5374,4188],{},[4278,5376,5377,4292,5379],{"align":4261},[3811,5378,4540],{},[3811,5380,5381],{},"172.31.255.255",[4278,5383,5384],{"align":4851},"1,048,576",[4278,5386,5387],{"align":4261},"Середні організації, дата-центри",[4249,5389,5390,5396,5404,5407],{},[4278,5391,5392],{"align":4261},[3776,5393,5394],{},[3811,5395,4191],{},[4278,5397,5398,4292,5401],{"align":4261},[3811,5399,5400],{},"192.168.0.0",[3811,5402,5403],{},"192.168.255.255",[4278,5405,5406],{"align":4851},"65,536",[4278,5408,5409],{"align":4261},"Домашні мережі, малі офіси",[3824,5411,5412],{},[3776,5413,5414],{},"Приклади використання:",[3746,5416,5417,5437],{},[3749,5418,5419,5422,5423,5426,5427,5429,5430,5433,5434,3814],{},[3776,5420,5421],{},"Домашня мережа:"," Ваш Wi-Fi-маршрутизатор зазвичай призначає пристроям адреси з діапазону ",[3811,5424,5425],{},"192.168.0.0\u002F24"," або ",[3811,5428,4610],{}," (наприклад, ноутбук отримує ",[3811,5431,5432],{},"192.168.1.10",", смартфон — ",[3811,5435,5436],{},"192.168.1.11",[3749,5438,5439,5442,5443,5445,5446,5449,5450,5453,5454,5457],{},[3776,5440,5441],{},"Корпоративна мережа:"," Велика компанія може використовувати мережу ",[3811,5444,4185],{},", розділяючи її на підмережі за відділами: ",[3811,5447,5448],{},"10.1.0.0\u002F16"," — маркетинг, ",[3811,5451,5452],{},"10.2.0.0\u002F16"," — розробка, ",[3811,5455,5456],{},"10.3.0.0\u002F16"," — адміністрація.",[3881,5459,5460,5461,5464,5465,5467,5468,5470],{},"Приватні адреси ",[3776,5462,5463],{},"не унікальні глобально",". Мільйони домашніх мереж у всьому світі використовують адреси ",[3811,5466,3913],{}," (маршрутизатор) та ",[3811,5469,3978],{}," (комп'ютер). Це не створює конфліктів, оскільки ці адреси ізольовані всередині локальної мережі та не виходять безпосередньо в Інтернет.",[3841,5472,5474],{"id":5473},"публічні-ipv4-адреси","Публічні IPv4-адреси",[3824,5476,5477,5480,5481,5484,5485,5488],{},[3776,5478,5479],{},"Публічні адреси"," — це всі інші IPv4-адреси, що ",[3776,5482,5483],{},"маршрутизуються в глобальному Інтернеті"," та мають бути ",[3776,5486,5487],{},"глобально унікальними",". Публічні адреси розподіляються централізовано:",[3983,5490,5491,5500,5509],{},[3749,5492,5493,3965,5496,5499],{},[3776,5494,5495],{},"IANA",[3828,5497,5498],{},"Internet Assigned Numbers Authority",") — центральний орган, що виділяє великі блоки адрес регіональним реєстрам.",[3749,5501,5502,3965,5505,5508],{},[3776,5503,5504],{},"RIR",[3828,5506,5507],{},"Regional Internet Registries",") — п'ять регіональних організацій (ARIN для Північної Америки, RIPE NCC для Європи, APNIC для Азії-Тихоокеанського регіону тощо), що розподіляють адреси інтернет-провайдерам.",[3749,5510,5511,3965,5514,5517],{},[3776,5512,5513],{},"ISP",[3828,5515,5516],{},"Internet Service Providers",") — інтернет-провайдери виділяють публічні адреси своїм клієнтам.",[3824,5519,5520],{},[3776,5521,5522],{},"Приклади публічних адрес:",[3746,5524,5525,5530,5536],{},[3749,5526,5527,5529],{},[3811,5528,3917],{}," — публічний DNS-сервер Google",[3749,5531,5532,5535],{},[3811,5533,5534],{},"1.1.1.1"," — публічний DNS-сервер Cloudflare",[3749,5537,5538,5541],{},[3811,5539,5540],{},"93.184.216.34"," — вебсервер example.com",[3841,5543,5545],{"id":5544},"nat-як-приватні-адреси-виходять-у-інтернет","NAT: як приватні адреси виходять у Інтернет",[3824,5547,5548,5551,5552,5555],{},[3776,5549,5550],{},"NAT (Network Address Translation)"," — це технологія, що дозволяє множині пристроїв з приватними адресами ",[3776,5553,5554],{},"спільно використовувати одну публічну IP-адресу"," для доступу до Інтернету.",[3824,5557,5558],{},[3776,5559,5560],{},"Як працює NAT (спрощено):",[3983,5562,5563,5574,5595,5622,5632,5641],{},[3749,5564,5565,5566,5568,5569,3965,5572,3814],{},"Ваш комп'ютер з приватною адресою ",[3811,5567,3978],{}," хоче відкрити сайт ",[3811,5570,5571],{},"example.com",[3811,5573,5540],{},[3749,5575,5576,5577],{},"Комп'ютер надсилає TCP SYN-пакет до порту 80:\n",[3746,5578,5579,5587],{},[3749,5580,5581,3975,5584],{},[3776,5582,5583],{},"Джерело:",[3811,5585,5586],{},"192.168.1.100:54321",[3749,5588,5589,3975,5592],{},[3776,5590,5591],{},"Призначення:",[3811,5593,5594],{},"93.184.216.34:80",[3749,5596,5597,5598,5601,5602,5605,5606],{},"Пакет проходить через NAT-маршрутизатор (домашній роутер), який ",[3776,5599,5600],{},"замінює"," приватну адресу джерела на свою публічну адресу (наприклад, ",[3811,5603,5604],{},"203.0.113.50","):\n",[3746,5607,5608,5616],{},[3749,5609,5610,3975,5613],{},[3776,5611,5612],{},"Джерело (після NAT):",[3811,5614,5615],{},"203.0.113.50:54321",[3749,5617,5618,3975,5620],{},[3776,5619,5591],{},[3811,5621,5594],{},[3749,5623,5624,5625,5628,5629,5631],{},"Маршрутизатор зберігає запис у ",[3776,5626,5627],{},"таблиці NAT",": «порт 54321 належить хосту ",[3811,5630,5586],{},"».",[3749,5633,5634,5635,5637,5638,5640],{},"Сервер ",[3811,5636,5571],{}," отримує пакет від ",[3811,5639,5615],{}," і відповідає на цю адресу.",[3749,5642,5643,5644,5646,5647,5650,5651],{},"Маршрутизатор отримує відповідь, перевіряє таблицю NAT, бачить, що порт 54321 належить ",[3811,5645,3978],{},", і ",[3776,5648,5649],{},"пересилає"," пакет у локальну мережу:\n",[3746,5652,5653],{},[3749,5654,5655,3975,5658],{},[3776,5656,5657],{},"Призначення (після зворотної трансляції):",[3811,5659,5586],{},[3824,5661,5662],{},[3936,5663],{"alt":5664,"className":5665,"src":5666},"Трансляція мережевих адрес (NAT) між приватними хостами локальної мережі та публічним Інтернетом",[3940],"\u002Fimages\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fip-addressing-ports-sockets\u002F03.png",[5668,5669,5671],"plant-uml",{"alt":5670},"Принцип роботи NAT",[4025,5672,5676],{"className":5673,"code":5674,"language":5675,"meta":4033,"style":4033},"language-plantuml shiki shiki-themes light-plus dark-plus dark-plus","@startuml\nskinparam style plain\nskinparam backgroundColor #FFFFFF\n\nactor \"Комп'ютер\\n192.168.1.100\" as PC #E2E8F0\nparticipant \"NAT Маршрутизатор\\nПриватна: 192.168.1.1\\nПублічна: 203.0.113.50\" as NAT #DBEAFE\nparticipant \"Вебсервер\\n93.184.216.34\" as Server #DCFCE7\n\nPC -> NAT : TCP SYN\\nДжерело: 192.168.1.100:54321\\nПризначення: 93.184.216.34:80\nnote right of NAT\n  NAT замінює приватну адресу\n  на публічну та зберігає\n  у таблиці трансляції:\n  54321 → 192.168.1.100:54321\nend note\n\nNAT -> Server : TCP SYN\\nДжерело: 203.0.113.50:54321\\nПризначення: 93.184.216.34:80\n\nServer -> NAT : TCP SYN-ACK\\nДжерело: 93.184.216.34:80\\nПризначення: 203.0.113.50:54321\n\nnote right of NAT\n  NAT знаходить у таблиці запис\n  для порту 54321 та пересилає\n  пакет хосту 192.168.1.100\nend note\n\nNAT -> PC : TCP SYN-ACK\\nДжерело: 93.184.216.34:80\\nПризначення: 192.168.1.100:54321\n@enduml\n","plantuml",[3811,5677,5678,5686,5692,5698,5705,5711,5717,5723,5728,5734,5740,5746,5752,5758,5764,5770,5775,5781,5786,5792,5797,5802,5808,5814,5820,5825,5830,5836],{"__ignoreMap":4033},[5679,5680,5683],"span",{"class":5681,"line":5682},"line",1,[5679,5684,5685],{},"@startuml\n",[5679,5687,5689],{"class":5681,"line":5688},2,[5679,5690,5691],{},"skinparam style plain\n",[5679,5693,5695],{"class":5681,"line":5694},3,[5679,5696,5697],{},"skinparam backgroundColor #FFFFFF\n",[5679,5699,5701],{"class":5681,"line":5700},4,[5679,5702,5704],{"emptyLinePlaceholder":5703},true,"\n",[5679,5706,5708],{"class":5681,"line":5707},5,[5679,5709,5710],{},"actor \"Комп'ютер\\n192.168.1.100\" as PC #E2E8F0\n",[5679,5712,5714],{"class":5681,"line":5713},6,[5679,5715,5716],{},"participant \"NAT Маршрутизатор\\nПриватна: 192.168.1.1\\nПублічна: 203.0.113.50\" as NAT #DBEAFE\n",[5679,5718,5720],{"class":5681,"line":5719},7,[5679,5721,5722],{},"participant \"Вебсервер\\n93.184.216.34\" as Server #DCFCE7\n",[5679,5724,5726],{"class":5681,"line":5725},8,[5679,5727,5704],{"emptyLinePlaceholder":5703},[5679,5729,5731],{"class":5681,"line":5730},9,[5679,5732,5733],{},"PC -> NAT : TCP SYN\\nДжерело: 192.168.1.100:54321\\nПризначення: 93.184.216.34:80\n",[5679,5735,5737],{"class":5681,"line":5736},10,[5679,5738,5739],{},"note right of NAT\n",[5679,5741,5743],{"class":5681,"line":5742},11,[5679,5744,5745],{},"  NAT замінює приватну адресу\n",[5679,5747,5749],{"class":5681,"line":5748},12,[5679,5750,5751],{},"  на публічну та зберігає\n",[5679,5753,5755],{"class":5681,"line":5754},13,[5679,5756,5757],{},"  у таблиці трансляції:\n",[5679,5759,5761],{"class":5681,"line":5760},14,[5679,5762,5763],{},"  54321 → 192.168.1.100:54321\n",[5679,5765,5767],{"class":5681,"line":5766},15,[5679,5768,5769],{},"end note\n",[5679,5771,5773],{"class":5681,"line":5772},16,[5679,5774,5704],{"emptyLinePlaceholder":5703},[5679,5776,5778],{"class":5681,"line":5777},17,[5679,5779,5780],{},"NAT -> Server : TCP SYN\\nДжерело: 203.0.113.50:54321\\nПризначення: 93.184.216.34:80\n",[5679,5782,5784],{"class":5681,"line":5783},18,[5679,5785,5704],{"emptyLinePlaceholder":5703},[5679,5787,5789],{"class":5681,"line":5788},19,[5679,5790,5791],{},"Server -> NAT : TCP SYN-ACK\\nДжерело: 93.184.216.34:80\\nПризначення: 203.0.113.50:54321\n",[5679,5793,5795],{"class":5681,"line":5794},20,[5679,5796,5704],{"emptyLinePlaceholder":5703},[5679,5798,5800],{"class":5681,"line":5799},21,[5679,5801,5739],{},[5679,5803,5805],{"class":5681,"line":5804},22,[5679,5806,5807],{},"  NAT знаходить у таблиці запис\n",[5679,5809,5811],{"class":5681,"line":5810},23,[5679,5812,5813],{},"  для порту 54321 та пересилає\n",[5679,5815,5817],{"class":5681,"line":5816},24,[5679,5818,5819],{},"  пакет хосту 192.168.1.100\n",[5679,5821,5823],{"class":5681,"line":5822},25,[5679,5824,5769],{},[5679,5826,5828],{"class":5681,"line":5827},26,[5679,5829,5704],{"emptyLinePlaceholder":5703},[5679,5831,5833],{"class":5681,"line":5832},27,[5679,5834,5835],{},"NAT -> PC : TCP SYN-ACK\\nДжерело: 93.184.216.34:80\\nПризначення: 192.168.1.100:54321\n",[5679,5837,5839],{"class":5681,"line":5838},28,[5679,5840,5841],{},"@enduml\n",[3824,5843,5844],{},[3776,5845,5846],{},"Переваги NAT:",[3746,5848,5849,5855],{},[3749,5850,5851,5854],{},[3776,5852,5853],{},"Економія публічних адрес:"," Сотні пристроїв у локальній мережі можуть працювати через одну публічну адресу.",[3749,5856,5857,5860],{},[3776,5858,5859],{},"Додатковий рівень безпеки:"," Зовнішні хости не мають прямого доступу до приватних адрес всередині мережі (працює як простий фаєрвол).",[3824,5862,5863],{},[3776,5864,5865],{},"Недоліки NAT:",[3746,5867,5868,5874,5880],{},[3749,5869,5870,5873],{},[3776,5871,5872],{},"Порушення end-to-end принципу:"," Пристрої за NAT не мають «справжньої» публічної адреси, що ускладнює peer-to-peer комунікацію (VoIP, онлайн-ігри, BitTorrent).",[3749,5875,5876,5879],{},[3776,5877,5878],{},"Проблеми з деякими протоколами:"," Протоколи, що вбудовують IP-адреси у корисне навантаження (FTP, SIP), потребують спеціальних модулів NAT (ALG — Application Layer Gateway).",[3749,5881,5882,5885,5886,5889],{},[3776,5883,5884],{},"Складність у налаштуванні вхідних з'єднань:"," Якщо потрібно запустити сервер за NAT (наприклад, вебсервер на домашньому комп'ютері), необхідно налаштувати ",[3776,5887,5888],{},"port forwarding"," (перенаправлення порту).",[4075,5891,5892],{},"NAT є тимчасовим рішенням проблеми вичерпання IPv4-адрес. Довгострокове рішення — перехід на IPv6, де кожен пристрій може мати глобально унікальну публічну адресу без потреби у NAT.",[3816,5894],{},[3819,5896,5898],{"id":5897},"ipv6-наступна-генерація-ip-адресації","IPv6: наступна генерація IP-адресації",[3841,5900,5902],{"id":5901},"чому-виникла-необхідність-у-ipv6","Чому виникла необхідність у IPv6",[3824,5904,5905],{},"До кінця 1990-х років стало зрозуміло, що IPv4-адреси закінчуються:",[3746,5907,5908,5914,5925],{},[3749,5909,5910,5913],{},[3776,5911,5912],{},"Експоненціальне зростання Інтернету:"," Кількість підключених пристроїв зростала швидше, ніж очікувалося. Поява смартфонів, планшетів, IoT-пристроїв (розумні лічильники, камери, холодильники, автомобілі) призвела до того, що одна людина може мати десяток підключених пристроїв.",[3749,5915,5916,5919,5920,5426,5922,5924],{},[3776,5917,5918],{},"Неефективний розподіл адрес:"," У ранні роки Інтернету адреси розподілялися неефективно: організації отримували цілі блоки ",[3811,5921,4217],{},[3811,5923,4880],{},", навіть якщо використовували лише невелику частину.",[3749,5926,5927,5930],{},[3776,5928,5929],{},"Обмеження NAT:"," Хоча NAT допоміг відстрочити кризу, він не є ідеальним рішенням через технічні обмеження та порушення end-to-end принципу.",[3824,5932,5933],{},[3776,5934,5935],{},"Останні блоки IPv4-адрес були розподілені:",[3746,5937,5938,5941,5944,5947],{},[3749,5939,5940],{},"IANA виділила останні блоки RIR у 2011 році.",[3749,5942,5943],{},"APNIC (Азія-Тихоокеанський регіон) вичерпав вільні адреси у 2011 році.",[3749,5945,5946],{},"RIPE NCC (Європа) вичерпав адреси у 2012 році.",[3749,5948,5949],{},"ARIN (Північна Америка) вичерпав адреси у 2015 році.",[3841,5951,5953],{"id":5952},"структура-ipv6-адреси","Структура IPv6-адреси",[3824,5955,5956,5959,5960,5963,5964,5967],{},[3776,5957,5958],{},"IPv6"," використовує ",[3776,5961,5962],{},"128-бітові адреси",", що записуються у ",[3776,5965,5966],{},"шістнадцятковій нотації"," з двокрапками, розділеними на вісім груп по 16 біт (4 шістнадцяткові цифри).",[3824,5969,5970],{},[3776,5971,5972],{},"Повна форма IPv6-адреси:",[4025,5974,5977],{"className":5975,"code":5976,"language":4030},[4028],"2001:0db8:85a3:0000:0000:8a2e:0370:7334\n",[3811,5978,5976],{"__ignoreMap":4033},[3824,5980,5981,5984],{},[3776,5982,5983],{},"Скорочена форма:","\nIPv6 дозволяє скорочення для зручності:",[3983,5986,5987,5998],{},[3749,5988,5989,5992],{},[3776,5990,5991],{},"Ведучі нулі у групі можна пропустити:",[4025,5993,5996],{"className":5994,"code":5995,"language":4030},[4028],"2001:0db8:85a3:0000:0000:8a2e:0370:7334\n→ 2001:db8:85a3:0:0:8a2e:370:7334\n",[3811,5997,5995],{"__ignoreMap":4033},[3749,5999,6000,6006],{},[3776,6001,6002,6003,4119],{},"Одну послідовність нульових груп можна замінити на ",[3811,6004,6005],{},"::",[4025,6007,6010],{"className":6008,"code":6009,"language":4030},[4028],"2001:db8:85a3:0:0:8a2e:370:7334\n→ 2001:db8:85a3::8a2e:370:7334\n",[3811,6011,6009],{"__ignoreMap":4033},[4632,6013,6014,6024],{},[3824,6015,6016,6017,6019,6020,6023],{},"Подвійна двокрапка ",[3811,6018,6005],{}," може використовуватися ",[3776,6021,6022],{},"лише один раз"," в адресі. Якщо використати її двічі, неможливо однозначно визначити, скільки нульових груп пропущено.",[3824,6025,6026,3975,6029,6032,6033,6036,6037,3975,6040,6043],{},[3776,6027,6028],{},"Правильно:",[3811,6030,6031],{},"2001:db8::1"," (означає ",[3811,6034,6035],{},"2001:0db8:0000:0000:0000:0000:0000:0001",")\n",[3776,6038,6039],{},"Неправильно:",[3811,6041,6042],{},"2001::db8::1"," (неоднозначно!)",[3824,6045,6046],{},[3776,6047,6048],{},"Спеціальні IPv6-адреси:",[3746,6050,6051,6064,6072,6080,6092],{},[3749,6052,6053,4170,6058,6060,6061,6063],{},[3776,6054,6055],{},[3811,6056,6057],{},"::1\u002F128",[3828,6059,4173],{},"), еквівалент ",[3811,6062,4177],{}," у IPv4.",[3749,6065,6066,6071],{},[3776,6067,6068],{},[3811,6069,6070],{},"::\u002F128"," — невизначена адреса (all-zeros), використовується при ініціалізації.",[3749,6073,6074,6079],{},[3776,6075,6076],{},[3811,6077,6078],{},"fe80::\u002F10"," — link-local адреси, використовуються для комунікації в межах локального сегмента (автоматично призначаються кожному інтерфейсу).",[3749,6081,6082,6087,6088,6091],{},[3776,6083,6084],{},[3811,6085,6086],{},"fc00::\u002F7"," — унікальні локальні адреси (",[3828,6089,6090],{},"Unique Local Addresses, ULA","), аналог приватних адрес IPv4.",[3749,6093,6094,6099],{},[3776,6095,6096],{},[3811,6097,6098],{},"ff00::\u002F8"," — мультикастові адреси (немає broadcast у IPv6, замість нього використовується multicast).",[3824,6101,6102],{},[3776,6103,6104],{},"Кількість адрес у IPv6:",[3824,6106,6107],{},"2¹²⁸ = 340,282,366,920,938,463,463,374,607,431,768,211,456 адрес (340 ундеціліонів)",[3824,6109,6110,6111,6114],{},"Це приблизно ",[3776,6112,6113],{},"670 мільйонів адрес на кожен квадратний міліметр поверхні Землі",". Практично необмежена кількість.",[3881,6116,6117],{},"IPv6 не потребує NAT: кожен пристрій може мати глобально унікальну публічну адресу. Це відновлює end-to-end принцип Інтернету, спрощує peer-to-peer комунікацію та усуває необхідність у port forwarding. Проте практика показує, що багато організацій все ще використовують фаєрволи для контролю доступу, навіть якщо NAT технічно не потрібен.",[3816,6119],{},[3819,6121,6123],{"id":6122},"структура-ip-пакету-анатомія-даних-у-мережі","Структура IP-пакету: анатомія даних у мережі",[3824,6125,6126,6127,6130,6131,3965,6134,6137],{},"Тепер, коли ми розуміємо, як адресуються вузли в мережі, розглянемо детальніше, ",[3776,6128,6129],{},"як саме дані передаються"," між ними. IP протокол інкапсулює дані з вищих рівнів у ",[3776,6132,6133],{},"IP-пакети",[3828,6135,6136],{},"IP packets",") — структуровані блоки інформації з заголовком та корисним навантаженням.",[3841,6139,6141],{"id":6140},"ipv4-пакет-структура-заголовка","IPv4 пакет: структура заголовка",[3824,6143,6144],{},"Кожен IPv4-пакет складається з двох частин:",[3983,6146,6147,6156],{},[3749,6148,6149,3965,6152,6155],{},[3776,6150,6151],{},"IP-заголовок",[3828,6153,6154],{},"IP header",") — метадані про пакет (адреси, протокол, контрольна сума тощо). Мінімальний розмір: 20 байт, максимальний: 60 байт.",[3749,6157,6158,3965,6161,6164],{},[3776,6159,6160],{},"Корисне навантаження",[3828,6162,6163],{},"payload",") — дані з вищих рівнів (TCP-сегмент, UDP-датаграма або ICMP-повідомлення).",[3824,6166,6167],{},[3936,6168],{"alt":6169,"className":6170,"src":6171},"Структура полів заголовка пакета IPv4 з їх розмірами в бітах",[3940],"\u002Fimages\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fip-addressing-ports-sockets\u002F04.JPG",[3824,6173,6174],{},[3776,6175,6176],{},"Схема IPv4-заголовка (20 байт без опцій):",[4025,6178,6181],{"className":6179,"code":6180,"language":4030},[4028]," 0                   1                   2                   3\n 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|Version|  IHL  |Type of Service|          Total Length         |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|         Identification        |Flags|      Fragment Offset    |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|  Time to Live |    Protocol   |         Header Checksum       |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|                       Source IP Address                       |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|                    Destination IP Address                     |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|                    Options (if IHL > 5)                       |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|                            Payload                            |\n|                            (Data)                             |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n",[3811,6182,6180],{"__ignoreMap":4033},[3841,6184,6186],{"id":6185},"опис-полів-ipv4-заголовка","Опис полів IPv4-заголовка",[4418,6188,6190],{"id":6189},"_1-version-4-біти","1. Version (4 біти)",[3824,6192,6193,3975,6196,6198,6199,6201],{},[3776,6194,6195],{},"Значення:",[3811,6197,4989],{}," (для IPv4) або ",[3811,6200,4947],{}," (для IPv6)",[3824,6203,6204],{},"Це поле дозволяє маршрутизаторам та хостам розрізняти IPv4 та IPv6 пакети.",[4418,6206,6208],{"id":6207},"_2-ihl-internet-header-length-4-біти","2. IHL — Internet Header Length (4 біти)",[3824,6210,6211,6213],{},[3776,6212,6195],{}," довжина заголовка у 32-бітних словах (4 байти кожне).",[3746,6215,6216,6222],{},[3749,6217,6218,6219,6221],{},"Мінімум: ",[3811,6220,4968],{}," (5 × 4 = 20 байт) — заголовок без опцій",[3749,6223,6224,6225,6228],{},"Максимум: ",[3811,6226,6227],{},"15"," (15 × 4 = 60 байт) — заголовок з опціями",[3824,6230,6231,6234],{},[3776,6232,6233],{},"Чому потрібне:"," IP-заголовок має змінну довжину через опціональне поле Options. IHL вказує, де закінчується заголовок і починається корисне навантаження.",[4418,6236,6238],{"id":6237},"_3-type-of-service-dscp-8-біт","3. Type of Service \u002F DSCP (8 біт)",[3824,6240,6241,6244],{},[3776,6242,6243],{},"Історично:"," Type of Service (ToS) використовувався для визначення пріоритету пакета.",[3824,6246,6247,3975,6250,3965,6253,6256,6257,3965,6260,6263],{},[3776,6248,6249],{},"Сучасне використання:",[3776,6251,6252],{},"DSCP",[3828,6254,6255],{},"Differentiated Services Code Point",") — перші 6 біт використовуються для ",[3776,6258,6259],{},"QoS",[3828,6261,6262],{},"Quality of Service",") класифікації трафіку:",[3746,6265,6266,6272,6278],{},[3749,6267,6268,6271],{},[3811,6269,6270],{},"000000"," (0) — Best Effort (звичайний трафік)",[3749,6273,6274,6277],{},[3811,6275,6276],{},"101110"," (46) — Expedited Forwarding (EF) — критичний трафік (VoIP)",[3749,6279,6280,6283],{},[3811,6281,6282],{},"001010"," (10) — Assured Forwarding (AF) — пріоритетний трафік",[3824,6285,6286,6289],{},[3776,6287,6288],{},"Останні 2 біти (ECN — Explicit Congestion Notification):"," використовуються для повідомлення про перевантаження мережі.",[3881,6291,6292],{},"У повсякденній роботі більшість трафіку має DSCP=0 (Best Effort). Налаштування QoS зазвичай потребується лише у корпоративних мережах для пріоритизації VoIP, відеоконференцій або критичних застосунків.",[4418,6294,6296],{"id":6295},"_4-total-length-16-біт","4. Total Length (16 біт)",[3824,6298,6299,6301],{},[3776,6300,6195],{}," загальна довжина пакета (заголовок + дані) у байтах.",[3746,6303,6304,6307],{},[3749,6305,6306],{},"Мінімум: 20 байт (тільки заголовок без даних)",[3749,6308,6309],{},"Максимум: 65,535 байт (2¹⁶ - 1)",[3824,6311,6312,6315],{},[3776,6313,6314],{},"Практичне обмеження:"," більшість мереж обмежують розмір пакета через MTU (зазвичай 1500 байт для Ethernet). Пакети більші за MTU фрагментуються.",[4418,6317,6319],{"id":6318},"_5-identification-16-біт","5. Identification (16 біт)",[3824,6321,6322,6324],{},[3776,6323,5591],{}," унікальний ідентифікатор для групи фрагментів одного пакета.",[3824,6326,6327,6328,6331],{},"Коли великий пакет фрагментується, всі фрагменти отримують ",[3776,6329,6330],{},"однаковий"," Identification, що дозволяє одержувачу зібрати їх назад у правильному порядку.",[3824,6333,6334],{},[3776,6335,3974],{},[4025,6337,6340],{"className":6338,"code":6339,"language":4030},[4028],"Оригінальний пакет ID=12345 розбивається на 3 фрагменти:\n  Fragment 1: ID=12345, Offset=0\n  Fragment 2: ID=12345, Offset=185\n  Fragment 3: ID=12345, Offset=370\n",[3811,6341,6339],{"__ignoreMap":4033},[4418,6343,6345],{"id":6344},"_6-flags-3-біти","6. Flags (3 біти)",[3824,6347,6348,6351,6352,6355,6356,6358,6359,6362,6363,6355,6366,6368,6369,6372],{},[3776,6349,6350],{},"Біт 0:"," зарезервований (завжди 0)\n",[3776,6353,6354],{},"Біт 1 (DF — Don't Fragment):"," якщо встановлений у ",[3811,6357,4011],{},", пакет ",[3776,6360,6361],{},"не можна фрагментувати",". Якщо пакет занадто великий, маршрутизатор відкидає його та відправляє ICMP повідомлення \"Fragmentation Needed\".\n",[3776,6364,6365],{},"Біт 2 (MF — More Fragments):",[3811,6367,4011],{},", це означає, що ",[3776,6370,6371],{},"є ще фрагменти",". Останній фрагмент має MF=0.",[3824,6374,6375,6378,6379,6382],{},[3776,6376,6377],{},"Використання DF=1:"," сучасні системи встановлюють DF=1 для використання ",[3776,6380,6381],{},"Path MTU Discovery"," — автоматичного виявлення максимального розміру пакета, що може пройти без фрагментації.",[4418,6384,6386],{"id":6385},"_7-fragment-offset-13-біт","7. Fragment Offset (13 біт)",[3824,6388,6389,6391,6392,6395],{},[3776,6390,6195],{}," позиція цього фрагмента у оригінальному пакеті, виміряна у ",[3776,6393,6394],{},"8-байтних блоках"," (не в байтах!).",[3824,6397,6398,6401],{},[3776,6399,6400],{},"Чому в 8-байтних блоках?"," Економія біт. 13 біт дозволяють адресувати 8192 блоки × 8 байт = 65,536 байт (максимальний розмір IPv4 пакета).",[3824,6403,6404],{},[3776,6405,3974],{},[4025,6407,6410],{"className":6408,"code":6409,"language":4030},[4028],"Фрагмент з Offset=185 означає:\n185 × 8 = 1480 байт від початку оригінального пакета\n",[3811,6411,6409],{"__ignoreMap":4033},[4418,6413,6415],{"id":6414},"_8-time-to-live-ttl-8-біт","8. Time To Live \u002F TTL (8 біт)",[3824,6417,6418,6420,6421,6424],{},[3776,6419,6195],{}," максимальна кількість ",[3776,6422,6423],{},"hop"," (стрибків через маршрутизатори), які може зробити пакет.",[3746,6426,6427,6433,6439],{},[3749,6428,6429,6432],{},[3776,6430,6431],{},"Початкове значення:"," встановлюється відправником (зазвичай 64 або 128)",[3749,6434,6435,6438],{},[3776,6436,6437],{},"На кожному маршрутизаторі:"," TTL зменшується на 1",[3749,6440,6441,6444,6445,6448],{},[3776,6442,6443],{},"Коли TTL=0:"," маршрутизатор ",[3776,6446,6447],{},"відкидає пакет"," та відправляє ICMP повідомлення \"Time Exceeded\" відправнику",[3824,6450,6451],{},[3776,6452,3974],{},[4025,6454,6457],{"className":6455,"code":6456,"language":4030},[4028],"Комп'ютер відправляє пакет з TTL=64\n    ↓\nRouter 1: TTL=63 (зменшує на 1, пересилає далі)\n    ↓\nRouter 2: TTL=62\n    ↓\nRouter 3: TTL=61\n    ↓\nСервер отримує пакет з TTL=61\n",[3811,6458,6456],{"__ignoreMap":4033},[3824,6460,6461,6464,6465,6468],{},[3776,6462,6463],{},"Навіщо TTL?"," Захист від ",[3776,6466,6467],{},"нескінченних циклів маршрутизації",". Якщо в таблицях маршрутизації є помилка, що створює цикл (A → B → C → A), пакет буде циркулювати назавжди, перевантажуючи мережу. TTL гарантує, що пакет буде відкинуто через певну кількість кроків.",[3824,6470,6471,6474,6475,6478],{},[3776,6472,6473],{},"Використання TTL у діагностиці:"," утиліта ",[3811,6476,6477],{},"traceroute"," використовує TTL для визначення маршруту:",[3983,6480,6481,6484,6487],{},[3749,6482,6483],{},"Відправляє пакет з TTL=1 → перший роутер відповідає \"Time Exceeded\"",[3749,6485,6486],{},"Відправляє пакет з TTL=2 → другий роутер відповідає \"Time Exceeded\"",[3749,6488,6489],{},"Продовжує збільшувати TTL, поки не досягне призначення",[4075,6491,6492,6497,6508],{},[3824,6493,6494],{},[3776,6495,6496],{},"Як визначити ОС за TTL:",[3746,6498,6499,6502,6505],{},[3749,6500,6501],{},"TTL=64 у відповіді → зазвичай Linux\u002FUnix\u002FmacOS",[3749,6503,6504],{},"TTL=128 у відповіді → зазвичай Windows",[3749,6506,6507],{},"TTL=255 у відповіді → зазвичай Cisco\u002Fмережеве обладнання",[3824,6509,6510],{},"Точне значення може відрізнятися залежно від кількості hop між вами та хостом.",[4418,6512,6514],{"id":6513},"_9-protocol-8-біт","9. Protocol (8 біт)",[3824,6516,6517,6519,6520,6523],{},[3776,6518,6195],{}," визначає ",[3776,6521,6522],{},"протокол вищого рівня"," (транспортного або мережевого), чиї дані знаходяться у корисному навантаженні.",[3824,6525,6526],{},[3776,6527,6528],{},"Найпоширеніші значення:",[4243,6530,6531,6543],{},[4246,6532,6533],{},[4249,6534,6535,6538,6541],{},[4252,6536,6537],{"align":4254},"Значення",[4252,6539,6540],{"align":4261},"Протокол",[4252,6542,4271],{"align":4261},[4273,6544,6545,6557,6569,6582,6594,6607,6620,6633],{},[4249,6546,6547,6551,6554],{},[4278,6548,6549],{"align":4254},[3776,6550,4011],{},[4278,6552,6553],{"align":4261},"ICMP",[4278,6555,6556],{"align":4261},"Internet Control Message Protocol (ping, traceroute, повідомлення про помилки)",[4249,6558,6559,6563,6566],{},[4278,6560,6561],{"align":4254},[3776,6562,4947],{},[4278,6564,6565],{"align":4261},"TCP",[4278,6567,6568],{"align":4261},"Transmission Control Protocol (надійна передача з встановленням з'єднання)",[4249,6570,6571,6576,6579],{},[4278,6572,6573],{"align":4254},[3776,6574,6575],{},"17",[4278,6577,6578],{"align":4261},"UDP",[4278,6580,6581],{"align":4261},"User Datagram Protocol (швидка ненадійна передача без з'єднання)",[4249,6583,6584,6589,6591],{},[4278,6585,6586],{"align":4254},[3776,6587,6588],{},"41",[4278,6590,5958],{"align":4261},[4278,6592,6593],{"align":4261},"IPv6 інкапсульований у IPv4 (тунелювання 6in4)",[4249,6595,6596,6601,6604],{},[4278,6597,6598],{"align":4254},[3776,6599,6600],{},"47",[4278,6602,6603],{"align":4261},"GRE",[4278,6605,6606],{"align":4261},"Generic Routing Encapsulation (VPN тунелі)",[4249,6608,6609,6614,6617],{},[4278,6610,6611],{"align":4254},[3776,6612,6613],{},"50",[4278,6615,6616],{"align":4261},"ESP",[4278,6618,6619],{"align":4261},"Encapsulating Security Payload (IPsec шифрування)",[4249,6621,6622,6627,6630],{},[4278,6623,6624],{"align":4254},[3776,6625,6626],{},"51",[4278,6628,6629],{"align":4261},"AH",[4278,6631,6632],{"align":4261},"Authentication Header (IPsec автентифікація)",[4249,6634,6635,6640,6643],{},[4278,6636,6637],{"align":4254},[3776,6638,6639],{},"89",[4278,6641,6642],{"align":4261},"OSPF",[4278,6644,6645],{"align":4261},"Open Shortest Path First (протокол маршрутизації)",[3824,6647,6648],{},[3776,6649,6650],{},"Як це працює:",[3983,6652,6653,6656,6659,6662,6665],{},[3749,6654,6655],{},"IP-рівень отримує пакет.",[3749,6657,6658],{},"Читає поле Protocol.",[3749,6660,6661],{},"Якщо Protocol=6 (TCP), передає дані TCP-обробнику.",[3749,6663,6664],{},"Якщо Protocol=17 (UDP), передає дані UDP-обробнику.",[3749,6666,6667],{},"Якщо Protocol=1 (ICMP), обробляє як ICMP-повідомлення.",[4418,6669,6671],{"id":6670},"_10-header-checksum-16-біт","10. Header Checksum (16 біт)",[3824,6673,6674,6676,6677,6680],{},[3776,6675,5591],{}," виявлення помилок у ",[3776,6678,6679],{},"заголовку"," (не в даних!).",[3824,6682,6683],{},[3776,6684,6685],{},"Як працює:",[3983,6687,6688,6691,6694],{},[3749,6689,6690],{},"Відправник обчислює контрольну суму заголовка (з полем Checksum=0).",[3749,6692,6693],{},"Записує результат у поле Checksum.",[3749,6695,6696,6697],{},"Кожен маршрутизатор:\n",[3746,6698,6699,6702,6705,6708],{},[3749,6700,6701],{},"Перевіряє контрольну суму заголовка.",[3749,6703,6704],{},"Якщо не співпадає → відкидає пакет (пошкоджений заголовок).",[3749,6706,6707],{},"Змінює TTL (зменшує на 1).",[3749,6709,6710,6713],{},[3776,6711,6712],{},"Перераховує"," контрольну суму (оскільки TTL змінився).",[3881,6715,6716,6719],{},[3776,6717,6718],{},"Чому контрольна сума тільки для заголовка?","\nПеревірка цілісності даних — відповідальність вищих рівнів (TCP має свою контрольну суму для всього сегмента). Це дозволяє маршрутизаторам швидко перевіряти тільки заголовок без обробки всього пакета.",[4418,6721,6723],{"id":6722},"_11-source-ip-address-32-біти","11. Source IP Address (32 біти)",[3824,6725,6726],{},"IP-адреса відправника пакета.",[4418,6728,6730],{"id":6729},"_12-destination-ip-address-32-біти","12. Destination IP Address (32 біти)",[3824,6732,6733],{},"IP-адреса одержувача пакета.",[4418,6735,6737],{"id":6736},"_13-options-змінна-довжина-0-40-байт","13. Options (змінна довжина, 0-40 байт)",[3824,6739,6740,6743],{},[3776,6741,6742],{},"Опціональне поле"," для додаткових функцій:",[3746,6745,6746,6752,6758],{},[3749,6747,6748,6751],{},[3776,6749,6750],{},"Record Route:"," записує IP-адреси всіх маршрутизаторів на шляху.",[3749,6753,6754,6757],{},[3776,6755,6756],{},"Timestamp:"," записує час проходження через маршрутизатори.",[3749,6759,6760,6763],{},[3776,6761,6762],{},"Source Routing:"," відправник вказує точний маршрут пакета.",[3824,6765,6766,6769],{},[3776,6767,6768],{},"Практика:"," опції рідко використовуються у сучасних мережах через:",[3746,6771,6772,6775,6778],{},[3749,6773,6774],{},"Проблеми з безпекою (Source Routing дозволяє обходити фаєрволи).",[3749,6776,6777],{},"Падіння продуктивності (маршрутизатори обробляють пакети з опціями повільніше).",[3749,6779,6780],{},"Багато маршрутизаторів відкидають пакети з опціями за замовчуванням.",[3841,6782,6784],{"id":6783},"приклад-реального-ipv4-пакету-hex-dump-та-розбір","Приклад реального IPv4-пакету: hex dump та розбір",[3824,6786,6787],{},"Розглянемо реальний захоплений IP-пакет (TCP SYN до вебсервера):",[3824,6789,6790],{},[3776,6791,6792],{},"Hex dump заголовка:",[4025,6794,6797],{"className":6795,"code":6796,"language":4030},[4028],"45 00 00 3c 1c 46 40 00 40 06 b1 e6 c0 a8 01 64 5d b8 d8 22\n",[3811,6798,6796],{"__ignoreMap":4033},[3824,6800,6801],{},[3776,6802,6803],{},"Побайтовий розбір:",[4025,6805,6808],{"className":6806,"code":6807,"language":4030},[4028],"Байти 0-1:  45 00\n  Version=4, IHL=5 (4 біти + 4 біти)\n    0x4 = 0100 (Version=4)\n    0x5 = 0101 (IHL=5, тобто 5×4=20 байт заголовок)\n  DSCP\u002FECN=0 (8 біт)\n    0x00 = Best Effort (немає пріоритету)\n\nБайти 2-3:  00 3c\n  Total Length = 0x003c = 60 байт\n    (20 байт IP-заголовок + 40 байт TCP-сегмент)\n\nБайти 4-5:  1c 46\n  Identification = 0x1c46 = 7238\n    (унікальний ID для можливої фрагментації)\n\nБайти 6-7:  40 00\n  Flags + Fragment Offset\n    0x4000 у двійковій: 0100 0000 0000 0000\n    Flags: 010 → DF=1 (Don't Fragment), MF=0 (немає більше фрагментів)\n    Offset: 0000 0000 0000 = 0 (це перший\u002Fєдиний фрагмент)\n\nБайт 8:     40\n  TTL = 0x40 = 64\n    (стандартне початкове значення для Linux)\n\nБайт 9:     06\n  Protocol = 0x06 = 6 → TCP\n    (дані у payload — TCP-сегмент)\n\nБайти 10-11: b1 e6\n  Header Checksum = 0xb1e6\n    (контрольна сума для перевірки цілісності заголовка)\n\nБайти 12-15: c0 a8 01 64\n  Source IP = 192.168.1.100\n    c0 = 192, a8 = 168, 01 = 1, 64 = 100\n\nБайти 16-19: 5d b8 d8 22\n  Destination IP = 93.184.216.34\n    5d = 93, b8 = 184, d8 = 216, 22 = 34\n    (це example.com)\n",[3811,6809,6807],{"__ignoreMap":4033},[3824,6811,6812],{},[3776,6813,6814],{},"Підсумок пакету:",[3746,6816,6817,6820,6823,6826,6829,6832,6835,6838],{},[3749,6818,6819],{},"Версія: IPv4",[3749,6821,6822],{},"Розмір заголовка: 20 байт (без опцій)",[3749,6824,6825],{},"Загальний розмір: 60 байт",[3749,6827,6828],{},"TTL: 64 (Linux відправник)",[3749,6830,6831],{},"Протокол: TCP",[3749,6833,6834],{},"Від: 192.168.1.100 (приватна адреса)",[3749,6836,6837],{},"До: 93.184.216.34 (example.com)",[3749,6839,6840],{},"Флаг DF встановлений (використовує Path MTU Discovery)",[4075,6842,6843,6848],{},[3824,6844,6845],{},[3776,6846,6847],{},"Як самостійно захопити та проаналізувати пакети:",[3983,6849,6850,6877],{},[3749,6851,6852,6855,6856],{},[3776,6853,6854],{},"Wireshark"," (GUI):",[3746,6857,6858,6861,6864,6871,6874],{},[3749,6859,6860],{},"Запустіть Wireshark",[3749,6862,6863],{},"Оберіть мережевий інтерфейс",[3749,6865,6866,6867,6870],{},"Застосуйте фільтр: ",[3811,6868,6869],{},"ip.addr == 8.8.8.8"," (для фільтрації за IP)",[3749,6872,6873],{},"Клацніть на пакет → вкладка \"Internet Protocol Version 4\"",[3749,6875,6876],{},"Wireshark автоматично розбирає всі поля",[3749,6878,6879,6882,6883,6923,6926,6927],{},[3776,6880,6881],{},"tcpdump"," (командний рядок):",[4025,6884,6888],{"className":6885,"code":6886,"language":6887,"meta":4033,"style":4033},"language-bash shiki shiki-themes light-plus dark-plus dark-plus","sudo tcpdump -i any -n -X 'host 8.8.8.8 and tcp' -c 1\n","bash",[3811,6889,6890],{"__ignoreMap":4033},[5679,6891,6892,6896,6900,6904,6907,6910,6913,6916,6919],{"class":5681,"line":5682},[5679,6893,6895],{"class":6894},"s8Opu","sudo",[5679,6897,6899],{"class":6898},"sbdoH"," tcpdump",[5679,6901,6903],{"class":6902},"su1O8"," -i",[5679,6905,6906],{"class":6898}," any",[5679,6908,6909],{"class":6902}," -n",[5679,6911,6912],{"class":6902}," -X",[5679,6914,6915],{"class":6898}," 'host 8.8.8.8 and tcp'",[5679,6917,6918],{"class":6902}," -c",[5679,6920,6922],{"class":6921},"sJj4R"," 1\n",[6924,6925],"br",{},"Ключі:",[3746,6928,6929,6935,6941,6947],{},[3749,6930,6931,6934],{},[3811,6932,6933],{},"-i any"," — захоплення на всіх інтерфейсах",[3749,6936,6937,6940],{},[3811,6938,6939],{},"-n"," — не перетворювати IP у DNS-імена",[3749,6942,6943,6946],{},[3811,6944,6945],{},"-X"," — показати hex dump",[3749,6948,6949,6952],{},[3811,6950,6951],{},"-c 1"," — захопити 1 пакет",[3816,6954],{},[3819,6956,6958],{"id":6957},"порти-мультиплексування-мережевих-зєднань","Порти: мультиплексування мережевих з'єднань",[3824,6960,6961,6962,6965,6966,6969],{},"IP-адреса ідентифікує ",[3776,6963,6964],{},"пристрій"," у мережі, але на одному пристрої зазвичай працює ",[3776,6967,6968],{},"множина програм",", що одночасно використовують мережу: веббраузер відкриває кілька вкладок, поштовий клієнт перевіряє пошту, месенджер підтримує з'єднання, операційна система синхронізує час з NTP-сервером. Як операційна система визначає, якій програмі призначені вхідні дані?",[3824,6971,6972,6973,3965,6976,3814],{},"Відповідь: через ",[3776,6974,6975],{},"номери портів",[3828,6977,6978],{},"port numbers",[3841,6980,6982],{"id":6981},"що-таке-порт","Що таке порт",[3824,6984,6985,6988,6989,6992],{},[3776,6986,6987],{},"Порт"," — це 16-бітове число (від 0 до 65535), що ідентифікує ",[3776,6990,6991],{},"конкретний процес або службу"," на вузлі. Порт є частиною адреси транспортного рівня (TCP або UDP) та працює у комбінації з IP-адресою для унікальної ідентифікації кінцевої точки комунікації.",[3824,6994,6995,6998,6999,7002],{},[3776,6996,6997],{},"Аналогія:"," Якщо IP-адреса — це адреса будинку (країна, місто, вулиця, будинок), то порт — це ",[3776,7000,7001],{},"номер квартири"," у цьому будинку. Поштар (маршрутизатор) доставляє лист до будинку за IP-адресою, а співробітник будинку (операційна система) передає лист у конкретну квартиру за номером порту.",[3841,7004,7006],{"id":7005},"діапазони-портів","Діапазони портів",[3824,7008,7009],{},"Порти поділяються на три категорії відповідно до рекомендацій IANA:",[4243,7011,7012,7027],{},[4246,7013,7014],{},[4249,7015,7016,7019,7022,7024],{},[4252,7017,7018],{"align":4261},"Діапазон",[4252,7020,7021],{"align":4261},"Назва",[4252,7023,4271],{"align":4261},[4252,7025,7026],{"align":4261},"Приклади",[4273,7028,7029,7048,7067],{},[4249,7030,7031,7036,7042,7045],{},[4278,7032,7033],{"align":4261},[3776,7034,7035],{},"0 — 1023",[4278,7037,7038,7039,7041],{"align":4261},"Well-Known Ports",[6924,7040],{},"(Добре відомі порти)",[4278,7043,7044],{"align":4261},"Зарезервовані для стандартних системних служб та протоколів",[4278,7046,7047],{"align":4261},"HTTP (80), HTTPS (443), SSH (22), FTP (21), SMTP (25), DNS (53)",[4249,7049,7050,7055,7061,7064],{},[4278,7051,7052],{"align":4261},[3776,7053,7054],{},"1024 — 49151",[4278,7056,7057,7058,7060],{"align":4261},"Registered Ports",[6924,7059],{},"(Зареєстровані порти)",[4278,7062,7063],{"align":4261},"Реєструються IANA для специфічних застосунків",[4278,7065,7066],{"align":4261},"MySQL (3306), PostgreSQL (5432), Redis (6379), MongoDB (27017)",[4249,7068,7069,7074,7080,7083],{},[4278,7070,7071],{"align":4261},[3776,7072,7073],{},"49152 — 65535",[4278,7075,7076,7077,7079],{"align":4261},"Dynamic\u002FPrivate Ports",[6924,7078],{},"(Динамічні\u002Fприватні порти)",[4278,7081,7082],{"align":4261},"Використовуються клієнтськими програмами для тимчасових з'єднань",[4278,7084,7085],{"align":4261},"Операційна система автоматично призначає вільний порт при відкритті вихідного з'єднання",[3824,7087,7088],{},[3776,7089,7090],{},"Найпоширеніші порти:",[4243,7092,7093,7103],{},[4246,7094,7095],{},[4249,7096,7097,7099,7101],{},[4252,7098,6987],{"align":4851},[4252,7100,6540],{"align":4261},[4252,7102,4271],{"align":4261},[4273,7104,7105,7118,7131,7144,7156,7169,7182,7194,7207,7220,7233,7246,7259,7272,7285],{},[4249,7106,7107,7112,7115],{},[4278,7108,7109],{"align":4851},[3776,7110,7111],{},"20, 21",[4278,7113,7114],{"align":4261},"FTP",[4278,7116,7117],{"align":4261},"File Transfer Protocol (дані та команди)",[4249,7119,7120,7125,7128],{},[4278,7121,7122],{"align":4851},[3776,7123,7124],{},"22",[4278,7126,7127],{"align":4261},"SSH",[4278,7129,7130],{"align":4261},"Secure Shell (віддалений доступ)",[4249,7132,7133,7138,7141],{},[4278,7134,7135],{"align":4851},[3776,7136,7137],{},"23",[4278,7139,7140],{"align":4261},"Telnet",[4278,7142,7143],{"align":4261},"Незахищений віддалений доступ (застарілий)",[4249,7145,7146,7150,7153],{},[4278,7147,7148],{"align":4851},[3776,7149,4923],{},[4278,7151,7152],{"align":4261},"SMTP",[4278,7154,7155],{"align":4261},"Відправка електронної пошти",[4249,7157,7158,7163,7166],{},[4278,7159,7160],{"align":4851},[3776,7161,7162],{},"53",[4278,7164,7165],{"align":4261},"DNS",[4278,7167,7168],{"align":4261},"Domain Name System (UDP\u002FTCP)",[4249,7170,7171,7176,7179],{},[4278,7172,7173],{"align":4851},[3776,7174,7175],{},"80",[4278,7177,7178],{"align":4261},"HTTP",[4278,7180,7181],{"align":4261},"Незахищений вебтрафік",[4249,7183,7184,7188,7191],{},[4278,7185,7186],{"align":4851},[3776,7187,4345],{},[4278,7189,7190],{"align":4261},"POP3",[4278,7192,7193],{"align":4261},"Отримання пошти",[4249,7195,7196,7201,7204],{},[4278,7197,7198],{"align":4851},[3776,7199,7200],{},"143",[4278,7202,7203],{"align":4261},"IMAP",[4278,7205,7206],{"align":4261},"Отримання пошти (з синхронізацією)",[4249,7208,7209,7214,7217],{},[4278,7210,7211],{"align":4851},[3776,7212,7213],{},"443",[4278,7215,7216],{"align":4261},"HTTPS",[4278,7218,7219],{"align":4261},"Захищений вебтрафік (HTTP over TLS)",[4249,7221,7222,7227,7230],{},[4278,7223,7224],{"align":4851},[3776,7225,7226],{},"3306",[4278,7228,7229],{"align":4261},"MySQL",[4278,7231,7232],{"align":4261},"База даних MySQL",[4249,7234,7235,7240,7243],{},[4278,7236,7237],{"align":4851},[3776,7238,7239],{},"3389",[4278,7241,7242],{"align":4261},"RDP",[4278,7244,7245],{"align":4261},"Remote Desktop Protocol (Windows)",[4249,7247,7248,7253,7256],{},[4278,7249,7250],{"align":4851},[3776,7251,7252],{},"5432",[4278,7254,7255],{"align":4261},"PostgreSQL",[4278,7257,7258],{"align":4261},"База даних PostgreSQL",[4249,7260,7261,7266,7269],{},[4278,7262,7263],{"align":4851},[3776,7264,7265],{},"6379",[4278,7267,7268],{"align":4261},"Redis",[4278,7270,7271],{"align":4261},"In-memory база даних Redis",[4249,7273,7274,7279,7282],{},[4278,7275,7276],{"align":4851},[3776,7277,7278],{},"8080",[4278,7280,7281],{"align":4261},"HTTP альтернативний",[4278,7283,7284],{"align":4261},"Часто використовується для розробки",[4249,7286,7287,7292,7295],{},[4278,7288,7289],{"align":4851},[3776,7290,7291],{},"27017",[4278,7293,7294],{"align":4261},"MongoDB",[4278,7296,7297],{"align":4261},"NoSQL база даних MongoDB",[4075,7299,7300,7301,7304],{},"Для запуску серверного застосунку на портах 0-1023 у UNIX-подібних системах (Linux, macOS) зазвичай потрібні права адміністратора (",[3828,7302,7303],{},"root","), оскільки ці порти вважаються привілейованими. Для розробки зручніше використовувати порти вище 1024 (наприклад, 3000, 8000, 8080), що не вимагають підвищених прав.",[3841,7306,7308],{"id":7307},"порти-у-tcp-та-udp","Порти у TCP та UDP",[3824,7310,7311,7312,7315,7316,7319],{},"Порти є концепцією ",[3776,7313,7314],{},"транспортного рівня"," та існують як у TCP, так і в UDP. Важливо розуміти, що ",[3776,7317,7318],{},"TCP-порт 80 та UDP-порт 80 — це різні порти",", оскільки вони належать різним протоколам.",[3824,7321,7322],{},[3776,7323,3974],{},[3746,7325,7326,7333],{},[3749,7327,7328,7329,7332],{},"Вебсервер слухає ",[3776,7330,7331],{},"TCP-порт 80"," для HTTP-запитів.",[3749,7334,7335,7336,7339],{},"DNS-сервер слухає ",[3776,7337,7338],{},"UDP-порт 53"," для запитів (а також TCP-порт 53 для зонних трансферів).",[3824,7341,7342,7343,7346],{},"Операційна система веде ",[3776,7344,7345],{},"окремі таблиці портів"," для TCP та UDP, тому один і той же номер порту може використовуватися обома протоколами одночасно без конфлікту.",[3841,7348,7350],{"id":7349},"клієнт-серверна-модель-та-порти","Клієнт-серверна модель та порти",[3824,7352,7353],{},"У типовій клієнт-серверній взаємодії:",[3746,7355,7356,7366],{},[3749,7357,7358,7361,7362,7365],{},[3776,7359,7360],{},"Сервер"," слухає на ",[3776,7363,7364],{},"добре відомому порті"," (наприклад, вебсервер на порті 80), очікуючи вхідних з'єднань.",[3749,7367,7368,7371,7372,7375],{},[3776,7369,7370],{},"Клієнт"," відкриває з'єднання з сервера, використовуючи ",[3776,7373,7374],{},"випадковий (ефемерний) порт"," з діапазону 49152-65535, призначений операційною системою.",[3824,7377,7378],{},[3776,7379,7380],{},"Приклад з'єднання:",[3746,7382,7383,7391],{},[3749,7384,7385,3975,7388,7390],{},[3776,7386,7387],{},"Клієнт:",[3811,7389,5586],{}," (IP клієнта + випадковий порт)",[3749,7392,7393,3975,7396,7398],{},[3776,7394,7395],{},"Сервер:",[3811,7397,5594],{}," (IP сервера + порт HTTP)",[3824,7400,7401,7402,4119],{},"Коли клієнт одночасно відкриває кілька з'єднань до того самого сервера (наприклад, завантажує кілька ресурсів вебсторінки), кожне з'єднання має ",[3776,7403,7404],{},"унікальний порт джерела",[3746,7406,7407,7413,7419],{},[3749,7408,7409,7410],{},"З'єднання 1: ",[3811,7411,7412],{},"192.168.1.100:54321 → 93.184.216.34:80",[3749,7414,7415,7416],{},"З'єднання 2: ",[3811,7417,7418],{},"192.168.1.100:54322 → 93.184.216.34:80",[3749,7420,7421,7422],{},"З'єднання 3: ",[3811,7423,7424],{},"192.168.1.100:54323 → 93.184.216.34:80",[3824,7426,7427],{},"Сервер розрізняє ці з'єднання за портом джерела клієнта.",[3816,7429],{},[3819,7431,7433],{"id":7432},"сокети-комбінація-ip-адреси-та-порту","Сокети: комбінація IP-адреси та порту",[3841,7435,7437],{"id":7436},"визначення-сокета","Визначення сокета",[3824,7439,7440,3965,7443,7446,7447,7450,7451,3965,7454,7457],{},[3776,7441,7442],{},"Сокет",[3828,7444,7445],{},"socket",") — це ",[3776,7448,7449],{},"комбінація IP-адреси та порту",", що унікально ідентифікує ",[3776,7452,7453],{},"кінцеву точку",[3828,7455,7456],{},"endpoint",") мережевого з'єднання. Сокет є фундаментальною абстракцією для мережевого програмування.",[3824,7459,7460],{},[3776,7461,7462],{},"Формат сокета:",[4025,7464,7467],{"className":7465,"code":7466,"language":4030},[4028],"IP-адреса:порт\n",[3811,7468,7466],{"__ignoreMap":4033},[3824,7470,7471],{},[3776,7472,7473],{},"Приклади сокетів:",[3746,7475,7476,7481],{},[3749,7477,7478,7479],{},"IPv4: ",[3811,7480,3813],{},[3749,7482,7483,7484,7487],{},"IPv6: ",[3811,7485,7486],{},"[2001:db8::1]:8080"," (квадратні дужки використовуються, щоб відділити IP від порту)",[3824,7489,7490],{},[3936,7491],{"alt":7492,"className":7493,"src":7494},"Концепція мережевого сокета як кінцевої точки комунікації через комбінацію IP-адреси та порту",[3940],"\u002Fimages\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fip-addressing-ports-sockets\u002F05.webp",[3841,7496,7498],{"id":7497},"пятикомпонентна-ідентифікація-зєднання","П'ятикомпонентна ідентифікація з'єднання",[3824,7500,7501,7502,3965,7505,3909],{},"Кожне мережеве з'єднання унікально ідентифікується ",[3776,7503,7504],{},"п'ятьма компонентами",[3828,7506,7507],{},"5-tuple",[3983,7509,7510,7516,7522,7528,7534],{},[3749,7511,7512,7515],{},[3776,7513,7514],{},"Протокол транспортного рівня:"," TCP або UDP",[3749,7517,7518,7521],{},[3776,7519,7520],{},"IP-адреса джерела:"," адреса клієнта",[3749,7523,7524,7527],{},[3776,7525,7526],{},"Порт джерела:"," порт клієнта",[3749,7529,7530,7533],{},[3776,7531,7532],{},"IP-адреса призначення:"," адреса сервера",[3749,7535,7536,7539],{},[3776,7537,7538],{},"Порт призначення:"," порт сервера",[3824,7541,7542],{},[3776,7543,7544],{},"Приклад унікального з'єднання:",[4025,7546,7549],{"className":7547,"code":7548,"language":4030},[4028],"TCP  192.168.1.100:54321 → 93.184.216.34:443\n",[3811,7550,7548],{"__ignoreMap":4033},[3824,7552,7553,7554,7557],{},"Операційна система використовує цю п'ятикомпонентну комбінацію для ",[3776,7555,7556],{},"демультиплексування"," вхідних пакетів: вона визначає, якому сокету (і, відповідно, якому процесу) призначений кожен пакет.",[5668,7559,7561],{"alt":7560},"Мультиплексування через порти та сокети",[4025,7562,7564],{"className":5673,"code":7563,"language":5675,"meta":4033,"style":4033},"@startuml\nskinparam style plain\nskinparam backgroundColor #FFFFFF\n\nrectangle \"Комп'ютер 192.168.1.100\" as Host #E2E8F0 {\n    rectangle \"Веббраузер\\nПроцес PID 1234\" as Browser #FEF3C7 {\n        [Сокет 1\\n192.168.1.100:54321] as S1\n        [Сокет 2\\n192.168.1.100:54322] as S2\n    }\n    \n    rectangle \"Email клієнт\\nПроцес PID 5678\" as Email #DBEAFE {\n        [Сокет 3\\n192.168.1.100:54323] as S3\n    }\n    \n    rectangle \"SSH клієнт\\nПроцес PID 9012\" as SSH #DCFCE7 {\n        [Сокет 4\\n192.168.1.100:54324] as S4\n    }\n}\n\ncloud \"Інтернет\" as Internet #FDE68A\n\nrectangle \"Вебсервер\\n93.184.216.34\" as WebServer #BBF7D0 {\n    [Порт 443] as WebPort\n}\n\nrectangle \"Поштовий сервер\\n198.51.100.50\" as MailServer #BBF7D0 {\n    [Порт 993] as MailPort\n}\n\nrectangle \"SSH сервер\\n203.0.113.75\" as SSHServer #BBF7D0 {\n    [Порт 22] as SSHPort\n}\n\nS1 --> Internet : TCP з'єднання 1\nS2 --> Internet : TCP з'єднання 2\nS3 --> Internet : TCP з'єднання 3\nS4 --> Internet : TCP з'єднання 4\n\nInternet --> WebPort : З'єднання 1 та 2\\nдо порту 443\nInternet --> MailPort : З'єднання 3\\nдо порту 993\nInternet --> SSHPort : З'єднання 4\\nдо порту 22\n\nnote bottom of Host\n  Операційна система\n  розрізняє з'єднання\n  за портом джерела\n  та призначення\nend note\n@enduml\n",[3811,7565,7566,7570,7574,7578,7582,7587,7592,7597,7602,7607,7612,7617,7622,7626,7630,7635,7640,7644,7649,7653,7658,7662,7667,7672,7676,7680,7685,7690,7694,7699,7705,7711,7716,7721,7727,7733,7739,7745,7750,7756,7762,7768,7773,7779,7785,7791,7797,7803,7808],{"__ignoreMap":4033},[5679,7567,7568],{"class":5681,"line":5682},[5679,7569,5685],{},[5679,7571,7572],{"class":5681,"line":5688},[5679,7573,5691],{},[5679,7575,7576],{"class":5681,"line":5694},[5679,7577,5697],{},[5679,7579,7580],{"class":5681,"line":5700},[5679,7581,5704],{"emptyLinePlaceholder":5703},[5679,7583,7584],{"class":5681,"line":5707},[5679,7585,7586],{},"rectangle \"Комп'ютер 192.168.1.100\" as Host #E2E8F0 {\n",[5679,7588,7589],{"class":5681,"line":5713},[5679,7590,7591],{},"    rectangle \"Веббраузер\\nПроцес PID 1234\" as Browser #FEF3C7 {\n",[5679,7593,7594],{"class":5681,"line":5719},[5679,7595,7596],{},"        [Сокет 1\\n192.168.1.100:54321] as S1\n",[5679,7598,7599],{"class":5681,"line":5725},[5679,7600,7601],{},"        [Сокет 2\\n192.168.1.100:54322] as S2\n",[5679,7603,7604],{"class":5681,"line":5730},[5679,7605,7606],{},"    }\n",[5679,7608,7609],{"class":5681,"line":5736},[5679,7610,7611],{},"    \n",[5679,7613,7614],{"class":5681,"line":5742},[5679,7615,7616],{},"    rectangle \"Email клієнт\\nПроцес PID 5678\" as Email #DBEAFE {\n",[5679,7618,7619],{"class":5681,"line":5748},[5679,7620,7621],{},"        [Сокет 3\\n192.168.1.100:54323] as S3\n",[5679,7623,7624],{"class":5681,"line":5754},[5679,7625,7606],{},[5679,7627,7628],{"class":5681,"line":5760},[5679,7629,7611],{},[5679,7631,7632],{"class":5681,"line":5766},[5679,7633,7634],{},"    rectangle \"SSH клієнт\\nПроцес PID 9012\" as SSH #DCFCE7 {\n",[5679,7636,7637],{"class":5681,"line":5772},[5679,7638,7639],{},"        [Сокет 4\\n192.168.1.100:54324] as S4\n",[5679,7641,7642],{"class":5681,"line":5777},[5679,7643,7606],{},[5679,7645,7646],{"class":5681,"line":5783},[5679,7647,7648],{},"}\n",[5679,7650,7651],{"class":5681,"line":5788},[5679,7652,5704],{"emptyLinePlaceholder":5703},[5679,7654,7655],{"class":5681,"line":5794},[5679,7656,7657],{},"cloud \"Інтернет\" as Internet #FDE68A\n",[5679,7659,7660],{"class":5681,"line":5799},[5679,7661,5704],{"emptyLinePlaceholder":5703},[5679,7663,7664],{"class":5681,"line":5804},[5679,7665,7666],{},"rectangle \"Вебсервер\\n93.184.216.34\" as WebServer #BBF7D0 {\n",[5679,7668,7669],{"class":5681,"line":5810},[5679,7670,7671],{},"    [Порт 443] as WebPort\n",[5679,7673,7674],{"class":5681,"line":5816},[5679,7675,7648],{},[5679,7677,7678],{"class":5681,"line":5822},[5679,7679,5704],{"emptyLinePlaceholder":5703},[5679,7681,7682],{"class":5681,"line":5827},[5679,7683,7684],{},"rectangle \"Поштовий сервер\\n198.51.100.50\" as MailServer #BBF7D0 {\n",[5679,7686,7687],{"class":5681,"line":5832},[5679,7688,7689],{},"    [Порт 993] as MailPort\n",[5679,7691,7692],{"class":5681,"line":5838},[5679,7693,7648],{},[5679,7695,7697],{"class":5681,"line":7696},29,[5679,7698,5704],{"emptyLinePlaceholder":5703},[5679,7700,7702],{"class":5681,"line":7701},30,[5679,7703,7704],{},"rectangle \"SSH сервер\\n203.0.113.75\" as SSHServer #BBF7D0 {\n",[5679,7706,7708],{"class":5681,"line":7707},31,[5679,7709,7710],{},"    [Порт 22] as SSHPort\n",[5679,7712,7714],{"class":5681,"line":7713},32,[5679,7715,7648],{},[5679,7717,7719],{"class":5681,"line":7718},33,[5679,7720,5704],{"emptyLinePlaceholder":5703},[5679,7722,7724],{"class":5681,"line":7723},34,[5679,7725,7726],{},"S1 --> Internet : TCP з'єднання 1\n",[5679,7728,7730],{"class":5681,"line":7729},35,[5679,7731,7732],{},"S2 --> Internet : TCP з'єднання 2\n",[5679,7734,7736],{"class":5681,"line":7735},36,[5679,7737,7738],{},"S3 --> Internet : TCP з'єднання 3\n",[5679,7740,7742],{"class":5681,"line":7741},37,[5679,7743,7744],{},"S4 --> Internet : TCP з'єднання 4\n",[5679,7746,7748],{"class":5681,"line":7747},38,[5679,7749,5704],{"emptyLinePlaceholder":5703},[5679,7751,7753],{"class":5681,"line":7752},39,[5679,7754,7755],{},"Internet --> WebPort : З'єднання 1 та 2\\nдо порту 443\n",[5679,7757,7759],{"class":5681,"line":7758},40,[5679,7760,7761],{},"Internet --> MailPort : З'єднання 3\\nдо порту 993\n",[5679,7763,7765],{"class":5681,"line":7764},41,[5679,7766,7767],{},"Internet --> SSHPort : З'єднання 4\\nдо порту 22\n",[5679,7769,7771],{"class":5681,"line":7770},42,[5679,7772,5704],{"emptyLinePlaceholder":5703},[5679,7774,7776],{"class":5681,"line":7775},43,[5679,7777,7778],{},"note bottom of Host\n",[5679,7780,7782],{"class":5681,"line":7781},44,[5679,7783,7784],{},"  Операційна система\n",[5679,7786,7788],{"class":5681,"line":7787},45,[5679,7789,7790],{},"  розрізняє з'єднання\n",[5679,7792,7794],{"class":5681,"line":7793},46,[5679,7795,7796],{},"  за портом джерела\n",[5679,7798,7800],{"class":5681,"line":7799},47,[5679,7801,7802],{},"  та призначення\n",[5679,7804,7806],{"class":5681,"line":7805},48,[5679,7807,5769],{},[5679,7809,7811],{"class":5681,"line":7810},49,[5679,7812,5841],{},[3841,7814,7816],{"id":7815},"сокети-у-програмуванні","Сокети у програмуванні",[3824,7818,7819,7820,3965,7823,7826],{},"У мережевому програмуванні термін «сокет» також позначає ",[3776,7821,7822],{},"програмний інтерфейс",[3828,7824,7825],{},"socket API",") для роботи з мережевими з'єднаннями. Більшість мов програмування надають бібліотеки для роботи з сокетами:",[3746,7828,7829,7843,7850,7862],{},[3749,7830,7831,7834,7835,7838,7839,7842],{},[3776,7832,7833],{},"Node.js\u002FJavaScript:"," модуль ",[3811,7836,7837],{},"net"," (TCP), ",[3811,7840,7841],{},"dgram"," (UDP)",[3749,7844,7845,7834,7848],{},[3776,7846,7847],{},"Python:",[3811,7849,7445],{},[3749,7851,7852,7855,7856,3914,7859],{},[3776,7853,7854],{},"Java:"," пакет ",[3811,7857,7858],{},"java.net.Socket",[3811,7860,7861],{},"java.net.ServerSocket",[3749,7863,7864,7867,7868,3914,7871,3914,7874,3914,7877,3914,7880,3914,7883,7886],{},[3776,7865,7866],{},"C\u002FC++:"," Berkeley Sockets API (",[3811,7869,7870],{},"socket()",[3811,7872,7873],{},"bind()",[3811,7875,7876],{},"listen()",[3811,7878,7879],{},"connect()",[3811,7881,7882],{},"send()",[3811,7884,7885],{},"recv()",")",[3824,7888,7889],{},[3776,7890,7891],{},"Приклад створення серверного сокета у Node.js:",[4025,7893,7897],{"className":7894,"code":7895,"language":7896,"meta":4033,"style":4033},"language-javascript shiki shiki-themes light-plus dark-plus dark-plus","const net = require('net');\n\n\u002F\u002F Створення TCP-сервера, що слухає на порту 8080\nconst server = net.createServer((socket) => {\n  console.log('Клієнт підключився:', socket.remoteAddress, socket.remotePort);\n  \n  socket.on('data', (data) => {\n    console.log('Отримано дані:', data.toString());\n    socket.write('Відповідь сервера\\n');\n  });\n  \n  socket.on('end', () => {\n    console.log('Клієнт відключився');\n  });\n});\n\n\u002F\u002F Прив'язати сокет до IP-адреси 0.0.0.0 (всі інтерфейси) та порту 8080\nserver.listen(8080, '0.0.0.0', () => {\n  console.log('Сервер слухає на порту 8080');\n});\n","javascript",[3811,7898,7899,7923,7927,7933,7964,7999,8004,8031,8057,8081,8086,8090,8110,8125,8129,8134,8138,8143,8168,8183],{"__ignoreMap":4033},[5679,7900,7901,7904,7908,7911,7914,7917,7920],{"class":5681,"line":5682},[5679,7902,7903],{"class":6902},"const",[5679,7905,7907],{"class":7906},"s-QsJ"," net",[5679,7909,4048],{"class":7910},"sHH4Y",[5679,7912,7913],{"class":6894},"require",[5679,7915,7916],{"class":7910},"(",[5679,7918,7919],{"class":6898},"'net'",[5679,7921,7922],{"class":7910},");\n",[5679,7924,7925],{"class":5681,"line":5688},[5679,7926,5704],{"emptyLinePlaceholder":5703},[5679,7928,7929],{"class":5681,"line":5694},[5679,7930,7932],{"class":7931},"spJ8K","\u002F\u002F Створення TCP-сервера, що слухає на порту 8080\n",[5679,7934,7935,7937,7940,7942,7945,7947,7950,7953,7955,7958,7961],{"class":5681,"line":5700},[5679,7936,7903],{"class":6902},[5679,7938,7939],{"class":7906}," server",[5679,7941,4048],{"class":7910},[5679,7943,7837],{"class":7944},"siwwj",[5679,7946,3839],{"class":7910},[5679,7948,7949],{"class":6894},"createServer",[5679,7951,7952],{"class":7910},"((",[5679,7954,7445],{"class":7944},[5679,7956,7957],{"class":7910},") ",[5679,7959,7960],{"class":6902},"=>",[5679,7962,7963],{"class":7910}," {\n",[5679,7965,7966,7969,7971,7974,7976,7979,7981,7983,7985,7988,7990,7992,7994,7997],{"class":5681,"line":5707},[5679,7967,7968],{"class":7944},"  console",[5679,7970,3839],{"class":7910},[5679,7972,7973],{"class":6894},"log",[5679,7975,7916],{"class":7910},[5679,7977,7978],{"class":6898},"'Клієнт підключився:'",[5679,7980,3914],{"class":7910},[5679,7982,7445],{"class":7944},[5679,7984,3839],{"class":7910},[5679,7986,7987],{"class":7944},"remoteAddress",[5679,7989,3914],{"class":7910},[5679,7991,7445],{"class":7944},[5679,7993,3839],{"class":7910},[5679,7995,7996],{"class":7944},"remotePort",[5679,7998,7922],{"class":7910},[5679,8000,8001],{"class":5681,"line":5713},[5679,8002,8003],{"class":7910},"  \n",[5679,8005,8006,8009,8011,8014,8016,8019,8022,8025,8027,8029],{"class":5681,"line":5719},[5679,8007,8008],{"class":7944},"  socket",[5679,8010,3839],{"class":7910},[5679,8012,8013],{"class":6894},"on",[5679,8015,7916],{"class":7910},[5679,8017,8018],{"class":6898},"'data'",[5679,8020,8021],{"class":7910},", (",[5679,8023,8024],{"class":7944},"data",[5679,8026,7957],{"class":7910},[5679,8028,7960],{"class":6902},[5679,8030,7963],{"class":7910},[5679,8032,8033,8036,8038,8040,8042,8045,8047,8049,8051,8054],{"class":5681,"line":5725},[5679,8034,8035],{"class":7944},"    console",[5679,8037,3839],{"class":7910},[5679,8039,7973],{"class":6894},[5679,8041,7916],{"class":7910},[5679,8043,8044],{"class":6898},"'Отримано дані:'",[5679,8046,3914],{"class":7910},[5679,8048,8024],{"class":7944},[5679,8050,3839],{"class":7910},[5679,8052,8053],{"class":6894},"toString",[5679,8055,8056],{"class":7910},"());\n",[5679,8058,8059,8062,8064,8067,8069,8072,8076,8079],{"class":5681,"line":5730},[5679,8060,8061],{"class":7944},"    socket",[5679,8063,3839],{"class":7910},[5679,8065,8066],{"class":6894},"write",[5679,8068,7916],{"class":7910},[5679,8070,8071],{"class":6898},"'Відповідь сервера",[5679,8073,8075],{"class":8074},"sjcCO","\\n",[5679,8077,8078],{"class":6898},"'",[5679,8080,7922],{"class":7910},[5679,8082,8083],{"class":5681,"line":5736},[5679,8084,8085],{"class":7910},"  });\n",[5679,8087,8088],{"class":5681,"line":5742},[5679,8089,8003],{"class":7910},[5679,8091,8092,8094,8096,8098,8100,8103,8106,8108],{"class":5681,"line":5748},[5679,8093,8008],{"class":7944},[5679,8095,3839],{"class":7910},[5679,8097,8013],{"class":6894},[5679,8099,7916],{"class":7910},[5679,8101,8102],{"class":6898},"'end'",[5679,8104,8105],{"class":7910},", () ",[5679,8107,7960],{"class":6902},[5679,8109,7963],{"class":7910},[5679,8111,8112,8114,8116,8118,8120,8123],{"class":5681,"line":5754},[5679,8113,8035],{"class":7944},[5679,8115,3839],{"class":7910},[5679,8117,7973],{"class":6894},[5679,8119,7916],{"class":7910},[5679,8121,8122],{"class":6898},"'Клієнт відключився'",[5679,8124,7922],{"class":7910},[5679,8126,8127],{"class":5681,"line":5760},[5679,8128,8085],{"class":7910},[5679,8130,8131],{"class":5681,"line":5766},[5679,8132,8133],{"class":7910},"});\n",[5679,8135,8136],{"class":5681,"line":5772},[5679,8137,5704],{"emptyLinePlaceholder":5703},[5679,8139,8140],{"class":5681,"line":5777},[5679,8141,8142],{"class":7931},"\u002F\u002F Прив'язати сокет до IP-адреси 0.0.0.0 (всі інтерфейси) та порту 8080\n",[5679,8144,8145,8148,8150,8153,8155,8157,8159,8162,8164,8166],{"class":5681,"line":5783},[5679,8146,8147],{"class":7944},"server",[5679,8149,3839],{"class":7910},[5679,8151,8152],{"class":6894},"listen",[5679,8154,7916],{"class":7910},[5679,8156,7278],{"class":6921},[5679,8158,3914],{"class":7910},[5679,8160,8161],{"class":6898},"'0.0.0.0'",[5679,8163,8105],{"class":7910},[5679,8165,7960],{"class":6902},[5679,8167,7963],{"class":7910},[5679,8169,8170,8172,8174,8176,8178,8181],{"class":5681,"line":5788},[5679,8171,7968],{"class":7944},[5679,8173,3839],{"class":7910},[5679,8175,7973],{"class":6894},[5679,8177,7916],{"class":7910},[5679,8179,8180],{"class":6898},"'Сервер слухає на порту 8080'",[5679,8182,7922],{"class":7910},[5679,8184,8185],{"class":5681,"line":5794},[5679,8186,8133],{"class":7910},[3824,8188,8189],{},"У цьому прикладі:",[3746,8191,8192,8202,8209],{},[3749,8193,8194,8197,8198,8201],{},[3811,8195,8196],{},"server.listen(8080, '0.0.0.0')"," створює ",[3776,8199,8200],{},"слухаючий сокет"," (listening socket), прив'язаний до порту 8080 на всіх мережевих інтерфейсах.",[3749,8203,8204,8205,8208],{},"Коли клієнт підключається, створюється новий ",[3776,8206,8207],{},"прийнятий сокет"," (accepted socket) для комунікації з цим конкретним клієнтом.",[3749,8210,8211,5088,8214,8217],{},[3811,8212,8213],{},"socket.remoteAddress",[3811,8215,8216],{},"socket.remotePort"," вказують на IP-адресу та порт клієнта.",[4632,8219,8220,8230,8252],{},[3824,8221,8222],{},[3776,8223,8224,8225,8227,8228,4119],{},"Прив'язка до ",[3811,8226,4114],{}," проти ",[3811,8229,4177],{},[3746,8231,8232,8242],{},[3749,8233,8234,8238,8239,8241],{},[3776,8235,8236],{},[3811,8237,4114],{}," (або ",[3811,8240,6005],{}," для IPv6) означає «всі мережеві інтерфейси»: сервер прийматиме з'єднання з будь-якої IP-адреси комп'ютера (localhost, локальна мережа, Інтернет).",[3749,8243,8244,8238,8248,8251],{},[3776,8245,8246],{},[3811,8247,4177],{},[3811,8249,8250],{},"::1"," для IPv6) означає «лише локальний інтерфейс»: сервер прийматиме з'єднання тільки з того самого комп'ютера, що корисно для розробки та тестування без ризику зовнішнього доступу.",[3824,8253,8254,8255,8257,8258,8260],{},"Під час розробки безпечніше використовувати ",[3811,8256,4177],{},", а у продакшені — налаштовувати конкретний інтерфейс або ",[3811,8259,4114],{}," із відповідним фаєрволом.",[3816,8262],{},[3819,8264,8266],{"id":8265},"icmp-протокол-діагностики-та-повідомлень-про-помилки","ICMP: протокол діагностики та повідомлень про помилки",[3841,8268,8270],{"id":8269},"що-таке-icmp","Що таке ICMP",[3824,8272,8273,3965,8275,8278],{},[3776,8274,6553],{},[3828,8276,8277],{},"Internet Control Message Protocol",") — це допоміжний протокол мережевого рівня, що працює поруч з IP та призначений для:",[3983,8280,8281,8287,8299],{},[3749,8282,8283,8286],{},[3776,8284,8285],{},"Повідомлень про помилки:"," коли пакет не може бути доставлений, ICMP інформує відправника про причину.",[3749,8288,8289,8292,8293,5088,8296,8298],{},[3776,8290,8291],{},"Діагностики мережі:"," утиліти ",[3811,8294,8295],{},"ping",[3811,8297,6477],{}," використовують ICMP для перевірки доступності та визначення маршруту.",[3749,8300,8301,8304],{},[3776,8302,8303],{},"Інформаційних повідомлень:"," редирект маршрутів, запити про час тощо.",[3824,8306,8307,8310,8311,8314],{},[3776,8308,8309],{},"Важливо:"," ICMP є частиною IP-рівня (хоча технічно інкапсулюється у IP-пакети з Protocol=1). Він ",[3776,8312,8313],{},"не є протоколом транспортного рівня"," — у нього немає портів, немає концепції з'єднання.",[3841,8316,8318],{"id":8317},"структура-icmp-повідомлення","Структура ICMP-повідомлення",[3824,8320,8321],{},"ICMP-повідомлення інкапсулюється у IP-пакет як корисне навантаження (Protocol=1):",[4025,8323,8326],{"className":8324,"code":8325,"language":4030},[4028],"┌─────────────────────────────────┐\n│      IP Header (Protocol=1)     │\n├─────────────────────────────────┤\n│ Type (8 біт) │ Code (8 біт)     │ ← ICMP Header\n├──────────────┴──────────────────┤\n│      Checksum (16 біт)          │\n├─────────────────────────────────┤\n│   Rest of Header (32 біти)      │ ← залежить від Type\u002FCode\n├─────────────────────────────────┤\n│          Data\u002FPayload           │\n└─────────────────────────────────┘\n",[3811,8327,8325],{"__ignoreMap":4033},[3746,8329,8330,8336,8342],{},[3749,8331,8332,8335],{},[3776,8333,8334],{},"Type:"," тип повідомлення (Echo Request, Time Exceeded, тощо)",[3749,8337,8338,8341],{},[3776,8339,8340],{},"Code:"," підтип для деталізації (наприклад, різні причини Destination Unreachable)",[3749,8343,8344,8347],{},[3776,8345,8346],{},"Checksum:"," контрольна сума для перевірки цілісності ICMP-повідомлення",[3841,8349,8351],{"id":8350},"основні-типи-icmp-повідомлень","Основні типи ICMP-повідомлень",[4418,8353,8355],{"id":8354},"_1-echo-request-type-8-та-echo-reply-type-0-ping","1. Echo Request (Type 8) та Echo Reply (Type 0) — ping",[3824,8357,8358,8360],{},[3776,8359,5591],{}," перевірка доступності хоста та вимірювання часу відгуку (RTT — Round-Trip Time).",[3824,8362,8363],{},[3776,8364,8365],{},"Як працює ping:",[4025,8367,8370],{"className":8368,"code":8369,"language":4030},[4028],"1. Ваш комп'ютер надсилає ICMP Echo Request (Type 8)\n   ├─ Містить ідентифікатор та послідовний номер\n   └─ Містить довільні дані (зазвичай алфавіт або timestamp)\n\n2. Цільовий хост отримує запит і відповідає ICMP Echo Reply (Type 0)\n   └─ Копіює ідентифікатор, номер та дані з запиту\n\n3. Ваш комп'ютер отримує відповідь і обчислює RTT\n   └─ RTT = час відправки - час отримання\n\n![Обмін повідомленнями ICMP Echo Request та Echo Reply при роботі утиліти ping](\u002Fimages\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fip-addressing-ports-sockets\u002F06.jpg){.diagram-img}\n",[3811,8371,8369],{"__ignoreMap":4033},[3824,8373,8374],{},[3776,8375,8376],{},"Приклад виводу ping:",[4025,8378,8380],{"className":6885,"code":8379,"language":6887,"meta":4033,"style":4033},"$ ping -c 4 example.com\nPING example.com (93.184.216.34): 56 data bytes\n64 bytes from 93.184.216.34: icmp_seq=0 ttl=56 time=15.2 ms\n64 bytes from 93.184.216.34: icmp_seq=1 ttl=56 time=14.8 ms\n64 bytes from 93.184.216.34: icmp_seq=2 ttl=56 time=15.1 ms\n64 bytes from 93.184.216.34: icmp_seq=3 ttl=56 time=15.0 ms\n\n--- example.com ping statistics ---\n4 packets transmitted, 4 packets received, 0.0% packet loss\nround-trip min\u002Favg\u002Fmax\u002Fstddev = 14.8\u002F15.0\u002F15.2\u002F0.2 ms\n",[3811,8381,8382,8398,8409,8442,8467,8492,8517,8521,8536,8562],{"__ignoreMap":4033},[5679,8383,8384,8387,8390,8392,8395],{"class":5681,"line":5682},[5679,8385,8386],{"class":6894},"$",[5679,8388,8389],{"class":6898}," ping",[5679,8391,6918],{"class":6902},[5679,8393,8394],{"class":6921}," 4",[5679,8396,8397],{"class":6898}," example.com\n",[5679,8399,8400,8403,8406],{"class":5681,"line":5688},[5679,8401,8402],{"class":6894},"PING",[5679,8404,8405],{"class":6898}," example.com",[5679,8407,8408],{"class":7910}," (93.184.216.34): 56 data bytes\n",[5679,8410,8411,8413,8416,8419,8422,8425,8427,8430,8433,8436,8439],{"class":5681,"line":5694},[5679,8412,4073],{"class":6894},[5679,8414,8415],{"class":6898}," bytes",[5679,8417,8418],{"class":6898}," from",[5679,8420,8421],{"class":6898}," 93.184.216.34:",[5679,8423,8424],{"class":6898}," icmp_seq=",[5679,8426,4287],{"class":6921},[5679,8428,8429],{"class":6898}," ttl=",[5679,8431,8432],{"class":6921},"56",[5679,8434,8435],{"class":6898}," time=",[5679,8437,8438],{"class":6921},"15.2",[5679,8440,8441],{"class":6898}," ms\n",[5679,8443,8444,8446,8448,8450,8452,8454,8456,8458,8460,8462,8465],{"class":5681,"line":5700},[5679,8445,4073],{"class":6894},[5679,8447,8415],{"class":6898},[5679,8449,8418],{"class":6898},[5679,8451,8421],{"class":6898},[5679,8453,8424],{"class":6898},[5679,8455,4011],{"class":6921},[5679,8457,8429],{"class":6898},[5679,8459,8432],{"class":6921},[5679,8461,8435],{"class":6898},[5679,8463,8464],{"class":6921},"14.8",[5679,8466,8441],{"class":6898},[5679,8468,8469,8471,8473,8475,8477,8479,8481,8483,8485,8487,8490],{"class":5681,"line":5707},[5679,8470,4073],{"class":6894},[5679,8472,8415],{"class":6898},[5679,8474,8418],{"class":6898},[5679,8476,8421],{"class":6898},[5679,8478,8424],{"class":6898},[5679,8480,5029],{"class":6921},[5679,8482,8429],{"class":6898},[5679,8484,8432],{"class":6921},[5679,8486,8435],{"class":6898},[5679,8488,8489],{"class":6921},"15.1",[5679,8491,8441],{"class":6898},[5679,8493,8494,8496,8498,8500,8502,8504,8506,8508,8510,8512,8515],{"class":5681,"line":5713},[5679,8495,4073],{"class":6894},[5679,8497,8415],{"class":6898},[5679,8499,8418],{"class":6898},[5679,8501,8421],{"class":6898},[5679,8503,8424],{"class":6898},[5679,8505,5010],{"class":6921},[5679,8507,8429],{"class":6898},[5679,8509,8432],{"class":6921},[5679,8511,8435],{"class":6898},[5679,8513,8514],{"class":6921},"15.0",[5679,8516,8441],{"class":6898},[5679,8518,8519],{"class":5681,"line":5719},[5679,8520,5704],{"emptyLinePlaceholder":5703},[5679,8522,8523,8526,8528,8530,8533],{"class":5681,"line":5725},[5679,8524,8525],{"class":6894},"---",[5679,8527,8405],{"class":6898},[5679,8529,8389],{"class":6898},[5679,8531,8532],{"class":6898}," statistics",[5679,8534,8535],{"class":6902}," ---\n",[5679,8537,8538,8540,8543,8546,8548,8550,8553,8556,8559],{"class":5681,"line":5730},[5679,8539,4989],{"class":6894},[5679,8541,8542],{"class":6898}," packets",[5679,8544,8545],{"class":6898}," transmitted,",[5679,8547,8394],{"class":6921},[5679,8549,8542],{"class":6898},[5679,8551,8552],{"class":6898}," received,",[5679,8554,8555],{"class":6898}," 0.0%",[5679,8557,8558],{"class":6898}," packet",[5679,8560,8561],{"class":6898}," loss\n",[5679,8563,8564,8567,8570,8573,8576],{"class":5681,"line":5736},[5679,8565,8566],{"class":6894},"round-trip",[5679,8568,8569],{"class":6898}," min\u002Favg\u002Fmax\u002Fstddev",[5679,8571,8572],{"class":6898}," =",[5679,8574,8575],{"class":6898}," 14.8\u002F15.0\u002F15.2\u002F0.2",[5679,8577,8441],{"class":6898},[3824,8579,8580],{},[3776,8581,8582],{},"Що означають параметри:",[3746,8584,8585,8591,8597,8603],{},[3749,8586,8587,8590],{},[3811,8588,8589],{},"64 bytes"," — розмір відповіді (56 байт даних + 8 байт ICMP-заголовок)",[3749,8592,8593,8596],{},[3811,8594,8595],{},"icmp_seq"," — послідовний номер (для виявлення втрачених пакетів)",[3749,8598,8599,8602],{},[3811,8600,8601],{},"ttl=56"," — TTL у відповіді (початковий TTL мінус кількість hop)",[3749,8604,8605,8608],{},[3811,8606,8607],{},"time=15.2 ms"," — RTT (час туди-назад)",[4418,8610,8612],{"id":8611},"_2-destination-unreachable-type-3-пакет-не-може-бути-доставлений","2. Destination Unreachable (Type 3) — пакет не може бути доставлений",[3824,8614,8615],{},"Маршрутизатор або хост відправляє це повідомлення, коли не може доставити пакет.",[3824,8617,8618],{},[3776,8619,8620],{},"Основні коди:",[4243,8622,8623,8635],{},[4246,8624,8625],{},[4249,8626,8627,8630,8632],{},[4252,8628,8629],{"align":4254},"Code",[4252,8631,6537],{"align":4261},[4252,8633,8634],{"align":4261},"Причина",[4273,8636,8637,8649,8661,8673,8685,8697,8710],{},[4249,8638,8639,8643,8646],{},[4278,8640,8641],{"align":4254},[3776,8642,4287],{},[4278,8644,8645],{"align":4261},"Network Unreachable",[4278,8647,8648],{"align":4261},"Маршрут до мережі призначення невідомий",[4249,8650,8651,8655,8658],{},[4278,8652,8653],{"align":4254},[3776,8654,4011],{},[4278,8656,8657],{"align":4261},"Host Unreachable",[4278,8659,8660],{"align":4261},"Хост у мережі недоступний (немає ARP-відповіді)",[4249,8662,8663,8667,8670],{},[4278,8664,8665],{"align":4254},[3776,8666,5029],{},[4278,8668,8669],{"align":4261},"Protocol Unreachable",[4278,8671,8672],{"align":4261},"Протокол не підтримується (наприклад, хост не підтримує IPv6)",[4249,8674,8675,8679,8682],{},[4278,8676,8677],{"align":4254},[3776,8678,5010],{},[4278,8680,8681],{"align":4261},"Port Unreachable",[4278,8683,8684],{"align":4261},"Порт закритий або процес не слухає (UDP)",[4249,8686,8687,8691,8694],{},[4278,8688,8689],{"align":4254},[3776,8690,4989],{},[4278,8692,8693],{"align":4261},"Fragmentation Needed, DF set",[4278,8695,8696],{"align":4261},"Пакет занадто великий, але встановлений флаг DF",[4249,8698,8699,8704,8707],{},[4278,8700,8701],{"align":4254},[3776,8702,8703],{},"9",[4278,8705,8706],{"align":4261},"Network Prohibited",[4278,8708,8709],{"align":4261},"Адміністративно заборонено (firewall)",[4249,8711,8712,8716,8719],{},[4278,8713,8714],{"align":4254},[3776,8715,4316],{},[4278,8717,8718],{"align":4261},"Host Prohibited",[4278,8720,8709],{"align":4261},[3824,8722,8723,8725],{},[3776,8724,3974],{}," спроба підключення до закритого UDP-порту:",[4025,8727,8729],{"className":6885,"code":8728,"language":6887,"meta":4033,"style":4033},"$ nc -u 8.8.8.8 9999\n(надсилаємо дані)\n→ Сервер відповідає: ICMP Type 3, Code 3 (Port Unreachable)\n",[3811,8730,8731,8747,8759],{"__ignoreMap":4033},[5679,8732,8733,8735,8738,8741,8744],{"class":5681,"line":5682},[5679,8734,8386],{"class":6894},[5679,8736,8737],{"class":6898}," nc",[5679,8739,8740],{"class":6902}," -u",[5679,8742,8743],{"class":6921}," 8.8.8.8",[5679,8745,8746],{"class":6921}," 9999\n",[5679,8748,8749,8751,8754,8757],{"class":5681,"line":5688},[5679,8750,7916],{"class":7910},[5679,8752,8753],{"class":6894},"надсилаємо",[5679,8755,8756],{"class":6898}," дані",[5679,8758,6036],{"class":7910},[5679,8760,8761,8764,8767,8770,8773,8776,8779,8782,8785,8788,8791],{"class":5681,"line":5694},[5679,8762,8763],{"class":6894},"→",[5679,8765,8766],{"class":6898}," Сервер",[5679,8768,8769],{"class":6898}," відповідає:",[5679,8771,8772],{"class":6898}," ICMP",[5679,8774,8775],{"class":6898}," Type",[5679,8777,8778],{"class":6898}," 3,",[5679,8780,8781],{"class":6898}," Code",[5679,8783,8784],{"class":6921}," 3",[5679,8786,8787],{"class":7910}," (Port ",[5679,8789,8790],{"class":6898},"Unreachable",[5679,8792,6036],{"class":7910},[4418,8794,8796],{"id":8795},"_3-time-exceeded-type-11-ttl-вичерпано","3. Time Exceeded (Type 11) — TTL вичерпано",[3824,8798,8799,8802],{},[3776,8800,8801],{},"Code 0:"," TTL досяг 0 під час транзиту через маршрутизатор.",[3824,8804,8805],{},"Коли маршрутизатор отримує пакет з TTL=1, він:",[3983,8807,8808,8811,8814],{},[3749,8809,8810],{},"Зменшує TTL на 1 → TTL=0",[3749,8812,8813],{},"Відкидає пакет",[3749,8815,8816],{},"Надсилає ICMP Time Exceeded відправнику",[3824,8818,8819],{},[3776,8820,8821],{},"Використання у traceroute:",[3824,8823,8824,8826],{},[3811,8825,6477],{}," використовує TTL для визначення маршруту пакета:",[4025,8828,8831],{"className":8829,"code":8830,"language":4030},[4028],"1. Відправляємо пакет з TTL=1\n   → Перший маршрутизатор: TTL=0 → ICMP Time Exceeded\n   → Тепер знаємо IP першого маршрутизатора\n\n2. Відправляємо пакет з TTL=2\n   → Другий маршрутизатор: TTL=0 → ICMP Time Exceeded\n   → Тепер знаємо IP другого маршрутизатора\n\n3. Продовжуємо збільшувати TTL, поки не досягнемо призначення\n",[3811,8832,8830],{"__ignoreMap":4033},[3824,8834,8835],{},[3776,8836,8837],{},"Приклад виводу traceroute:",[4025,8839,8841],{"className":6885,"code":8840,"language":6887,"meta":4033,"style":4033},"$ traceroute google.com\ntraceroute to google.com (142.250.185.78), 64 hops max\n 1  192.168.1.1          1.234 ms   (домашній роутер)\n 2  10.0.0.1             5.678 ms   (ISP gateway)\n 3  93.158.172.1        10.234 ms   (ISP router)\n 4  195.34.52.100       15.567 ms   (регіональний backbone)\n 5  142.250.74.46       20.123 ms   (Google edge router)\n 6  142.250.185.78      22.456 ms   (Google server)\n",[3811,8842,8843,8853,8866,8888,8909,8928,8948,8972],{"__ignoreMap":4033},[5679,8844,8845,8847,8850],{"class":5681,"line":5682},[5679,8846,8386],{"class":6894},[5679,8848,8849],{"class":6898}," traceroute",[5679,8851,8852],{"class":6898}," google.com\n",[5679,8854,8855,8857,8860,8863],{"class":5681,"line":5688},[5679,8856,6477],{"class":6894},[5679,8858,8859],{"class":6898}," to",[5679,8861,8862],{"class":6898}," google.com",[5679,8864,8865],{"class":7910}," (142.250.185.78), 64 hops max\n",[5679,8867,8868,8871,8874,8877,8880,8883,8886],{"class":5681,"line":5694},[5679,8869,8870],{"class":6894}," 1",[5679,8872,8873],{"class":6921},"  192.168.1.1",[5679,8875,8876],{"class":6921},"          1.234",[5679,8878,8879],{"class":6898}," ms",[5679,8881,8882],{"class":7910},"   (домашній ",[5679,8884,8885],{"class":6898},"роутер",[5679,8887,6036],{"class":7910},[5679,8889,8890,8893,8896,8899,8901,8904,8907],{"class":5681,"line":5700},[5679,8891,8892],{"class":6894}," 2",[5679,8894,8895],{"class":6921},"  10.0.0.1",[5679,8897,8898],{"class":6921},"             5.678",[5679,8900,8879],{"class":6898},[5679,8902,8903],{"class":7910},"   (ISP ",[5679,8905,8906],{"class":6898},"gateway",[5679,8908,6036],{"class":7910},[5679,8910,8911,8913,8916,8919,8921,8923,8926],{"class":5681,"line":5707},[5679,8912,8784],{"class":6894},[5679,8914,8915],{"class":6921},"  93.158.172.1",[5679,8917,8918],{"class":6921},"        10.234",[5679,8920,8879],{"class":6898},[5679,8922,8903],{"class":7910},[5679,8924,8925],{"class":6898},"router",[5679,8927,6036],{"class":7910},[5679,8929,8930,8932,8935,8938,8940,8943,8946],{"class":5681,"line":5713},[5679,8931,8394],{"class":6894},[5679,8933,8934],{"class":6921},"  195.34.52.100",[5679,8936,8937],{"class":6921},"       15.567",[5679,8939,8879],{"class":6898},[5679,8941,8942],{"class":7910},"   (регіональний ",[5679,8944,8945],{"class":6898},"backbone",[5679,8947,6036],{"class":7910},[5679,8949,8950,8953,8956,8959,8961,8964,8967,8970],{"class":5681,"line":5719},[5679,8951,8952],{"class":6894}," 5",[5679,8954,8955],{"class":6921},"  142.250.74.46",[5679,8957,8958],{"class":6921},"       20.123",[5679,8960,8879],{"class":6898},[5679,8962,8963],{"class":7910},"   (Google ",[5679,8965,8966],{"class":6898},"edge",[5679,8968,8969],{"class":6898}," router",[5679,8971,6036],{"class":7910},[5679,8973,8974,8977,8980,8983,8985,8987,8989],{"class":5681,"line":5725},[5679,8975,8976],{"class":6894}," 6",[5679,8978,8979],{"class":6921},"  142.250.185.78",[5679,8981,8982],{"class":6921},"      22.456",[5679,8984,8879],{"class":6898},[5679,8986,8963],{"class":7910},[5679,8988,8147],{"class":6898},[5679,8990,6036],{"class":7910},[3881,8992,8993,9004],{},[3824,8994,8995],{},[3776,8996,8997,8998,9000,9001,4119],{},"Різниця між Linux ",[3811,8999,6477],{}," та Windows ",[3811,9002,9003],{},"tracert",[3746,9005,9006,9012,9018],{},[3749,9007,9008,9011],{},[3776,9009,9010],{},"Linux traceroute"," використовує UDP-пакети до високих портів (33434+)",[3749,9013,9014,9017],{},[3776,9015,9016],{},"Windows tracert"," використовує ICMP Echo Request",[3749,9019,9020,9023],{},[3776,9021,9022],{},"Обидва"," використовують поступове збільшення TTL для визначення маршруту",[4418,9025,9027],{"id":9026},"_4-redirect-type-5-зміна-маршруту","4. Redirect (Type 5) — зміна маршруту",[3824,9029,9030],{},"Маршрутизатор інформує хост, що існує кращий маршрут до призначення.",[3824,9032,9033],{},[3776,9034,3974],{},[4025,9036,9039],{"className":9037,"code":9038,"language":4030},[4028],"Хост відправляє пакет до 8.8.8.8 через Gateway A (192.168.1.1)\nGateway A знає, що Gateway B (192.168.1.2) ближче до 8.8.8.8\nGateway A:\n  1. Пересилає пакет до Gateway B\n  2. Надсилає ICMP Redirect хосту: \"Використовуй 192.168.1.2 для 8.8.8.8\"\nХост оновлює свою routing table\n",[3811,9040,9038],{"__ignoreMap":4033},[4632,9042,9043,9046],{},[3776,9044,9045],{},"Безпека ICMP Redirect:","\nICMP Redirect може бути використаний для атак (перенаправлення трафіку через зловмисний маршрутизатор). Багато систем ігнорують ICMP Redirect або обмежують їх прийняття лише від маршрутизаторів у локальній мережі.",[3841,9048,9050],{"id":9049},"icmp-у-діагностиці-практичні-команди","ICMP у діагностиці: практичні команди",[4418,9052,9054],{"id":9053},"ping-перевірка-доступності","ping — перевірка доступності",[4025,9056,9058],{"className":6885,"code":9057,"language":6887,"meta":4033,"style":4033},"# Базовий ping\nping google.com\n\n# Обмежити кількість пакетів\nping -c 4 google.com\n\n# Встановити розмір пакету (для тестування MTU)\nping -s 1472 google.com  # 1472 + 8 (ICMP) + 20 (IP) = 1500 (MTU)\n\n# Встановити інтервал між пакетами\nping -i 0.2 google.com  # 200 мс між пакетами\n\n# Flood ping (потребує root, для тестування продуктивності)\nsudo ping -f google.com\n",[3811,9059,9060,9065,9071,9075,9080,9090,9094,9099,9114,9118,9123,9137,9141,9146],{"__ignoreMap":4033},[5679,9061,9062],{"class":5681,"line":5682},[5679,9063,9064],{"class":7931},"# Базовий ping\n",[5679,9066,9067,9069],{"class":5681,"line":5688},[5679,9068,8295],{"class":6894},[5679,9070,8852],{"class":6898},[5679,9072,9073],{"class":5681,"line":5694},[5679,9074,5704],{"emptyLinePlaceholder":5703},[5679,9076,9077],{"class":5681,"line":5700},[5679,9078,9079],{"class":7931},"# Обмежити кількість пакетів\n",[5679,9081,9082,9084,9086,9088],{"class":5681,"line":5707},[5679,9083,8295],{"class":6894},[5679,9085,6918],{"class":6902},[5679,9087,8394],{"class":6921},[5679,9089,8852],{"class":6898},[5679,9091,9092],{"class":5681,"line":5713},[5679,9093,5704],{"emptyLinePlaceholder":5703},[5679,9095,9096],{"class":5681,"line":5719},[5679,9097,9098],{"class":7931},"# Встановити розмір пакету (для тестування MTU)\n",[5679,9100,9101,9103,9106,9109,9111],{"class":5681,"line":5725},[5679,9102,8295],{"class":6894},[5679,9104,9105],{"class":6902}," -s",[5679,9107,9108],{"class":6921}," 1472",[5679,9110,8862],{"class":6898},[5679,9112,9113],{"class":7931},"  # 1472 + 8 (ICMP) + 20 (IP) = 1500 (MTU)\n",[5679,9115,9116],{"class":5681,"line":5730},[5679,9117,5704],{"emptyLinePlaceholder":5703},[5679,9119,9120],{"class":5681,"line":5736},[5679,9121,9122],{"class":7931},"# Встановити інтервал між пакетами\n",[5679,9124,9125,9127,9129,9132,9134],{"class":5681,"line":5742},[5679,9126,8295],{"class":6894},[5679,9128,6903],{"class":6902},[5679,9130,9131],{"class":6921}," 0.2",[5679,9133,8862],{"class":6898},[5679,9135,9136],{"class":7931},"  # 200 мс між пакетами\n",[5679,9138,9139],{"class":5681,"line":5748},[5679,9140,5704],{"emptyLinePlaceholder":5703},[5679,9142,9143],{"class":5681,"line":5754},[5679,9144,9145],{"class":7931},"# Flood ping (потребує root, для тестування продуктивності)\n",[5679,9147,9148,9150,9152,9155],{"class":5681,"line":5760},[5679,9149,6895],{"class":6894},[5679,9151,8389],{"class":6898},[5679,9153,9154],{"class":6902}," -f",[5679,9156,8852],{"class":6898},[4418,9158,9160],{"id":9159},"traceroute-tracert-визначення-маршруту","traceroute \u002F tracert — визначення маршруту",[4025,9162,9164],{"className":6885,"code":9163,"language":6887,"meta":4033,"style":4033},"# Linux\u002FmacOS\ntraceroute google.com\n\n# Windows\ntracert google.com\n\n# Використовувати ICMP замість UDP (Linux)\ntraceroute -I google.com\n\n# Встановити максимальну кількість hop\ntraceroute -m 15 google.com\n",[3811,9165,9166,9171,9177,9181,9186,9192,9196,9201,9210,9214,9219],{"__ignoreMap":4033},[5679,9167,9168],{"class":5681,"line":5682},[5679,9169,9170],{"class":7931},"# Linux\u002FmacOS\n",[5679,9172,9173,9175],{"class":5681,"line":5688},[5679,9174,6477],{"class":6894},[5679,9176,8852],{"class":6898},[5679,9178,9179],{"class":5681,"line":5694},[5679,9180,5704],{"emptyLinePlaceholder":5703},[5679,9182,9183],{"class":5681,"line":5700},[5679,9184,9185],{"class":7931},"# Windows\n",[5679,9187,9188,9190],{"class":5681,"line":5707},[5679,9189,9003],{"class":6894},[5679,9191,8852],{"class":6898},[5679,9193,9194],{"class":5681,"line":5713},[5679,9195,5704],{"emptyLinePlaceholder":5703},[5679,9197,9198],{"class":5681,"line":5719},[5679,9199,9200],{"class":7931},"# Використовувати ICMP замість UDP (Linux)\n",[5679,9202,9203,9205,9208],{"class":5681,"line":5725},[5679,9204,6477],{"class":6894},[5679,9206,9207],{"class":6902}," -I",[5679,9209,8852],{"class":6898},[5679,9211,9212],{"class":5681,"line":5730},[5679,9213,5704],{"emptyLinePlaceholder":5703},[5679,9215,9216],{"class":5681,"line":5736},[5679,9217,9218],{"class":7931},"# Встановити максимальну кількість hop\n",[5679,9220,9221,9223,9226,9229],{"class":5681,"line":5742},[5679,9222,6477],{"class":6894},[5679,9224,9225],{"class":6902}," -m",[5679,9227,9228],{"class":6921}," 15",[5679,9230,8852],{"class":6898},[4418,9232,9234],{"id":9233},"mtr-комбінація-ping-traceroute-у-реальному-часі","mtr — комбінація ping + traceroute у реальному часі",[4025,9236,9238],{"className":6885,"code":9237,"language":6887,"meta":4033,"style":4033},"# Linux\u002FmacOS (потребує встановлення: apt install mtr \u002F brew install mtr)\nmtr google.com\n",[3811,9239,9240,9245],{"__ignoreMap":4033},[5679,9241,9242],{"class":5681,"line":5682},[5679,9243,9244],{"class":7931},"# Linux\u002FmacOS (потребує встановлення: apt install mtr \u002F brew install mtr)\n",[5679,9246,9247,9250],{"class":5681,"line":5688},[5679,9248,9249],{"class":6894},"mtr",[5679,9251,8852],{"class":6898},[3824,9253,9254,9257],{},[3776,9255,9256],{},"Вивід mtr"," показує:",[3746,9259,9260,9263,9266],{},[3749,9261,9262],{},"Всі hop на маршруті",[3749,9264,9265],{},"Статистику втрат пакетів для кожного hop",[3749,9267,9268],{},"Середній\u002Fмінімальний\u002Fмаксимальний RTT",[3841,9270,9272],{"id":9271},"безпека-icmp-загрози-та-захист","Безпека ICMP: загрози та захист",[4418,9274,9276],{"id":9275},"атаки-з-використанням-icmp","Атаки з використанням ICMP:",[3824,9278,9279],{},[3776,9280,9281],{},"1. ICMP Flood (Ping Flood):",[3746,9283,9284,9287,9290],{},[3749,9285,9286],{},"Атакуючий надсилає величезну кількість ICMP Echo Request",[3749,9288,9289],{},"Ціль перевантажується обробкою запитів та відправкою відповідей",[3749,9291,9292,9295],{},[3776,9293,9294],{},"Захист:"," rate limiting ICMP, фільтрування на фаєрволі",[3824,9297,9298],{},[3776,9299,9300],{},"2. Ping of Death:",[3746,9302,9303,9306,9309],{},[3749,9304,9305],{},"Надсилання ICMP-пакетів більших за максимальний розмір (>65,535 байт через фрагментацію)",[3749,9307,9308],{},"Старі системи могли зависати або падати",[3749,9310,9311,9313],{},[3776,9312,9294],{}," сучасні ОС захищені, але патчі критичні",[3824,9315,9316],{},[3776,9317,9318],{},"3. Smurf Attack:",[3746,9320,9321,9324,9327],{},[3749,9322,9323],{},"Атакуючий надсилає ICMP Echo Request на broadcast-адресу з підробленою адресою джерела (жертви)",[3749,9325,9326],{},"Всі хости в мережі відповідають жертві → DDoS",[3749,9328,9329,9331],{},[3776,9330,9294],{}," заборона ICMP на broadcast, ingress filtering",[4418,9333,9335],{"id":9334},"рекомендації-щодо-icmp-на-фаєрволі","Рекомендації щодо ICMP на фаєрволі:",[3824,9337,9338,9341],{},[3776,9339,9340],{},"НЕ блокуйте весь ICMP!"," Це ускладнює діагностику та порушує роботу деяких протоколів (Path MTU Discovery).",[3824,9343,9344],{},[3776,9345,9346],{},"Рекомендовано дозволити:",[3746,9348,9349,9352,9355,9358],{},[3749,9350,9351],{},"Type 0 (Echo Reply) — відповіді на ping",[3749,9353,9354],{},"Type 3 (Destination Unreachable) — критично для PMTUD",[3749,9356,9357],{},"Type 8 (Echo Request) — ping (з rate limiting)",[3749,9359,9360],{},"Type 11 (Time Exceeded) — traceroute",[3824,9362,9363],{},[3776,9364,9365],{},"Рекомендовано заблокувати:",[3746,9367,9368,9371],{},[3749,9369,9370],{},"Type 5 (Redirect) — для безпеки",[3749,9372,9373],{},"Type 9, 10 (Router Advertisement\u002FSolicitation) — тільки в межах локальної мережі",[3816,9375],{},[3819,9377,9379],{"id":9378},"arp-звязок-між-ip-та-mac-адресами","ARP: зв'язок між IP та MAC-адресами",[3841,9381,9383],{"id":9382},"навіщо-потрібен-arp","Навіщо потрібен ARP",[3824,9385,9386,9387,9390,9391,9394],{},"Ми з'ясували, що IP-адреси є ",[3776,9388,9389],{},"логічними"," ідентифікаторами (мережевий рівень, Layer 3), а MAC-адреси — ",[3776,9392,9393],{},"фізичними"," (канальний рівень, Layer 2). Проте фактична передача даних у локальній мережі (Ethernet, Wi-Fi) відбувається за MAC-адресами.",[3824,9396,9397,9400],{},[3776,9398,9399],{},"Проблема:"," Як перевести IP-адресу у MAC-адресу?",[3824,9402,9403,3975,9406,3965,9409,3814],{},[3776,9404,9405],{},"Рішення:",[3776,9407,9408],{},"ARP",[3828,9410,9411],{},"Address Resolution Protocol",[3841,9413,9415],{"id":9414},"як-працює-arp-покроковий-приклад","Як працює ARP: покроковий приклад",[3824,9417,9418,9421,9422,9425],{},[3776,9419,9420],{},"Сценарій:"," Комп'ютер A (192.168.1.10, MAC: ",[3811,9423,9424],{},"aa:bb:cc:dd:ee:ff",") хоче надіслати дані до комп'ютера B (192.168.1.20, MAC невідома).",[4025,9427,9430],{"className":9428,"code":9429,"language":4030},[4028],"Крок 1: A перевіряє свою ARP cache (таблицю IP→MAC)\n  $ arp -a\n  → Немає запису для 192.168.1.20\n\nКрок 2: A надсилає ARP Request (broadcast у локальній мережі)\n  Ethernet Frame:\n    Destination MAC: ff:ff:ff:ff:ff:ff (broadcast)\n    Source MAC: aa:bb:cc:dd:ee:ff (MAC адреса A)\n  ARP Packet:\n    Sender IP: 192.168.1.10\n    Sender MAC: aa:bb:cc:dd:ee:ff\n    Target IP: 192.168.1.20\n    Target MAC: 00:00:00:00:00:00 (невідома, заповнюємо нулями)\n  Запитання: \"Хто має 192.168.1.20? Скажіть мені на 192.168.1.10!\"\n\nКрок 3: Всі пристрої в локальній мережі отримують ARP Request\n  - Комп'ютер C (192.168.1.30): \"Це не моя IP\" → ігнорує\n  - Комп'ютер B (192.168.1.20): \"Це моя IP!\" → готує відповідь\n\nКрок 4: B надсилає ARP Reply (unicast до A)\n  Ethernet Frame:\n    Destination MAC: aa:bb:cc:dd:ee:ff (MAC адреса A)\n    Source MAC: 11:22:33:44:55:66 (MAC адреса B)\n  ARP Packet:\n    Sender IP: 192.168.1.20\n    Sender MAC: 11:22:33:44:55:66\n    Target IP: 192.168.1.10\n    Target MAC: aa:bb:cc:dd:ee:ff\n  Відповідь: \"Я 192.168.1.20, моя MAC: 11:22:33:44:55:66\"\n\nКрок 5: A отримує ARP Reply та оновлює свою ARP cache\n  192.168.1.20 → 11:22:33:44:55:66 (динамічний запис, timeout ~2-20 хв)\n\nКрок 6: A може тепер надсилати IP-пакети до B\n  Інкапсулює IP-пакет у Ethernet frame з Destination MAC=11:22:33:44:55:66\n\n![Покроковий процес визначення фізичної MAC-адреси за допомогою протоколу ARP](\u002Fimages\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fip-addressing-ports-sockets\u002F07.png){.diagram-img}\n",[3811,9431,9429],{"__ignoreMap":4033},[5668,9433,9435],{"alt":9434},"Процес ARP Request\u002FReply",[4025,9436,9438],{"className":5673,"code":9437,"language":5675,"meta":4033,"style":4033},"@startuml\nskinparam style plain\nskinparam backgroundColor #FFFFFF\n\nparticipant \"Комп'ютер A\\n192.168.1.10\\nMAC: aa:bb:cc:dd:ee:ff\" as A #DBEAFE\nparticipant \"Комутатор\\n(Layer 2)\" as Switch #E2E8F0\nparticipant \"Комп'ютер B\\n192.168.1.20\\nMAC: 11:22:33:44:55:66\" as B #DCFCE7\nparticipant \"Інші хости\\n(192.168.1.x)\" as Others #FEF3C7\n\nA -> Switch : ARP Request (broadcast)\\n\"Хто має 192.168.1.20?\"\nnote right of A\n  Destination MAC: ff:ff:ff:ff:ff:ff\n  Target IP: 192.168.1.20\n  Target MAC: 00:00:00:00:00:00\nend note\n\nSwitch -> B : ARP Request\\n(forward broadcast)\nSwitch -> Others : ARP Request\\n(forward broadcast)\n\nOthers -> Others : \"Не моя IP\" → ігнорує\n\nB -> Switch : ARP Reply (unicast)\\n\"Я 192.168.1.20,\\nMAC: 11:22:33:44:55:66\"\nnote left of B\n  Destination MAC: aa:bb:cc:dd:ee:ff\n  Sender IP: 192.168.1.20\n  Sender MAC: 11:22:33:44:55:66\nend note\n\nSwitch -> A : ARP Reply\\n(forward to A)\n\nA -> A : Оновлює ARP cache:\\n192.168.1.20 → 11:22:33:44:55:66\n@enduml\n",[3811,9439,9440,9444,9448,9452,9456,9461,9466,9471,9476,9480,9485,9490,9495,9500,9505,9509,9513,9518,9523,9527,9532,9536,9541,9546,9551,9556,9561,9565,9569,9574,9578,9583],{"__ignoreMap":4033},[5679,9441,9442],{"class":5681,"line":5682},[5679,9443,5685],{},[5679,9445,9446],{"class":5681,"line":5688},[5679,9447,5691],{},[5679,9449,9450],{"class":5681,"line":5694},[5679,9451,5697],{},[5679,9453,9454],{"class":5681,"line":5700},[5679,9455,5704],{"emptyLinePlaceholder":5703},[5679,9457,9458],{"class":5681,"line":5707},[5679,9459,9460],{},"participant \"Комп'ютер A\\n192.168.1.10\\nMAC: aa:bb:cc:dd:ee:ff\" as A #DBEAFE\n",[5679,9462,9463],{"class":5681,"line":5713},[5679,9464,9465],{},"participant \"Комутатор\\n(Layer 2)\" as Switch #E2E8F0\n",[5679,9467,9468],{"class":5681,"line":5719},[5679,9469,9470],{},"participant \"Комп'ютер B\\n192.168.1.20\\nMAC: 11:22:33:44:55:66\" as B #DCFCE7\n",[5679,9472,9473],{"class":5681,"line":5725},[5679,9474,9475],{},"participant \"Інші хости\\n(192.168.1.x)\" as Others #FEF3C7\n",[5679,9477,9478],{"class":5681,"line":5730},[5679,9479,5704],{"emptyLinePlaceholder":5703},[5679,9481,9482],{"class":5681,"line":5736},[5679,9483,9484],{},"A -> Switch : ARP Request (broadcast)\\n\"Хто має 192.168.1.20?\"\n",[5679,9486,9487],{"class":5681,"line":5742},[5679,9488,9489],{},"note right of A\n",[5679,9491,9492],{"class":5681,"line":5748},[5679,9493,9494],{},"  Destination MAC: ff:ff:ff:ff:ff:ff\n",[5679,9496,9497],{"class":5681,"line":5754},[5679,9498,9499],{},"  Target IP: 192.168.1.20\n",[5679,9501,9502],{"class":5681,"line":5760},[5679,9503,9504],{},"  Target MAC: 00:00:00:00:00:00\n",[5679,9506,9507],{"class":5681,"line":5766},[5679,9508,5769],{},[5679,9510,9511],{"class":5681,"line":5772},[5679,9512,5704],{"emptyLinePlaceholder":5703},[5679,9514,9515],{"class":5681,"line":5777},[5679,9516,9517],{},"Switch -> B : ARP Request\\n(forward broadcast)\n",[5679,9519,9520],{"class":5681,"line":5783},[5679,9521,9522],{},"Switch -> Others : ARP Request\\n(forward broadcast)\n",[5679,9524,9525],{"class":5681,"line":5788},[5679,9526,5704],{"emptyLinePlaceholder":5703},[5679,9528,9529],{"class":5681,"line":5794},[5679,9530,9531],{},"Others -> Others : \"Не моя IP\" → ігнорує\n",[5679,9533,9534],{"class":5681,"line":5799},[5679,9535,5704],{"emptyLinePlaceholder":5703},[5679,9537,9538],{"class":5681,"line":5804},[5679,9539,9540],{},"B -> Switch : ARP Reply (unicast)\\n\"Я 192.168.1.20,\\nMAC: 11:22:33:44:55:66\"\n",[5679,9542,9543],{"class":5681,"line":5810},[5679,9544,9545],{},"note left of B\n",[5679,9547,9548],{"class":5681,"line":5816},[5679,9549,9550],{},"  Destination MAC: aa:bb:cc:dd:ee:ff\n",[5679,9552,9553],{"class":5681,"line":5822},[5679,9554,9555],{},"  Sender IP: 192.168.1.20\n",[5679,9557,9558],{"class":5681,"line":5827},[5679,9559,9560],{},"  Sender MAC: 11:22:33:44:55:66\n",[5679,9562,9563],{"class":5681,"line":5832},[5679,9564,5769],{},[5679,9566,9567],{"class":5681,"line":5838},[5679,9568,5704],{"emptyLinePlaceholder":5703},[5679,9570,9571],{"class":5681,"line":7696},[5679,9572,9573],{},"Switch -> A : ARP Reply\\n(forward to A)\n",[5679,9575,9576],{"class":5681,"line":7701},[5679,9577,5704],{"emptyLinePlaceholder":5703},[5679,9579,9580],{"class":5681,"line":7707},[5679,9581,9582],{},"A -> A : Оновлює ARP cache:\\n192.168.1.20 → 11:22:33:44:55:66\n",[5679,9584,9585],{"class":5681,"line":7713},[5679,9586,5841],{},[3841,9588,9590],{"id":9589},"arp-cache-зберігання-відповідностей-ipmac","ARP Cache: зберігання відповідностей IP↔MAC",[3824,9592,9593,9594,9597],{},"Кожен хост зберігає ",[3776,9595,9596],{},"ARP cache"," (таблицю IP→MAC) для уникнення повторних ARP-запитів.",[3824,9599,9600],{},[3776,9601,9602],{},"Перегляд ARP cache:",[4025,9604,9606],{"className":6885,"code":9605,"language":6887,"meta":4033,"style":4033},"# Linux\u002FmacOS\u002FWindows\narp -a\n\n# Приклад виводу (Linux):\n? (192.168.1.1) at 00:11:22:33:44:55 [ether] on eth0\n? (192.168.1.20) at aa:bb:cc:dd:ee:ff [ether] on eth0\n? (192.168.1.255) at ff:ff:ff:ff:ff:ff [ether] on eth0\n",[3811,9607,9608,9613,9621,9625,9630,9640,9650],{"__ignoreMap":4033},[5679,9609,9610],{"class":5681,"line":5682},[5679,9611,9612],{"class":7931},"# Linux\u002FmacOS\u002FWindows\n",[5679,9614,9615,9618],{"class":5681,"line":5688},[5679,9616,9617],{"class":6894},"arp",[5679,9619,9620],{"class":6902}," -a\n",[5679,9622,9623],{"class":5681,"line":5694},[5679,9624,5704],{"emptyLinePlaceholder":5703},[5679,9626,9627],{"class":5681,"line":5700},[5679,9628,9629],{"class":7931},"# Приклад виводу (Linux):\n",[5679,9631,9632,9635,9637],{"class":5681,"line":5707},[5679,9633,9634],{"class":7910},"? (",[5679,9636,3913],{"class":6894},[5679,9638,9639],{"class":7910},") at 00:11:22:33:44:55 [ether] on eth0\n",[5679,9641,9642,9644,9647],{"class":5681,"line":5713},[5679,9643,9634],{"class":7910},[5679,9645,9646],{"class":6894},"192.168.1.20",[5679,9648,9649],{"class":7910},") at aa:bb:cc:dd:ee:ff [ether] on eth0\n",[5679,9651,9652,9654,9656],{"class":5681,"line":5719},[5679,9653,9634],{"class":7910},[5679,9655,4630],{"class":6894},[5679,9657,9658],{"class":7910},") at ff:ff:ff:ff:ff:ff [ether] on eth0\n",[3824,9660,9661],{},[3776,9662,9663],{},"Типи записів:",[3746,9665,9666,9672],{},[3749,9667,9668,9671],{},[3776,9669,9670],{},"dynamic:"," створені автоматично через ARP, видаляються після timeout (зазвичай 2-20 хвилин)",[3749,9673,9674,9677],{},[3776,9675,9676],{},"static:"," створені адміністратором вручну, не видаляються",[3824,9679,9680],{},[3776,9681,9682],{},"Додавання статичного ARP-запису:",[4025,9684,9686],{"className":6885,"code":9685,"language":6887,"meta":4033,"style":4033},"# Linux\nsudo arp -s 192.168.1.100 aa:bb:cc:dd:ee:ff\n\n# Windows\narp -s 192.168.1.100 aa-bb-cc-dd-ee-ff\n\n# macOS\nsudo arp -s 192.168.1.100 aa:bb:cc:dd:ee:ff\n",[3811,9687,9688,9693,9708,9712,9716,9727,9731,9736],{"__ignoreMap":4033},[5679,9689,9690],{"class":5681,"line":5682},[5679,9691,9692],{"class":7931},"# Linux\n",[5679,9694,9695,9697,9700,9702,9705],{"class":5681,"line":5688},[5679,9696,6895],{"class":6894},[5679,9698,9699],{"class":6898}," arp",[5679,9701,9105],{"class":6902},[5679,9703,9704],{"class":6921}," 192.168.1.100",[5679,9706,9707],{"class":6898}," aa:bb:cc:dd:ee:ff\n",[5679,9709,9710],{"class":5681,"line":5694},[5679,9711,5704],{"emptyLinePlaceholder":5703},[5679,9713,9714],{"class":5681,"line":5700},[5679,9715,9185],{"class":7931},[5679,9717,9718,9720,9722,9724],{"class":5681,"line":5707},[5679,9719,9617],{"class":6894},[5679,9721,9105],{"class":6902},[5679,9723,9704],{"class":6921},[5679,9725,9726],{"class":6898}," aa-bb-cc-dd-ee-ff\n",[5679,9728,9729],{"class":5681,"line":5713},[5679,9730,5704],{"emptyLinePlaceholder":5703},[5679,9732,9733],{"class":5681,"line":5719},[5679,9734,9735],{"class":7931},"# macOS\n",[5679,9737,9738,9740,9742,9744,9746],{"class":5681,"line":5725},[5679,9739,6895],{"class":6894},[5679,9741,9699],{"class":6898},[5679,9743,9105],{"class":6902},[5679,9745,9704],{"class":6921},[5679,9747,9707],{"class":6898},[3824,9749,9750],{},[3776,9751,9752],{},"Очищення ARP cache:",[4025,9754,9756],{"className":6885,"code":9755,"language":6887,"meta":4033,"style":4033},"# Linux (видалити один запис)\nsudo arp -d 192.168.1.20\n\n# Linux (очистити всю таблицю)\nsudo ip -s -s neigh flush all\n\n# Windows\narp -d *\n\n# macOS\nsudo arp -d -a\n",[3811,9757,9758,9763,9775,9779,9784,9804,9808,9812,9821,9825,9829],{"__ignoreMap":4033},[5679,9759,9760],{"class":5681,"line":5682},[5679,9761,9762],{"class":7931},"# Linux (видалити один запис)\n",[5679,9764,9765,9767,9769,9772],{"class":5681,"line":5688},[5679,9766,6895],{"class":6894},[5679,9768,9699],{"class":6898},[5679,9770,9771],{"class":6902}," -d",[5679,9773,9774],{"class":6921}," 192.168.1.20\n",[5679,9776,9777],{"class":5681,"line":5694},[5679,9778,5704],{"emptyLinePlaceholder":5703},[5679,9780,9781],{"class":5681,"line":5700},[5679,9782,9783],{"class":7931},"# Linux (очистити всю таблицю)\n",[5679,9785,9786,9788,9791,9793,9795,9798,9801],{"class":5681,"line":5707},[5679,9787,6895],{"class":6894},[5679,9789,9790],{"class":6898}," ip",[5679,9792,9105],{"class":6902},[5679,9794,9105],{"class":6902},[5679,9796,9797],{"class":6898}," neigh",[5679,9799,9800],{"class":6898}," flush",[5679,9802,9803],{"class":6898}," all\n",[5679,9805,9806],{"class":5681,"line":5713},[5679,9807,5704],{"emptyLinePlaceholder":5703},[5679,9809,9810],{"class":5681,"line":5719},[5679,9811,9185],{"class":7931},[5679,9813,9814,9816,9818],{"class":5681,"line":5725},[5679,9815,9617],{"class":6894},[5679,9817,9771],{"class":6902},[5679,9819,9820],{"class":6902}," *\n",[5679,9822,9823],{"class":5681,"line":5730},[5679,9824,5704],{"emptyLinePlaceholder":5703},[5679,9826,9827],{"class":5681,"line":5736},[5679,9828,9735],{"class":7931},[5679,9830,9831,9833,9835,9837],{"class":5681,"line":5742},[5679,9832,6895],{"class":6894},[5679,9834,9699],{"class":6898},[5679,9836,9771],{"class":6902},[5679,9838,9620],{"class":6902},[3841,9840,9842],{"id":9841},"gratuitous-arp-я-тут","Gratuitous ARP: \"Я тут!\"",[3824,9844,9845,9848,9849,9852],{},[3776,9846,9847],{},"Gratuitous ARP"," — це ARP Request або Reply, де ",[3776,9850,9851],{},"Sender IP = Target IP"," (хост запитує свою власну IP-адресу).",[3824,9854,9855],{},[3776,9856,9857],{},"Навіщо це потрібно:",[3983,9859,9860,9866,9872],{},[3749,9861,9862,9865],{},[3776,9863,9864],{},"Оновлення ARP cache інших хостів:"," коли пристрій змінює MAC-адресу (наприклад, після заміни мережевої карти), він надсилає Gratuitous ARP, щоб інші хости оновили свої таблиці.",[3749,9867,9868,9871],{},[3776,9869,9870],{},"Виявлення конфліктів IP:"," при отриманні IP (DHCP або статично), хост надсилає Gratuitous ARP. Якщо інший хост відповідає — конфлікт IP!",[3749,9873,9874,9877],{},[3776,9875,9876],{},"Повідомлення про з'явлення в мережі:"," після підключення до мережі (failover, VM migration).",[3824,9879,9880],{},[3776,9881,3974],{},[4025,9883,9886],{"className":9884,"code":9885,"language":4030},[4028],"Комп'ютер з IP 192.168.1.50 підключається до мережі\n→ Надсилає ARP Request: \"Хто має 192.168.1.50? Скажіть 192.168.1.50!\"\n→ Якщо хтось відповідає → конфлікт IP (помилка конфігурації)\n→ Якщо ніхто не відповідає → всі хости оновлюють свої ARP cache\n",[3811,9887,9885],{"__ignoreMap":4033},[3841,9889,9891],{"id":9890},"proxy-arp-роутер-як-проксі","Proxy ARP: роутер як проксі",[3824,9893,9894,9897],{},[3776,9895,9896],{},"Proxy ARP"," — це коли маршрутизатор відповідає на ARP Request замість іншого хоста.",[3824,9899,9900,9903],{},[3776,9901,9902],{},"Використання:"," об'єднання фізично роз'єднаних мереж без зміни конфігурації хостів.",[3824,9905,9906],{},[3776,9907,3974],{},[4025,9909,9912],{"className":9910,"code":9911,"language":4030},[4028],"Мережа A: 192.168.1.0\u002F24 (через інтерфейс eth0)\nМережа B: 192.168.2.0\u002F24 (через інтерфейс eth1)\nРоутер з'єднує обидві мережі\n\nХост A (192.168.1.10) надсилає ARP Request: \"Хто має 192.168.2.50?\"\n→ Роутер відповідає: \"Я маю 192.168.2.50, моя MAC: [MAC eth0]\"\n→ Хост A надсилає пакети роутеру, роутер пересилає до мережі B\n",[3811,9913,9911],{"__ignoreMap":4033},[3841,9915,9917],{"id":9916},"arp-у-ipv6-ndp-замість-arp","ARP у IPv6: NDP замість ARP",[3824,9919,9920,9923,9924,3965,9927,9930],{},[3776,9921,9922],{},"IPv6 НЕ використовує ARP!"," Натомість використовується ",[3776,9925,9926],{},"NDP",[3828,9928,9929],{},"Neighbor Discovery Protocol","), що працює через ICMPv6.",[3824,9932,9933],{},[3776,9934,9935],{},"Відмінності NDP від ARP:",[4243,9937,9938,9951],{},[4246,9939,9940],{},[4249,9941,9942,9945,9948],{},[4252,9943,9944],{"align":4261},"Характеристика",[4252,9946,9947],{"align":4261},"ARP (IPv4)",[4252,9949,9950],{"align":4261},"NDP (IPv6)",[4273,9952,9953,9965,9978,9991],{},[4249,9954,9955,9959,9962],{},[4278,9956,9957],{"align":4261},[3776,9958,6540],{},[4278,9960,9961],{"align":4261},"Окремий протокол (Ethertype 0x0806)",[4278,9963,9964],{"align":4261},"Частина ICMPv6",[4249,9966,9967,9972,9975],{},[4278,9968,9969],{"align":4261},[3776,9970,9971],{},"Request",[4278,9973,9974],{"align":4261},"ARP Request (broadcast)",[4278,9976,9977],{"align":4261},"Neighbor Solicitation (multicast)",[4249,9979,9980,9985,9988],{},[4278,9981,9982],{"align":4261},[3776,9983,9984],{},"Reply",[4278,9986,9987],{"align":4261},"ARP Reply (unicast)",[4278,9989,9990],{"align":4261},"Neighbor Advertisement (unicast)",[4249,9992,9993,9998,10001],{},[4278,9994,9995],{"align":4261},[3776,9996,9997],{},"Multicast замість broadcast",[4278,9999,10000],{"align":4261},"Використовує broadcast (ff:ff:ff:ff:ff:ff)",[4278,10002,10003],{"align":4261},"Використовує solicited-node multicast (ефективніше)",[3824,10005,10006],{},[3776,10007,10008],{},"Приклад NDP:",[4025,10010,10013],{"className":10011,"code":10012,"language":4030},[4028],"Хост A хоче знайти MAC для IPv6 адреси 2001:db8::1\n\n1. A надсилає ICMPv6 Neighbor Solicitation (Type 135) на multicast адресу:\n   ff02::1:ff00:1 (solicited-node multicast для 2001:db8::1)\n\n2. Хост з адресою 2001:db8::1 відповідає Neighbor Advertisement (Type 136)\n\n3. A оновлює Neighbor Cache (еквівалент ARP cache)\n",[3811,10014,10012],{"__ignoreMap":4033},[3824,10016,10017],{},[3776,10018,10019],{},"Команди для роботи з NDP:",[4025,10021,10023],{"className":6885,"code":10022,"language":6887,"meta":4033,"style":4033},"# Linux: перегляд Neighbor Cache (IPv6 ARP)\nip -6 neigh show\n\n# Приклад виводу:\nfe80::1 dev eth0 lladdr 00:11:22:33:44:55 REACHABLE\n2001:db8::1 dev eth0 lladdr aa:bb:cc:dd:ee:ff STALE\n",[3811,10024,10025,10030,10043,10047,10052,10072],{"__ignoreMap":4033},[5679,10026,10027],{"class":5681,"line":5682},[5679,10028,10029],{"class":7931},"# Linux: перегляд Neighbor Cache (IPv6 ARP)\n",[5679,10031,10032,10035,10038,10040],{"class":5681,"line":5688},[5679,10033,10034],{"class":6894},"ip",[5679,10036,10037],{"class":6902}," -6",[5679,10039,9797],{"class":6898},[5679,10041,10042],{"class":6898}," show\n",[5679,10044,10045],{"class":5681,"line":5694},[5679,10046,5704],{"emptyLinePlaceholder":5703},[5679,10048,10049],{"class":5681,"line":5700},[5679,10050,10051],{"class":7931},"# Приклад виводу:\n",[5679,10053,10054,10057,10060,10063,10066,10069],{"class":5681,"line":5707},[5679,10055,10056],{"class":6894},"fe80::1",[5679,10058,10059],{"class":6898}," dev",[5679,10061,10062],{"class":6898}," eth0",[5679,10064,10065],{"class":6898}," lladdr",[5679,10067,10068],{"class":6898}," 00:11:22:33:44:55",[5679,10070,10071],{"class":6898}," REACHABLE\n",[5679,10073,10074,10076,10078,10080,10082,10085],{"class":5681,"line":5713},[5679,10075,6031],{"class":6894},[5679,10077,10059],{"class":6898},[5679,10079,10062],{"class":6898},[5679,10081,10065],{"class":6898},[5679,10083,10084],{"class":6898}," aa:bb:cc:dd:ee:ff",[5679,10086,10087],{"class":6898}," STALE\n",[3841,10089,10091],{"id":10090},"безпека-arp-атаки-та-захист","Безпека ARP: атаки та захист",[4418,10093,10095],{"id":10094},"arp-spoofing-arp-poisoning-атака-людина-посередині","ARP Spoofing (ARP Poisoning) — атака \"людина посередині\"",[3824,10097,10098,10101],{},[3776,10099,10100],{},"Сутність атаки:"," Атакуючий надсилає фальшиві ARP-відповіді, щоб перенаправити трафік через свій комп'ютер.",[3824,10103,10104],{},[3776,10105,10106],{},"Приклад атаки:",[4025,10108,10111],{"className":10109,"code":10110,"language":4030},[4028],"Нормальна мережа:\n  Комп'ютер A (192.168.1.10) → Gateway (192.168.1.1, MAC: 00:11:22:33:44:55)\n  ARP cache на A: 192.168.1.1 → 00:11:22:33:44:55\n\nАтакуючий (192.168.1.50, MAC: 66:77:88:99:aa:bb) надсилає фальшивий ARP Reply:\n  \"Я 192.168.1.1, моя MAC: 66:77:88:99:aa:bb\"\n  \nA оновлює свою ARP cache:\n  192.168.1.1 → 66:77:88:99:aa:bb (фальшива!)\n\nТепер весь трафік A до Інтернету йде через атакуючого:\n  A → Атакуючий → Gateway → Інтернет\n  Атакуючий може:\n    - Читати весь незашифрований трафік (HTTP, FTP, тощо)\n    - Модифікувати дані\n    - Блокувати з'єднання\n",[3811,10112,10110],{"__ignoreMap":4033},[5668,10114,10116],{"alt":10115},"ARP Spoofing атака",[4025,10117,10119],{"className":5673,"code":10118,"language":5675,"meta":4033,"style":4033},"@startuml\nskinparam style plain\nskinparam backgroundColor #FFFFFF\n\nparticipant \"Комп'ютер A\\n192.168.1.10\" as A #DBEAFE\nparticipant \"Атакуючий\\n192.168.1.50\\nMAC: 66:77:88:99:aa:bb\" as Attacker #FCA5A5\nparticipant \"Gateway\\n192.168.1.1\\nMAC: 00:11:22:33:44:55\" as Gateway #DCFCE7\nparticipant \"Інтернет\" as Internet #FEF3C7\n\n== Нормальна комунікація ==\nA -> Gateway : IP пакети\\n(через MAC: 00:11:22:33:44:55)\nGateway -> Internet : Пересилання\n\n== Атака ARP Spoofing ==\nAttacker -> A : Фальшивий ARP Reply\\n\"Я 192.168.1.1,\\nMAC: 66:77:88:99:aa:bb\"\nnote right of A\n  ARP cache оновлено:\n  192.168.1.1 → 66:77:88:99:aa:bb\nend note\n\n== Трафік перехоплено ==\nA -> Attacker : IP пакети\\n(через MAC: 66:77:88:99:aa:bb)\nnote right of Attacker\n  Атакуючий може:\n  - Читати трафік\n  - Модифікувати пакети\n  - Блокувати з'єднання\nend note\nAttacker -> Gateway : Пересилання\\n(опціонально)\nGateway -> Internet : Пересилання\n@enduml\n",[3811,10120,10121,10125,10129,10133,10137,10142,10147,10152,10157,10161,10166,10171,10176,10180,10185,10190,10194,10199,10204,10208,10212,10217,10222,10227,10232,10237,10242,10247,10251,10256,10260],{"__ignoreMap":4033},[5679,10122,10123],{"class":5681,"line":5682},[5679,10124,5685],{},[5679,10126,10127],{"class":5681,"line":5688},[5679,10128,5691],{},[5679,10130,10131],{"class":5681,"line":5694},[5679,10132,5697],{},[5679,10134,10135],{"class":5681,"line":5700},[5679,10136,5704],{"emptyLinePlaceholder":5703},[5679,10138,10139],{"class":5681,"line":5707},[5679,10140,10141],{},"participant \"Комп'ютер A\\n192.168.1.10\" as A #DBEAFE\n",[5679,10143,10144],{"class":5681,"line":5713},[5679,10145,10146],{},"participant \"Атакуючий\\n192.168.1.50\\nMAC: 66:77:88:99:aa:bb\" as Attacker #FCA5A5\n",[5679,10148,10149],{"class":5681,"line":5719},[5679,10150,10151],{},"participant \"Gateway\\n192.168.1.1\\nMAC: 00:11:22:33:44:55\" as Gateway #DCFCE7\n",[5679,10153,10154],{"class":5681,"line":5725},[5679,10155,10156],{},"participant \"Інтернет\" as Internet #FEF3C7\n",[5679,10158,10159],{"class":5681,"line":5730},[5679,10160,5704],{"emptyLinePlaceholder":5703},[5679,10162,10163],{"class":5681,"line":5736},[5679,10164,10165],{},"== Нормальна комунікація ==\n",[5679,10167,10168],{"class":5681,"line":5742},[5679,10169,10170],{},"A -> Gateway : IP пакети\\n(через MAC: 00:11:22:33:44:55)\n",[5679,10172,10173],{"class":5681,"line":5748},[5679,10174,10175],{},"Gateway -> Internet : Пересилання\n",[5679,10177,10178],{"class":5681,"line":5754},[5679,10179,5704],{"emptyLinePlaceholder":5703},[5679,10181,10182],{"class":5681,"line":5760},[5679,10183,10184],{},"== Атака ARP Spoofing ==\n",[5679,10186,10187],{"class":5681,"line":5766},[5679,10188,10189],{},"Attacker -> A : Фальшивий ARP Reply\\n\"Я 192.168.1.1,\\nMAC: 66:77:88:99:aa:bb\"\n",[5679,10191,10192],{"class":5681,"line":5772},[5679,10193,9489],{},[5679,10195,10196],{"class":5681,"line":5777},[5679,10197,10198],{},"  ARP cache оновлено:\n",[5679,10200,10201],{"class":5681,"line":5783},[5679,10202,10203],{},"  192.168.1.1 → 66:77:88:99:aa:bb\n",[5679,10205,10206],{"class":5681,"line":5788},[5679,10207,5769],{},[5679,10209,10210],{"class":5681,"line":5794},[5679,10211,5704],{"emptyLinePlaceholder":5703},[5679,10213,10214],{"class":5681,"line":5799},[5679,10215,10216],{},"== Трафік перехоплено ==\n",[5679,10218,10219],{"class":5681,"line":5804},[5679,10220,10221],{},"A -> Attacker : IP пакети\\n(через MAC: 66:77:88:99:aa:bb)\n",[5679,10223,10224],{"class":5681,"line":5810},[5679,10225,10226],{},"note right of Attacker\n",[5679,10228,10229],{"class":5681,"line":5816},[5679,10230,10231],{},"  Атакуючий може:\n",[5679,10233,10234],{"class":5681,"line":5822},[5679,10235,10236],{},"  - Читати трафік\n",[5679,10238,10239],{"class":5681,"line":5827},[5679,10240,10241],{},"  - Модифікувати пакети\n",[5679,10243,10244],{"class":5681,"line":5832},[5679,10245,10246],{},"  - Блокувати з'єднання\n",[5679,10248,10249],{"class":5681,"line":5838},[5679,10250,5769],{},[5679,10252,10253],{"class":5681,"line":7696},[5679,10254,10255],{},"Attacker -> Gateway : Пересилання\\n(опціонально)\n",[5679,10257,10258],{"class":5681,"line":7701},[5679,10259,10175],{},[5679,10261,10262],{"class":5681,"line":7707},[5679,10263,5841],{},[4418,10265,10267],{"id":10266},"захист-від-arp-spoofing","Захист від ARP Spoofing:",[3824,10269,10270,10273],{},[3776,10271,10272],{},"1. Статичні ARP-записи"," (для критичних хостів):",[4025,10275,10277],{"className":6885,"code":10276,"language":6887,"meta":4033,"style":4033},"# Прив'язати IP gateway до його MAC назавжди\nsudo arp -s 192.168.1.1 00:11:22:33:44:55\n",[3811,10278,10279,10284],{"__ignoreMap":4033},[5679,10280,10281],{"class":5681,"line":5682},[5679,10282,10283],{"class":7931},"# Прив'язати IP gateway до його MAC назавжди\n",[5679,10285,10286,10288,10290,10292,10295],{"class":5681,"line":5688},[5679,10287,6895],{"class":6894},[5679,10289,9699],{"class":6898},[5679,10291,9105],{"class":6902},[5679,10293,10294],{"class":6921}," 192.168.1.1",[5679,10296,10297],{"class":6898}," 00:11:22:33:44:55\n",[3824,10299,10300,10303],{},[3776,10301,10302],{},"Недоліки:"," не масштабується, важко підтримувати.",[3824,10305,10306,10309],{},[3776,10307,10308],{},"2. Dynamic ARP Inspection (DAI)"," на комутаторах:",[3746,10311,10312,10315,10318],{},[3749,10313,10314],{},"Комутатор перевіряє всі ARP-пакети",[3749,10316,10317],{},"Дозволяє тільки легітимні ARP-відповіді (на основі DHCP snooping database)",[3749,10319,10320],{},"Блокує фальшиві ARP-пакети",[3824,10322,10323],{},[3776,10324,10325],{},"3. DHCP Snooping:",[3746,10327,10328,10331],{},[3749,10329,10330],{},"Комутатор відстежує, які IP-адреси видані DHCP",[3749,10332,10333],{},"Перевіряє, що ARP-відповіді відповідають DHCP-записам",[3824,10335,10336],{},[3776,10337,10338],{},"4. Port Security на комутаторах:",[3746,10340,10341,10344],{},[3749,10342,10343],{},"Обмеження кількості MAC-адрес на порт",[3749,10345,10346],{},"Блокування порту при виявленні підозрілої активності",[3824,10348,10349],{},[3776,10350,10351],{},"5. 802.1X аутентифікація:",[3746,10353,10354,10357],{},[3749,10355,10356],{},"Вимагає аутентифікації перед доступом до мережі",[3749,10358,10359],{},"Ускладнює підключення зловмісників",[3824,10361,10362],{},[3776,10363,10364],{},"6. Інструменти моніторингу:",[4025,10366,10368],{"className":6885,"code":10367,"language":6887,"meta":4033,"style":4033},"# arpwatch (Linux) — моніторинг змін у ARP-таблиці\nsudo apt install arpwatch\nsudo arpwatch -i eth0\n\n# XArp (Windows) — детекція ARP Spoofing\n# Wireshark — захоплення та аналіз ARP-трафіку\n",[3811,10369,10370,10375,10388,10400,10404,10409],{"__ignoreMap":4033},[5679,10371,10372],{"class":5681,"line":5682},[5679,10373,10374],{"class":7931},"# arpwatch (Linux) — моніторинг змін у ARP-таблиці\n",[5679,10376,10377,10379,10382,10385],{"class":5681,"line":5688},[5679,10378,6895],{"class":6894},[5679,10380,10381],{"class":6898}," apt",[5679,10383,10384],{"class":6898}," install",[5679,10386,10387],{"class":6898}," arpwatch\n",[5679,10389,10390,10392,10395,10397],{"class":5681,"line":5694},[5679,10391,6895],{"class":6894},[5679,10393,10394],{"class":6898}," arpwatch",[5679,10396,6903],{"class":6902},[5679,10398,10399],{"class":6898}," eth0\n",[5679,10401,10402],{"class":5681,"line":5700},[5679,10403,5704],{"emptyLinePlaceholder":5703},[5679,10405,10406],{"class":5681,"line":5707},[5679,10407,10408],{"class":7931},"# XArp (Windows) — детекція ARP Spoofing\n",[5679,10410,10411],{"class":5681,"line":5713},[5679,10412,10413],{"class":7931},"# Wireshark — захоплення та аналіз ARP-трафіку\n",[4632,10415,10416,10421,10424,10435],{},[3824,10417,10418],{},[3776,10419,10420],{},"HTTPS не повністю захищає від ARP Spoofing!",[3824,10422,10423],{},"Хоча HTTPS шифрує дані, атакуючий може:",[3746,10425,10426,10429,10432],{},[3749,10427,10428],{},"Бачити, до яких сайтів ви підключаєтеся (SNI у TLS handshake)",[3749,10430,10431],{},"Виконувати SSL-stripping атаки (перенаправлення з HTTPS на HTTP)",[3749,10433,10434],{},"Блокувати ваші з'єднання (DoS)",[3824,10436,10437],{},"Найкращий захист — правильна конфігурація мережевого обладнання (DAI, DHCP Snooping) та використання VPN у недовірених мережах.",[3816,10439],{},[3819,10441,10443],{"id":10442},"фрагментація-пакетів-та-mtu","Фрагментація пакетів та MTU",[3841,10445,10447],{"id":10446},"що-таке-mtu","Що таке MTU",[3824,10449,10450,3965,10453,10456,10457,3839],{},[3776,10451,10452],{},"MTU",[3828,10454,10455],{},"Maximum Transmission Unit",") — максимальний розмір кадру (frame), який може передати мережа на канальному рівні, ",[3776,10458,10459],{},"включаючи заголовки",[3824,10461,10462],{},[3776,10463,10464],{},"Типові значення MTU:",[4243,10466,10467,10480],{},[4246,10468,10469],{},[4249,10470,10471,10474,10477],{},[4252,10472,10473],{"align":4261},"Тип мережі",[4252,10475,10476],{"align":4851},"MTU (байт)",[4252,10478,10479],{"align":4261},"Примітка",[4273,10481,10482,10495,10507,10520,10533,10546],{},[4249,10483,10484,10489,10492],{},[4278,10485,10486],{"align":4261},[3776,10487,10488],{},"Ethernet",[4278,10490,10491],{"align":4851},"1500",[4278,10493,10494],{"align":4261},"Стандарт для проводових мереж",[4249,10496,10497,10502,10504],{},[4278,10498,10499],{"align":4261},[3776,10500,10501],{},"Wi-Fi (802.11)",[4278,10503,10491],{"align":4851},[4278,10505,10506],{"align":4261},"Зазвичай таке саме, як Ethernet",[4249,10508,10509,10514,10517],{},[4278,10510,10511],{"align":4261},[3776,10512,10513],{},"PPPoE",[4278,10515,10516],{"align":4851},"1492",[4278,10518,10519],{"align":4261},"1500 - 8 (PPPoE заголовок)",[4249,10521,10522,10527,10530],{},[4278,10523,10524],{"align":4261},[3776,10525,10526],{},"VPN тунелі",[4278,10528,10529],{"align":4851},"1400-1450",[4278,10531,10532],{"align":4261},"Залежить від типу VPN (IPsec, OpenVPN)",[4249,10534,10535,10540,10543],{},[4278,10536,10537],{"align":4261},[3776,10538,10539],{},"Jumbo Frames",[4278,10541,10542],{"align":4851},"9000",[4278,10544,10545],{"align":4261},"Для високошвидкісних мереж (дата-центри)",[4249,10547,10548,10553,10556],{},[4278,10549,10550],{"align":4261},[3776,10551,10552],{},"Loopback",[4278,10554,10555],{"align":4851},"65536",[4278,10557,10558],{"align":4261},"Локальний інтерфейс (без фізичної передачі)",[3824,10560,10561,10563,10564,10567,10568,10571],{},[3776,10562,8309],{}," MTU — це розмір на ",[3776,10565,10566],{},"канальному рівні"," (включає Ethernet заголовок). Максимальний розмір ",[3776,10569,10570],{},"IP-пакета"," = MTU - розмір Ethernet заголовка:",[4025,10573,10576],{"className":10574,"code":10575,"language":4030},[4028],"MTU 1500 байт:\n  - Ethernet заголовок: 14 байт\n  - Ethernet trailer (FCS): 4 байти\n  = Максимальний IP-пакет: 1500 байт (без Ethernet заголовка)\n",[3811,10577,10575],{"__ignoreMap":4033},[3824,10579,10580],{},[3776,10581,10582],{},"Перевірка MTU:",[4025,10584,10586],{"className":6885,"code":10585,"language":6887,"meta":4033,"style":4033},"# Linux\nip link show eth0\n\n# macOS\nifconfig en0\n\n# Windows\nnetsh interface ipv4 show subinterfaces\n\n# Приклад виводу:\n   MTU  MediaSenseState   Bytes In  Bytes Out  Interface\n------  ---------------  ---------  ---------  --------\n1500         1              1234567    7654321  Ethernet\n",[3811,10587,10588,10592,10604,10608,10612,10620,10624,10628,10644,10648,10652,10675,10691],{"__ignoreMap":4033},[5679,10589,10590],{"class":5681,"line":5682},[5679,10591,9692],{"class":7931},[5679,10593,10594,10596,10599,10602],{"class":5681,"line":5688},[5679,10595,10034],{"class":6894},[5679,10597,10598],{"class":6898}," link",[5679,10600,10601],{"class":6898}," show",[5679,10603,10399],{"class":6898},[5679,10605,10606],{"class":5681,"line":5694},[5679,10607,5704],{"emptyLinePlaceholder":5703},[5679,10609,10610],{"class":5681,"line":5700},[5679,10611,9735],{"class":7931},[5679,10613,10614,10617],{"class":5681,"line":5707},[5679,10615,10616],{"class":6894},"ifconfig",[5679,10618,10619],{"class":6898}," en0\n",[5679,10621,10622],{"class":5681,"line":5713},[5679,10623,5704],{"emptyLinePlaceholder":5703},[5679,10625,10626],{"class":5681,"line":5719},[5679,10627,9185],{"class":7931},[5679,10629,10630,10633,10636,10639,10641],{"class":5681,"line":5725},[5679,10631,10632],{"class":6894},"netsh",[5679,10634,10635],{"class":6898}," interface",[5679,10637,10638],{"class":6898}," ipv4",[5679,10640,10601],{"class":6898},[5679,10642,10643],{"class":6898}," subinterfaces\n",[5679,10645,10646],{"class":5681,"line":5730},[5679,10647,5704],{"emptyLinePlaceholder":5703},[5679,10649,10650],{"class":5681,"line":5736},[5679,10651,10051],{"class":7931},[5679,10653,10654,10657,10660,10663,10666,10669,10672],{"class":5681,"line":5742},[5679,10655,10656],{"class":6894},"   MTU",[5679,10658,10659],{"class":6898},"  MediaSenseState",[5679,10661,10662],{"class":6898},"   Bytes",[5679,10664,10665],{"class":6898}," In",[5679,10667,10668],{"class":6898},"  Bytes",[5679,10670,10671],{"class":6898}," Out",[5679,10673,10674],{"class":6898},"  Interface\n",[5679,10676,10677,10680,10683,10686,10688],{"class":5681,"line":5748},[5679,10678,10679],{"class":6894},"------",[5679,10681,10682],{"class":6902},"  ---------------",[5679,10684,10685],{"class":6902},"  ---------",[5679,10687,10685],{"class":6902},[5679,10689,10690],{"class":6902},"  --------\n",[5679,10692,10693,10695,10698,10701,10704],{"class":5681,"line":5754},[5679,10694,10491],{"class":6894},[5679,10696,10697],{"class":6921},"         1",[5679,10699,10700],{"class":6921},"              1234567",[5679,10702,10703],{"class":6921},"    7654321",[5679,10705,10706],{"class":6898},"  Ethernet\n",[3841,10708,10710],{"id":10709},"що-таке-фрагментація","Що таке фрагментація",[3824,10712,10713,10716],{},[3776,10714,10715],{},"Фрагментація"," — це процес розбиття великого IP-пакета на менші частини (фрагменти), щоб вони відповідали MTU мережі.",[3824,10718,10719],{},[3776,10720,10721],{},"Коли виникає потреба:",[4025,10723,10726],{"className":10724,"code":10725,"language":4030},[4028],"Додаток генерує 3000 байт даних\n  ↓ TCP додає 20 байт заголовка\n2980 байт TCP-сегмент\n  ↓ IP додає 20 байт заголовка\n3000 байт IP-пакет\n\nМережа має MTU 1500 байт\n→ Пакет 3000 байт НЕ поміститься!\n→ Потрібна фрагментація\n\n![Процес фрагментації IP-пакета на менші частини відповідно до обмеження MTU](\u002Fimages\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fip-addressing-ports-sockets\u002F08.png){.diagram-img}\n",[3811,10727,10725],{"__ignoreMap":4033},[3841,10729,10731],{"id":10730},"процес-фрагментації-детальний-приклад","Процес фрагментації: детальний приклад",[3824,10733,10734],{},[3776,10735,10736],{},"Оригінальний пакет:",[3746,10738,10739,10742,10745],{},[3749,10740,10741],{},"Розмір: 3000 байт (20 байт IP-заголовок + 2980 байт даних)",[3749,10743,10744],{},"MTU: 1500 байт",[3749,10746,10747],{},"Флаг DF=0 (фрагментація дозволена)",[3824,10749,10750],{},[3776,10751,10752],{},"Фрагмент 1:",[4025,10754,10757],{"className":10755,"code":10756,"language":4030},[4028],"├─ IP Header (20 байт)\n│    Identification: 12345\n│    Flags: MF=1 (More Fragments)\n│    Fragment Offset: 0 (початок)\n│    Total Length: 1500\n└─ Data: 1480 байт (1500 - 20)\n",[3811,10758,10756],{"__ignoreMap":4033},[3824,10760,10761],{},[3776,10762,10763],{},"Фрагмент 2:",[4025,10765,10768],{"className":10766,"code":10767,"language":4030},[4028],"├─ IP Header (20 байт)\n│    Identification: 12345 (той самий!)\n│    Flags: MF=0 (останній фрагмент)\n│    Fragment Offset: 185 (1480 ÷ 8 = 185 блоків)\n│    Total Length: 1520 (20 + 1500)\n└─ Data: 1500 байт (залишок)\n",[3811,10769,10767],{"__ignoreMap":4033},[3824,10771,10772],{},[3776,10773,10774],{},"Пояснення Fragment Offset:",[3746,10776,10777,10783,10786,10789],{},[3749,10778,10779,10780,10782],{},"Вимірюється у ",[3776,10781,6394],{}," (не в байтах!)",[3749,10784,10785],{},"Фрагмент 2 починається з байта 1480",[3749,10787,10788],{},"1480 ÷ 8 = 185 блоків",[3749,10790,10791],{},"Fragment Offset = 185",[3881,10793,10794,10800],{},[3824,10795,10796,10799],{},[3776,10797,10798],{},"Чому 8-байтні блоки?","\nЦе дозволяє адресувати більший діапазон з меншою кількістю біт:",[3746,10801,10802,10805,10808],{},[3749,10803,10804],{},"Fragment Offset: 13 біт",[3749,10806,10807],{},"Максимальне значення: 2¹³ - 1 = 8191 блоків",[3749,10809,10810],{},"8191 × 8 = 65,528 байт (практично максимальний розмір IPv4 пакета 65,535 байт)",[3841,10812,10814],{"id":10813},"path-mtu-discovery-pmtud","Path MTU Discovery (PMTUD)",[3824,10816,10817,10819],{},[3776,10818,9399],{}," Як відправник дізнається MTU всього шляху до одержувача?",[3824,10821,10822],{},"Різні сегменти мережі можуть мати різні MTU:",[4025,10824,10827],{"className":10825,"code":10826,"language":4030},[4028],"Відправник (MTU 1500) → ISP (MTU 1500) → VPN-тунель (MTU 1400) → Одержувач (MTU 1500)\n                                            ↑ вузьке місце\n",[3811,10828,10826],{"__ignoreMap":4033},[3824,10830,10831],{},[3776,10832,10833],{},"Рішення: Path MTU Discovery (PMTUD)",[3824,10835,10836],{},[3776,10837,10838],{},"Процес PMTUD:",[4025,10840,10843],{"className":10841,"code":10842,"language":4030},[4028],"1. Відправник встановлює флаг DF=1 (Don't Fragment)\n   → \"Не фрагментуйте цей пакет!\"\n\n2. Відправляє пакет розміром 1500 байт\n\n3. Якщо маршрутизатор з MTU=1400 отримує пакет:\n   - Не може фрагментувати (DF=1)\n   - Відкидає пакет\n   - Надсилає ICMP Type 3, Code 4: \"Fragmentation Needed\"\n   - Вказує свій MTU: 1400\n\n4. Відправник отримує ICMP повідомлення\n   - Зменшує PMTU до 1400\n   - Повторно надсилає пакет розміром 1400 байт\n\n5. Пакет успішно проходить\n   - PMTU для цього шляху = 1400\n",[3811,10844,10842],{"__ignoreMap":4033},[5668,10846,10847],{"alt":6381},[4025,10848,10850],{"className":5673,"code":10849,"language":5675,"meta":4033,"style":4033},"@startuml\nskinparam style plain\nskinparam backgroundColor #FFFFFF\n\nparticipant \"Відправник\\nMTU 1500\" as Sender #DBEAFE\nparticipant \"Роутер 1\\nMTU 1500\" as R1 #E2E8F0\nparticipant \"VPN Gateway\\nMTU 1400\" as VPN #FEF3C7\nparticipant \"Одержувач\\nMTU 1500\" as Receiver #DCFCE7\n\nSender -> R1 : IP пакет 1500 байт\\n(DF=1, не фрагментувати)\nR1 -> VPN : Пересилання (1500 байт)\n\nnote right of VPN\n  MTU=1400, пакет 1500 байт\n  Не може фрагментувати (DF=1)\n  → Відкидає пакет\nend note\n\nVPN -> Sender : ICMP Type 3 Code 4\\n\"Fragmentation Needed\"\\n\"MTU=1400\"\n\nnote right of Sender\n  Оновлює PMTU: 1500 → 1400\nend note\n\nSender -> R1 : IP пакет 1400 байт\\n(DF=1)\nR1 -> VPN : Пересилання (1400 байт)\nVPN -> Receiver : Пересилання (1400 байт)\nReceiver -> Sender : Підтвердження\n@enduml\n",[3811,10851,10852,10856,10860,10864,10868,10873,10878,10883,10888,10892,10897,10902,10906,10911,10916,10921,10926,10930,10934,10939,10943,10948,10953,10957,10961,10966,10971,10976,10981],{"__ignoreMap":4033},[5679,10853,10854],{"class":5681,"line":5682},[5679,10855,5685],{},[5679,10857,10858],{"class":5681,"line":5688},[5679,10859,5691],{},[5679,10861,10862],{"class":5681,"line":5694},[5679,10863,5697],{},[5679,10865,10866],{"class":5681,"line":5700},[5679,10867,5704],{"emptyLinePlaceholder":5703},[5679,10869,10870],{"class":5681,"line":5707},[5679,10871,10872],{},"participant \"Відправник\\nMTU 1500\" as Sender #DBEAFE\n",[5679,10874,10875],{"class":5681,"line":5713},[5679,10876,10877],{},"participant \"Роутер 1\\nMTU 1500\" as R1 #E2E8F0\n",[5679,10879,10880],{"class":5681,"line":5719},[5679,10881,10882],{},"participant \"VPN Gateway\\nMTU 1400\" as VPN #FEF3C7\n",[5679,10884,10885],{"class":5681,"line":5725},[5679,10886,10887],{},"participant \"Одержувач\\nMTU 1500\" as Receiver #DCFCE7\n",[5679,10889,10890],{"class":5681,"line":5730},[5679,10891,5704],{"emptyLinePlaceholder":5703},[5679,10893,10894],{"class":5681,"line":5736},[5679,10895,10896],{},"Sender -> R1 : IP пакет 1500 байт\\n(DF=1, не фрагментувати)\n",[5679,10898,10899],{"class":5681,"line":5742},[5679,10900,10901],{},"R1 -> VPN : Пересилання (1500 байт)\n",[5679,10903,10904],{"class":5681,"line":5748},[5679,10905,5704],{"emptyLinePlaceholder":5703},[5679,10907,10908],{"class":5681,"line":5754},[5679,10909,10910],{},"note right of VPN\n",[5679,10912,10913],{"class":5681,"line":5760},[5679,10914,10915],{},"  MTU=1400, пакет 1500 байт\n",[5679,10917,10918],{"class":5681,"line":5766},[5679,10919,10920],{},"  Не може фрагментувати (DF=1)\n",[5679,10922,10923],{"class":5681,"line":5772},[5679,10924,10925],{},"  → Відкидає пакет\n",[5679,10927,10928],{"class":5681,"line":5777},[5679,10929,5769],{},[5679,10931,10932],{"class":5681,"line":5783},[5679,10933,5704],{"emptyLinePlaceholder":5703},[5679,10935,10936],{"class":5681,"line":5788},[5679,10937,10938],{},"VPN -> Sender : ICMP Type 3 Code 4\\n\"Fragmentation Needed\"\\n\"MTU=1400\"\n",[5679,10940,10941],{"class":5681,"line":5794},[5679,10942,5704],{"emptyLinePlaceholder":5703},[5679,10944,10945],{"class":5681,"line":5799},[5679,10946,10947],{},"note right of Sender\n",[5679,10949,10950],{"class":5681,"line":5804},[5679,10951,10952],{},"  Оновлює PMTU: 1500 → 1400\n",[5679,10954,10955],{"class":5681,"line":5810},[5679,10956,5769],{},[5679,10958,10959],{"class":5681,"line":5816},[5679,10960,5704],{"emptyLinePlaceholder":5703},[5679,10962,10963],{"class":5681,"line":5822},[5679,10964,10965],{},"Sender -> R1 : IP пакет 1400 байт\\n(DF=1)\n",[5679,10967,10968],{"class":5681,"line":5827},[5679,10969,10970],{},"R1 -> VPN : Пересилання (1400 байт)\n",[5679,10972,10973],{"class":5681,"line":5832},[5679,10974,10975],{},"VPN -> Receiver : Пересилання (1400 байт)\n",[5679,10977,10978],{"class":5681,"line":5838},[5679,10979,10980],{},"Receiver -> Sender : Підтвердження\n",[5679,10982,10983],{"class":5681,"line":7696},[5679,10984,5841],{},[3824,10986,10987],{},[3776,10988,10989],{},"Тестування MTU командою ping:",[4025,10991,10993],{"className":6885,"code":10992,"language":6887,"meta":4033,"style":4033},"# Linux: надіслати пакет 1472 байт з DF=1\nping -M do -s 1472 google.com\n  # -M do: встановити DF (Don't Fragment)\n  # -s 1472: розмір даних (1472 + 28 ICMP\u002FIP = 1500 байт)\n\n# Якщо проходить → PMTU ≥ 1500\n# Якщо повертає \"Frag needed\" → PMTU \u003C 1500, зменшуйте розмір\n\n# Windows: надіслати пакет з DF=1\nping -f -l 1472 google.com\n  # -f: встановити DF\n  # -l 1472: розмір даних\n\n# macOS: надіслати пакет з DF=1\nping -D -s 1472 google.com\n  # -D: встановити DF\n",[3811,10994,10995,11000,11016,11021,11026,11030,11035,11040,11044,11049,11062,11067,11072,11076,11081,11094],{"__ignoreMap":4033},[5679,10996,10997],{"class":5681,"line":5682},[5679,10998,10999],{"class":7931},"# Linux: надіслати пакет 1472 байт з DF=1\n",[5679,11001,11002,11004,11007,11010,11012,11014],{"class":5681,"line":5688},[5679,11003,8295],{"class":6894},[5679,11005,11006],{"class":6902}," -M",[5679,11008,11009],{"class":6898}," do",[5679,11011,9105],{"class":6902},[5679,11013,9108],{"class":6921},[5679,11015,8852],{"class":6898},[5679,11017,11018],{"class":5681,"line":5694},[5679,11019,11020],{"class":7931},"  # -M do: встановити DF (Don't Fragment)\n",[5679,11022,11023],{"class":5681,"line":5700},[5679,11024,11025],{"class":7931},"  # -s 1472: розмір даних (1472 + 28 ICMP\u002FIP = 1500 байт)\n",[5679,11027,11028],{"class":5681,"line":5707},[5679,11029,5704],{"emptyLinePlaceholder":5703},[5679,11031,11032],{"class":5681,"line":5713},[5679,11033,11034],{"class":7931},"# Якщо проходить → PMTU ≥ 1500\n",[5679,11036,11037],{"class":5681,"line":5719},[5679,11038,11039],{"class":7931},"# Якщо повертає \"Frag needed\" → PMTU \u003C 1500, зменшуйте розмір\n",[5679,11041,11042],{"class":5681,"line":5725},[5679,11043,5704],{"emptyLinePlaceholder":5703},[5679,11045,11046],{"class":5681,"line":5730},[5679,11047,11048],{"class":7931},"# Windows: надіслати пакет з DF=1\n",[5679,11050,11051,11053,11055,11058,11060],{"class":5681,"line":5736},[5679,11052,8295],{"class":6894},[5679,11054,9154],{"class":6902},[5679,11056,11057],{"class":6902}," -l",[5679,11059,9108],{"class":6921},[5679,11061,8852],{"class":6898},[5679,11063,11064],{"class":5681,"line":5742},[5679,11065,11066],{"class":7931},"  # -f: встановити DF\n",[5679,11068,11069],{"class":5681,"line":5748},[5679,11070,11071],{"class":7931},"  # -l 1472: розмір даних\n",[5679,11073,11074],{"class":5681,"line":5754},[5679,11075,5704],{"emptyLinePlaceholder":5703},[5679,11077,11078],{"class":5681,"line":5760},[5679,11079,11080],{"class":7931},"# macOS: надіслати пакет з DF=1\n",[5679,11082,11083,11085,11088,11090,11092],{"class":5681,"line":5766},[5679,11084,8295],{"class":6894},[5679,11086,11087],{"class":6902}," -D",[5679,11089,9105],{"class":6902},[5679,11091,9108],{"class":6921},[5679,11093,8852],{"class":6898},[5679,11095,11096],{"class":5681,"line":5772},[5679,11097,11098],{"class":7931},"  # -D: встановити DF\n",[3841,11100,11102],{"id":11101},"різниця-фрагментації-у-ipv4-та-ipv6","Різниця фрагментації у IPv4 та IPv6",[4243,11104,11105,11116],{},[4246,11106,11107],{},[4249,11108,11109,11111,11114],{},[4252,11110,9944],{"align":4261},[4252,11112,11113],{"align":4261},"IPv4",[4252,11115,5958],{"align":4261},[4273,11117,11118,11133,11148,11161],{},[4249,11119,11120,11125,11128],{},[4278,11121,11122],{"align":4261},[3776,11123,11124],{},"Хто фрагментує",[4278,11126,11127],{"align":4261},"Відправник АБО проміжні маршрутизатори",[4278,11129,11130],{"align":4261},[3776,11131,11132],{},"Тільки відправник",[4249,11134,11135,11140,11143],{},[4278,11136,11137],{"align":4261},[3776,11138,11139],{},"PMTUD",[4278,11141,11142],{"align":4261},"Опціональний (через DF=1)",[4278,11144,11145],{"align":4261},[3776,11146,11147],{},"Обов'язковий",[4249,11149,11150,11155,11158],{},[4278,11151,11152],{"align":4261},[3776,11153,11154],{},"Мінімальний MTU",[4278,11156,11157],{"align":4261},"Немає гарантії",[4278,11159,11160],{"align":4261},"Мінімум 1280 байт",[4249,11162,11163,11168,11171],{},[4278,11164,11165],{"align":4261},[3776,11166,11167],{},"Фрагментація маршрутизатором",[4278,11169,11170],{"align":4261},"Так (якщо DF=0)",[4278,11172,11173,11176],{"align":4261},[3776,11174,11175],{},"Ні"," (маршрутизатори НЕ фрагментують)",[3824,11178,11179],{},[3776,11180,11181],{},"Чому IPv6 не дозволяє маршрутизаторам фрагментувати:",[3746,11183,11184,11187,11190],{},[3749,11185,11186],{},"Фрагментація — це дорога операція (процесорний час, пам'ять)",[3749,11188,11189],{},"Переносить відповідальність на відправника (кінцеві хости мають більше ресурсів)",[3749,11191,11192],{},"Примушує використовувати PMTUD (ефективніше)",[3841,11194,11196],{"id":11195},"проблеми-з-фрагментацією","Проблеми з фрагментацією",[3824,11198,11199],{},[3776,11200,11201],{},"1. Overhead (накладні витрати):",[4025,11203,11206],{"className":11204,"code":11205,"language":4030},[4028],"Оригінальний пакет: 3000 байт (20 байт заголовок + 2980 даних)\nПісля фрагментації:\n  Фрагмент 1: 1500 байт (20 байт заголовок + 1480 даних)\n  Фрагмент 2: 1520 байт (20 байт заголовок + 1500 даних)\n  Всього: 3020 байт (додаткові 20 байт заголовка)\n",[3811,11207,11205],{"__ignoreMap":4033},[3824,11209,11210],{},[3776,11211,11212],{},"2. Втрата одного фрагмента = втрата всього пакета:",[4025,11214,11217],{"className":11215,"code":11216,"language":4030},[4028],"Фрагмент 1: доставлено ✓\nФрагмент 2: втрачено ✗\n→ Одержувач не може зібрати пакет\n→ Весь пакет відкидається\n→ TCP повторно надсилає ВСЬ пакет (включно з фрагментом 1)\n",[3811,11218,11216],{"__ignoreMap":4033},[3824,11220,11221,11224],{},[3776,11222,11223],{},"3. Затримки збору:","\nОдержувач повинен чекати всі фрагменти перед обробкою.",[3824,11226,11227,11230],{},[3776,11228,11229],{},"4. Навантаження на CPU:","\nФрагментація та збірка — це процесорно-інтенсивні операції.",[3824,11232,11233,11236],{},[3776,11234,11235],{},"5. Проблеми з фаєрволами:","\nДеякі фаєрволи блокують фрагментовані пакети або неправильно їх обробляють.",[3841,11238,11240],{"id":11239},"best-practices-уникнення-фрагментації","Best Practices: уникнення фрагментації",[3824,11242,11243],{},[3776,11244,11245],{},"1. Використовуйте PMTUD (встановлюйте DF=1):",[4025,11247,11250],{"className":11248,"code":11249,"language":4030},[4028],"Сучасні ОС встановлюють DF=1 за замовчуванням для TCP\n",[3811,11251,11249],{"__ignoreMap":4033},[3824,11253,11254,11257,3965,11260,11263],{},[3776,11255,11256],{},"2. TCP MSS Clamping на маршрутизаторах:",[3776,11258,11259],{},"MSS",[3828,11261,11262],{},"Maximum Segment Size",") — максимальний розмір даних у TCP-сегменті (без заголовків).",[3824,11265,11266],{},"Маршрутизатор може обмежувати MSS у TCP SYN-пакетах:",[4025,11268,11271],{"className":11269,"code":11270,"language":4030},[4028],"Клієнт оголошує MSS=1460 (для MTU 1500)\nРоутер перезаписує MSS=1360 (для MTU 1400)\n→ Клієнт ніколи не надсилає сегменти більші за 1360 байт\n→ Фрагментація не потрібна\n",[3811,11272,11270],{"__ignoreMap":4033},[3824,11274,11275],{},[3776,11276,11277],{},"Налаштування MSS clamping (Linux iptables):",[4025,11279,11281],{"className":6885,"code":11280,"language":6887,"meta":4033,"style":4033},"sudo iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN \\\n  -j TCPMSS --set-mss 1360\n",[3811,11282,11283,11320],{"__ignoreMap":4033},[5679,11284,11285,11287,11290,11293,11296,11299,11302,11305,11308,11311,11314,11317],{"class":5681,"line":5682},[5679,11286,6895],{"class":6894},[5679,11288,11289],{"class":6898}," iptables",[5679,11291,11292],{"class":6902}," -t",[5679,11294,11295],{"class":6898}," mangle",[5679,11297,11298],{"class":6902}," -A",[5679,11300,11301],{"class":6898}," FORWARD",[5679,11303,11304],{"class":6902}," -p",[5679,11306,11307],{"class":6898}," tcp",[5679,11309,11310],{"class":6902}," --tcp-flags",[5679,11312,11313],{"class":6898}," SYN,RST",[5679,11315,11316],{"class":6898}," SYN",[5679,11318,11319],{"class":8074}," \\\n",[5679,11321,11322,11325,11328,11331],{"class":5681,"line":5688},[5679,11323,11324],{"class":6902},"  -j",[5679,11326,11327],{"class":6898}," TCPMSS",[5679,11329,11330],{"class":6902}," --set-mss",[5679,11332,11333],{"class":6921}," 1360\n",[3824,11335,11336],{},[3776,11337,11338],{},"3. Зменшіть MTU на інтерфейсі (якщо потрібно):",[4025,11340,11342],{"className":6885,"code":11341,"language":6887,"meta":4033,"style":4033},"# Linux\nsudo ip link set dev eth0 mtu 1400\n\n# Перевірка\nip link show eth0\n",[3811,11343,11344,11348,11369,11373,11378],{"__ignoreMap":4033},[5679,11345,11346],{"class":5681,"line":5682},[5679,11347,9692],{"class":7931},[5679,11349,11350,11352,11354,11356,11359,11361,11363,11366],{"class":5681,"line":5688},[5679,11351,6895],{"class":6894},[5679,11353,9790],{"class":6898},[5679,11355,10598],{"class":6898},[5679,11357,11358],{"class":6898}," set",[5679,11360,10059],{"class":6898},[5679,11362,10062],{"class":6898},[5679,11364,11365],{"class":6898}," mtu",[5679,11367,11368],{"class":6921}," 1400\n",[5679,11370,11371],{"class":5681,"line":5694},[5679,11372,5704],{"emptyLinePlaceholder":5703},[5679,11374,11375],{"class":5681,"line":5700},[5679,11376,11377],{"class":7931},"# Перевірка\n",[5679,11379,11380,11382,11384,11386],{"class":5681,"line":5707},[5679,11381,10034],{"class":6894},[5679,11383,10598],{"class":6898},[5679,11385,10601],{"class":6898},[5679,11387,10399],{"class":6898},[3824,11389,11390,11393],{},[3776,11391,11392],{},"4. Уникайте створення великих UDP-пакетів:","\nUDP не має автоматичної фрагментації на транспортному рівні. Якщо UDP-пакет більший за MTU → фрагментація на IP-рівні.",[3824,11395,11396,11399],{},[3776,11397,11398],{},"Рекомендація:"," обмежуйте розмір UDP-датаграм до 1472 байт (1500 MTU - 20 IP - 8 UDP).",[3816,11401],{},[3819,11403,11405],{"id":11404},"підсумок","Підсумок",[3824,11407,11408],{},"IP-адресація, структура пакетів, протоколи ICMP\u002FARP, порти та сокети є фундаментальними концепціями мережевого стеку TCP\u002FIP, без розуміння яких неможливе свідоме проєктування та налагодження вебзастосунків.",[3824,11410,11411],{},[3776,11412,11413],{},"Ключові висновки:",[3746,11415,11416,11421,11427,11433,11439,11445,11451,11457,11463,11468,11473,11481,11490,11495,11500],{},[3749,11417,11418,11420],{},[3776,11419,3875],{}," — це логічний 32-бітовий (IPv4) або 128-бітовий (IPv6) ідентифікатор вузла в мережі.",[3749,11422,11423,11426],{},[3776,11424,11425],{},"Структура IP-пакета:"," заголовок містить критичні поля (TTL, Protocol, Source\u002FDestination IP, Flags для фрагментації), що контролюють доставку пакетів.",[3749,11428,11429,11432],{},[3776,11430,11431],{},"TTL (Time To Live)"," захищає від циклів маршрутизації, зменшується на 1 на кожному hop, використовується у traceroute.",[3749,11434,11435,11438],{},[3776,11436,11437],{},"Protocol field"," визначає протокол вищого рівня (1=ICMP, 6=TCP, 17=UDP), вказує ОС, як обробляти пакет.",[3749,11440,11441,11444],{},[3776,11442,11443],{},"ICMP протокол"," є критичним для діагностики мережі (ping, traceroute) та повідомлень про помилки (Destination Unreachable, Time Exceeded).",[3749,11446,11447,11450],{},[3776,11448,11449],{},"ARP протокол"," перекладає IP-адреси у MAC-адреси в локальній мережі через broadcast запити та unicast відповіді.",[3749,11452,11453,11456],{},[3776,11454,11455],{},"ARP Spoofing"," — серйозна загроза безпеки, захист потребує DAI, DHCP Snooping та port security на комутаторах.",[3749,11458,11459,11462],{},[3776,11460,11461],{},"IPv6 NDP"," замінює ARP, використовує multicast замість broadcast, є частиною ICMPv6.",[3749,11464,11465,11467],{},[3776,11466,10715],{}," розбиває великі пакети для проходження через мережі з меншим MTU, але створює overhead та проблеми з продуктивністю.",[3749,11469,11470,11472],{},[3776,11471,10814],{}," з флагом DF=1 дозволяє знайти оптимальний розмір пакета без фрагментації.",[3749,11474,11475,5088,11477,11480],{},[3776,11476,4672],{},[3776,11478,11479],{},"CIDR-нотація"," визначають, яка частина адреси відноситься до мережі, а яка — до хоста.",[3749,11482,11483,11486,11487,11489],{},[3776,11484,11485],{},"Приватні діапазони"," (10.0.0.0\u002F8, 172.16.0.0\u002F12, 192.168.0.0\u002F16) використовуються у локальних мережах, а ",[3776,11488,5301],{}," дозволяє їм спільно використовувати публічну адресу.",[3749,11491,11492,11494],{},[3776,11493,5958],{}," вирішує проблему вичерпання IPv4-адрес, надаючи практично необмежну кількість адрес та усуваючи необхідність у NAT.",[3749,11496,11497,11499],{},[3776,11498,6987],{}," — це 16-бітове число, що ідентифікує конкретний процес на вузлі, дозволяючи мультиплексувати кілька з'єднань через одну IP-адресу.",[3749,11501,11502,11504],{},[3776,11503,7442],{}," — це комбінація IP-адреси та порту, що унікально ідентифікує кінцеву точку мережевого з'єднання.",[3824,11506,11507],{},[3776,11508,11509],{},"Діагностичні інструменти, що використовують ці концепції:",[3746,11511,11512,11517,11525,11531,11539],{},[3749,11513,11514,11516],{},[3811,11515,8295],{}," (ICMP Echo Request\u002FReply) — перевірка доступності та RTT",[3749,11518,11519,11521,11522,11524],{},[3811,11520,6477],{}," \u002F ",[3811,11523,9003],{}," (ICMP Time Exceeded + TTL) — визначення маршруту",[3749,11526,11527,11530],{},[3811,11528,11529],{},"arp -a"," — перегляд ARP cache (IP→MAC відповідності)",[3749,11532,11533,11521,11536,11538],{},[3811,11534,11535],{},"ip link show",[3811,11537,10616],{}," — перегляд MTU інтерфейсів",[3749,11540,11541,11521,11543,11545],{},[3811,11542,6881],{},[3811,11544,6854],{}," — захоплення та аналіз IP-пакетів",[3824,11547,11548],{},"У наступних розділах ми детально розглянемо протоколи транспортного рівня (TCP та UDP), які використовують порти для доставки даних між застосунками, та прикладні протоколи (HTTP, DNS, SMTP), що працюють поверх транспортного рівня.",[3816,11550],{},[3819,11552,11554],{"id":11553},"контрольні-питання-для-самоперевірки","Контрольні питання для самоперевірки",[3983,11556,11557,11560,11563,11566,11569,11572,11575,11578,11581,11584,11587,11590,11593,11596,11599,11602,11605,11608,11611,11614,11621,11624,11627,11630,11633,11636],{},[3749,11558,11559],{},"Що таке IP-адреса? У чому різниця між IP-адресою (логічна) та MAC-адресою (фізична)?",[3749,11561,11562],{},"Поясніть структуру IPv4-адреси. Скільки біт вона містить і як записується у десятковій крапковій нотації?",[3749,11564,11565],{},"Опишіть структуру IPv4-заголовка. Які основні поля містить заголовок та яке їх призначення?",[3749,11567,11568],{},"Що таке TTL (Time To Live) і навіщо воно потрібне? Як TTL використовується у traceroute?",[3749,11570,11571],{},"Яке значення має поле Protocol у IP-заголовку? Наведіть приклади (ICMP, TCP, UDP).",[3749,11573,11574],{},"Що таке ICMP протокол? Які типи ICMP-повідомлень ви знаєте та для чого вони використовуються?",[3749,11576,11577],{},"Поясніть, як працює ping. Які типи ICMP-повідомлень використовуються?",[3749,11579,11580],{},"Як працює traceroute? Поясніть роль TTL та ICMP Time Exceeded.",[3749,11582,11583],{},"Що таке ARP і навіщо він потрібен? Опишіть процес ARP Request\u002FReply.",[3749,11585,11586],{},"У чому різниця між dynamic та static записами в ARP cache?",[3749,11588,11589],{},"Що таке Gratuitous ARP та для чого він використовується?",[3749,11591,11592],{},"Поясніть, як працює атака ARP Spoofing. Які методи захисту існують?",[3749,11594,11595],{},"Чим NDP у IPv6 відрізняється від ARP у IPv4?",[3749,11597,11598],{},"Що таке MTU та які типові значення MTU для різних типів мереж?",[3749,11600,11601],{},"Що таке фрагментація пакетів? Коли вона виникає та які проблеми створює?",[3749,11603,11604],{},"Опишіть поля IP-заголовка, що використовуються для фрагментації (Identification, Flags, Fragment Offset).",[3749,11606,11607],{},"Що таке Path MTU Discovery (PMTUD) і як воно працює?",[3749,11609,11610],{},"У чому різниця між фрагментацією у IPv4 та IPv6?",[3749,11612,11613],{},"Що таке маска підмережі? Як вона використовується для визначення мережевої та хостової частини IP-адреси?",[3749,11615,11616,11617,11620],{},"Обчисліть діапазон хостів для мережі ",[3811,11618,11619],{},"10.20.30.128\u002F26",". Вкажіть адресу мережі, діапазон доступних хостів та broadcast-адресу.",[3749,11622,11623],{},"Які три приватні діапазони IPv4 визначені RFC 1918? Чому вони не маршрутизуються в Інтернеті?",[3749,11625,11626],{},"Поясніть принцип роботи NAT. Чому NAT з'явився та які його переваги та недоліки?",[3749,11628,11629],{},"Чим IPv6 відрізняється від IPv4? Скільки адрес надає IPv6 та чому це вирішує проблему вичерпання адрес?",[3749,11631,11632],{},"Що таке порт? Які три діапазони портів існують та для чого вони використовуються?",[3749,11634,11635],{},"Що таке сокет? Як він формується та чому він унікально ідентифікує кінцеву точку з'єднання?",[3749,11637,11638],{},"Поясніть п'ятикомпонентну ідентифікацію (5-tuple) мережевого з'єднання.",[3816,11640],{},[3819,11642,11644],{"id":11643},"додаткові-матеріали-для-поглибленого-вивчення","Додаткові матеріали для поглибленого вивчення",[3738,11646,11647,11680,11873],{},[3741,11648,11650],{"icon":15,"title":11649},"📖 Рекомендована література",[3746,11651,11652,11659,11662,11665,11668,11671,11674,11677],{},[3749,11653,11654,11655,11658],{},"W. Richard Stevens. ",[3828,11656,11657],{},"TCP\u002FIP Illustrated, Volume 1."," — Addison-Wesley, 2011. (Розділи 3-9: IP-адресація, ICMP, ARP, маршрутизація, фрагментація).",[3749,11660,11661],{},"RFC 791 — Internet Protocol (IPv4) — офіційна специфікація",[3749,11663,11664],{},"RFC 792 — Internet Control Message Protocol (ICMP)",[3749,11666,11667],{},"RFC 826 — Address Resolution Protocol (ARP)",[3749,11669,11670],{},"RFC 1191 — Path MTU Discovery",[3749,11672,11673],{},"RFC 8200 — Internet Protocol, Version 6 (IPv6)",[3749,11675,11676],{},"RFC 4861 — Neighbor Discovery for IPv6 (NDP)",[3749,11678,11679],{},"RFC 1918 — Address Allocation for Private Internets",[3741,11681,11683,11688,11706,11711,11745,11750,11768,11773,11836,11841],{"icon":2882,"title":11682},"🛠️ Практичні інструменти",[3824,11684,11685],{},[3776,11686,11687],{},"Калькулятори та планування:",[3746,11689,11690,11700],{},[3749,11691,11692,11699],{},[11693,11694,11698],"a",{"href":11695,"rel":11696},"https:\u002F\u002Fwww.subnet-calculator.com\u002F",[11697],"nofollow","IP Calculator"," — калькулятор підмереж",[3749,11701,11702,11705],{},[3811,11703,11704],{},"ipcalc"," (Linux) — утиліта командного рядка для обчислень з IP",[3824,11707,11708],{},[3776,11709,11710],{},"Діагностика мережі:",[3746,11712,11713,11718,11727,11735],{},[3749,11714,11715,11717],{},[3811,11716,8295],{}," — перевірка доступності (ICMP Echo)",[3749,11719,11720,11521,11722,11521,11724,11726],{},[3811,11721,6477],{},[3811,11723,9003],{},[3811,11725,9249],{}," — визначення маршруту",[3749,11728,11729,11521,11731,11734],{},[3811,11730,9617],{},[3811,11732,11733],{},"ip neigh"," — перегляд ARP cache",[3749,11736,11737,11521,11739,11521,11741,11744],{},[3811,11738,11535],{},[3811,11740,10616],{},[3811,11742,11743],{},"ipconfig"," — перегляд MTU та адрес",[3824,11746,11747],{},[3776,11748,11749],{},"Захоплення та аналіз пакетів:",[3746,11751,11752,11757,11762],{},[3749,11753,11754,11756],{},[3776,11755,6854],{}," — GUI аналізатор пакетів з підтримкою декодування IP, ICMP, ARP",[3749,11758,11759,11761],{},[3776,11760,6881],{}," — командний рядок для захоплення пакетів",[3749,11763,11764,11767],{},[3776,11765,11766],{},"arpwatch"," — моніторинг змін у ARP-таблиці",[3824,11769,11770],{},[3776,11771,11772],{},"Тестування MTU:",[4025,11774,11776],{"className":6885,"code":11775,"language":6887,"meta":4033,"style":4033},"# Linux\nping -M do -s 1472 google.com\n\n# Windows\nping -f -l 1472 google.com\n\n# macOS\nping -D -s 1472 google.com\n",[3811,11777,11778,11782,11796,11800,11804,11816,11820,11824],{"__ignoreMap":4033},[5679,11779,11780],{"class":5681,"line":5682},[5679,11781,9692],{"class":7931},[5679,11783,11784,11786,11788,11790,11792,11794],{"class":5681,"line":5688},[5679,11785,8295],{"class":6894},[5679,11787,11006],{"class":6902},[5679,11789,11009],{"class":6898},[5679,11791,9105],{"class":6902},[5679,11793,9108],{"class":6921},[5679,11795,8852],{"class":6898},[5679,11797,11798],{"class":5681,"line":5694},[5679,11799,5704],{"emptyLinePlaceholder":5703},[5679,11801,11802],{"class":5681,"line":5700},[5679,11803,9185],{"class":7931},[5679,11805,11806,11808,11810,11812,11814],{"class":5681,"line":5707},[5679,11807,8295],{"class":6894},[5679,11809,9154],{"class":6902},[5679,11811,11057],{"class":6902},[5679,11813,9108],{"class":6921},[5679,11815,8852],{"class":6898},[5679,11817,11818],{"class":5681,"line":5713},[5679,11819,5704],{"emptyLinePlaceholder":5703},[5679,11821,11822],{"class":5681,"line":5719},[5679,11823,9735],{"class":7931},[5679,11825,11826,11828,11830,11832,11834],{"class":5681,"line":5725},[5679,11827,8295],{"class":6894},[5679,11829,11087],{"class":6902},[5679,11831,9105],{"class":6902},[5679,11833,9108],{"class":6921},[5679,11835,8852],{"class":6898},[3824,11837,11838],{},[3776,11839,11840],{},"Перегляд структури пакетів:",[4025,11842,11844],{"className":6885,"code":11843,"language":6887,"meta":4033,"style":4033},"# Захопити та показати hex dump\nsudo tcpdump -i any -n -X 'icmp or arp' -c 5\n",[3811,11845,11846,11851],{"__ignoreMap":4033},[5679,11847,11848],{"class":5681,"line":5682},[5679,11849,11850],{"class":7931},"# Захопити та показати hex dump\n",[5679,11852,11853,11855,11857,11859,11861,11863,11865,11868,11870],{"class":5681,"line":5688},[5679,11854,6895],{"class":6894},[5679,11856,6899],{"class":6898},[5679,11858,6903],{"class":6902},[5679,11860,6906],{"class":6898},[5679,11862,6909],{"class":6902},[5679,11864,6912],{"class":6902},[5679,11866,11867],{"class":6898}," 'icmp or arp'",[5679,11869,6918],{"class":6902},[5679,11871,11872],{"class":6921}," 5\n",[3741,11874,11877,11881,11906,11911],{"icon":11875,"title":11876},"i-lucide-shield","🔒 Безпека",[3824,11878,11879],{},[3776,11880,10267],{},[3746,11882,11883,11889,11895,11901],{},[3749,11884,11885,11888],{},[3776,11886,11887],{},"Dynamic ARP Inspection (DAI)"," на комутаторах",[3749,11890,11891,11894],{},[3776,11892,11893],{},"DHCP Snooping"," — відстеження DHCP-призначень",[3749,11896,11897,11900],{},[3776,11898,11899],{},"Port Security"," — обмеження MAC-адрес на порт",[3749,11902,11903,11905],{},[3776,11904,11766],{}," — детекція змін у ARP cache",[3824,11907,11908],{},[3776,11909,11910],{},"ICMP безпека:",[3746,11912,11913,11916,11919],{},[3749,11914,11915],{},"Rate limiting ICMP на фаєрволі",[3749,11917,11918],{},"Дозвіл критичних типів (0, 3, 8, 11)",[3749,11920,11921],{},"Блокування ICMP Redirect (Type 5)",[11923,11924,11925],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s8Opu, html code.shiki .s8Opu{--shiki-light:#795E26;--shiki-default:#DCDCAA;--shiki-dark:#DCDCAA}html pre.shiki code .sbdoH, html code.shiki .sbdoH{--shiki-light:#A31515;--shiki-default:#CE9178;--shiki-dark:#CE9178}html pre.shiki code .su1O8, html code.shiki .su1O8{--shiki-light:#0000FF;--shiki-default:#569CD6;--shiki-dark:#569CD6}html pre.shiki code .sJj4R, html code.shiki .sJj4R{--shiki-light:#098658;--shiki-default:#B5CEA8;--shiki-dark:#B5CEA8}html pre.shiki code .s-QsJ, html code.shiki .s-QsJ{--shiki-light:#0070C1;--shiki-default:#4FC1FF;--shiki-dark:#4FC1FF}html pre.shiki code .sHH4Y, html code.shiki .sHH4Y{--shiki-light:#000000;--shiki-default:#D4D4D4;--shiki-dark:#D4D4D4}html pre.shiki code .spJ8K, html code.shiki .spJ8K{--shiki-light:#008000;--shiki-default:#6A9955;--shiki-dark:#6A9955}html pre.shiki code .siwwj, html code.shiki .siwwj{--shiki-light:#001080;--shiki-default:#9CDCFE;--shiki-dark:#9CDCFE}html pre.shiki code .sjcCO, html code.shiki .sjcCO{--shiki-light:#EE0000;--shiki-default:#D7BA7D;--shiki-dark:#D7BA7D}",{"title":4033,"searchDepth":5688,"depth":5688,"links":11927},[11928,11932,11937,11940,11946,11951,11955,11960,11966,11971,11978,11987,11996,11997,11998],{"id":3821,"depth":5688,"text":3822,"children":11929},[11930,11931],{"id":3843,"depth":5694,"text":3844},{"id":3894,"depth":5694,"text":3895},{"id":3949,"depth":5688,"text":3950,"children":11933},[11934,11935,11936],{"id":3953,"depth":5694,"text":3954},{"id":4080,"depth":5694,"text":4081},{"id":4107,"depth":5694,"text":4108},{"id":4223,"depth":5688,"text":4224,"children":11938},[11939],{"id":4237,"depth":5694,"text":4238},{"id":4646,"depth":5688,"text":4647,"children":11941},[11942,11943,11944,11945],{"id":4666,"depth":5694,"text":4667},{"id":4718,"depth":5694,"text":4719},{"id":4783,"depth":5694,"text":4784},{"id":5105,"depth":5694,"text":5106},{"id":5290,"depth":5688,"text":5291,"children":11947},[11948,11949,11950],{"id":5307,"depth":5694,"text":5308},{"id":5473,"depth":5694,"text":5474},{"id":5544,"depth":5694,"text":5545},{"id":5897,"depth":5688,"text":5898,"children":11952},[11953,11954],{"id":5901,"depth":5694,"text":5902},{"id":5952,"depth":5694,"text":5953},{"id":6122,"depth":5688,"text":6123,"children":11956},[11957,11958,11959],{"id":6140,"depth":5694,"text":6141},{"id":6185,"depth":5694,"text":6186},{"id":6783,"depth":5694,"text":6784},{"id":6957,"depth":5688,"text":6958,"children":11961},[11962,11963,11964,11965],{"id":6981,"depth":5694,"text":6982},{"id":7005,"depth":5694,"text":7006},{"id":7307,"depth":5694,"text":7308},{"id":7349,"depth":5694,"text":7350},{"id":7432,"depth":5688,"text":7433,"children":11967},[11968,11969,11970],{"id":7436,"depth":5694,"text":7437},{"id":7497,"depth":5694,"text":7498},{"id":7815,"depth":5694,"text":7816},{"id":8265,"depth":5688,"text":8266,"children":11972},[11973,11974,11975,11976,11977],{"id":8269,"depth":5694,"text":8270},{"id":8317,"depth":5694,"text":8318},{"id":8350,"depth":5694,"text":8351},{"id":9049,"depth":5694,"text":9050},{"id":9271,"depth":5694,"text":9272},{"id":9378,"depth":5688,"text":9379,"children":11979},[11980,11981,11982,11983,11984,11985,11986],{"id":9382,"depth":5694,"text":9383},{"id":9414,"depth":5694,"text":9415},{"id":9589,"depth":5694,"text":9590},{"id":9841,"depth":5694,"text":9842},{"id":9890,"depth":5694,"text":9891},{"id":9916,"depth":5694,"text":9917},{"id":10090,"depth":5694,"text":10091},{"id":10442,"depth":5688,"text":10443,"children":11988},[11989,11990,11991,11992,11993,11994,11995],{"id":10446,"depth":5694,"text":10447},{"id":10709,"depth":5694,"text":10710},{"id":10730,"depth":5694,"text":10731},{"id":10813,"depth":5694,"text":10814},{"id":11101,"depth":5694,"text":11102},{"id":11195,"depth":5694,"text":11196},{"id":11239,"depth":5694,"text":11240},{"id":11404,"depth":5688,"text":11405},{"id":11553,"depth":5688,"text":11554},{"id":11643,"depth":5688,"text":11644},"Детальний розгляд IPv4 та IPv6 адресації, структура IP-адрес, підмережі, маски, порти, поняття сокета та адресація в мережевих застосунках","md",null,{},{"title":3548,"description":11999},"ForB0ROQzSP5qcZcaQMS3BO1h-g5DrWqQQeORC06fWk",[12006,12008],{"title":3544,"path":3545,"stem":3546,"description":12007,"children":-1},"Архітектура TCP\u002FIP, порівняння з моделлю OSI, чотирирівнева структура та практичне застосування інтернет-протоколів",{"title":3552,"path":3553,"stem":3554,"description":12009,"children":-1},"Детальний розгляд транспортних протоколів TCP і UDP: структура, механізми роботи, контроль потоку, виявлення помилок, three-way handshake, порівняння та практичне застосування",1788069973337]