SDN-дайдТСст β€” ΡˆΠ΅ΡΡ‚ΡŒ эмуляторов с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ

Π’ ΠΏΡ€ΠΎΡˆΠ»Ρ‹ΠΉ Ρ€Π°Π· ΠΌΡ‹ сдСлали ΠΏΠΎΠ΄Π±ΠΎΡ€ΠΊΡƒ опСнсорсных SDN-ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ². БСгодня Π½Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΎΡ‚Ρ€Ρ‹Ρ‚Ρ‹Π΅ эмуляторы SDN-сСтСй. ВсСх, ΠΊΠΎΠΌΡƒ это интСрСсно, ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ°Π΅ΠΌ ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚.

SDN-дайдТСст — ΡˆΠ΅ΡΡ‚ΡŒ эмуляторов с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ/ Flickr / Dennis van Zuijlekom / CC

Mininet

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ позволяСт ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌΡƒΡŽ ΡΠ΅Ρ‚ΡŒ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ машинС (Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ»ΠΈ физичСской). Достаточно ввСсти ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ: $ sudo mn. По словам Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², Mininet Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Ρ€Π°Π·Π²Π΅Ρ€Ρ‚ΠΊΠΈ тСстовых срСд.

К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΏΡ€Π΅ΠΏΠΎΠ΄Π°Π²Π°Ρ‚Π΅Π»ΠΈ Бтэнфорда (Π³Π΄Π΅ ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ Mininet) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ Π²ΠΎ врСмя практичСских занятий Π² унивСрситСтС. Она ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΈΡ‚ΡŒ учащимся Π½Π°Π²Ρ‹ΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с сСтями. НСкоторыС ΠΈΠ· Π·Π°Π΄Π°Π½ΠΈΠΉ ΠΈ Π΄Π΅ΠΌΠΎΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Π½Π° GitHub.

Mininet Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для тСстирования кастомных SDN-Ρ‚ΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΠΉ. Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ ΡΠ΅Ρ‚ΡŒ разворачиваСтся со всСми свитчами, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°ΠΌΠΈ ΠΈ хостами, Π° Π·Π°Ρ‚Π΅ΠΌ Π΅Ρ‘ Ρ€Π°Π±ΠΎΡ‚ΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ провСряСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python-скриптов. Π—Π°Ρ‚Π΅ΠΌ настройки пСрСносятся ΠΈΠ· Mininet Π² Ρ€Π΅Π°Π»ΡŒΠ½ΡƒΡŽ ΡΠ΅Ρ‚ΡŒ.

Из нСдостатков Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ экспСрты Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‚ отсутствиС ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Windows. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Mininet Π½Π΅ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΠ°ΡΡˆΡ‚Π°Π±Π½Ρ‹ΠΌΠΈ сСтями, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ эмулятор запускаСтся Π½Π° ΠΎΠ΄Π½ΠΎΠΉ машинС β€” ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… рСсурсов.

Mininet Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½ ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ BSD Open Source ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ развиваСтся. ВнСсти свой Π²ΠΊΠ»Π°Π΄ ΠΌΠΎΠ³ΡƒΡ‚ всС ΠΆΠ΅Π»Π°ΡŽΡ‰ΠΈΠ΅ β€” ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π΅ΡΡ‚ΡŒ информация Π½Π° ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ сайтС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ.

ns-3

Бимулятор для дискрСтно-событийного модСлирования сСтСй. Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ инструмСнт задумывался ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°, ΠΎΠ΄Π½Π°ΠΊΠΎ сСгодня ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для тСстирования SDN-ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ. Руководства ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с ns-3 Π»Π΅ΠΆΠ°Ρ‚ Π½Π° сайтС с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Π‘Ρ€Π΅Π΄ΠΈ прСимущСств ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ сокСтов ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Pcap для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ инструмСнтами (Π²Ρ€ΠΎΠ΄Π΅ Wireshark), Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‚Π·Ρ‹Π²Ρ‡ΠΈΠ²ΠΎΠ΅ ΠΊΠΎΠΌΡŒΡŽΠ½ΠΈΡ‚ΠΈ.

К нСдостаткам ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ»Π°Π±ΡƒΡŽ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ. Π—Π° ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ‚ΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ NetAnim. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ns-3 ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π½Π΅ всС SDN-ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρ‹.

Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅ Π² нашСм ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌ Π±Π»ΠΎΠ³Π΅:

OpenNet

Π­Ρ‚ΠΎΡ‚ SDN-эмулятор строится Π½Π° Π±Π°Π·Π΅ Π΄Π²ΡƒΡ… ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… инструмСнтов β€” Mininet ΠΈ ns-3. Он ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ ΡΠΈΠ»ΡŒΠ½Ρ‹Π΅ стороны ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ…. Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ вмСстС, OpenNet ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π±Π°ΠΉΠ½Π΄ΠΈΠ½Π³-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π½Π° Python.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Mininet Π² OpenNet ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΡΠΌΡƒΠ»ΡΡ†ΠΈΡŽ OpenFlow-свитчСй, прСдоставлСниС CLI ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ. Π§Ρ‚ΠΎ касаСтся ns-3, Ρ‚ΠΎ ΠΎΠ½ эмулируСт Ρ‚Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅Ρ‚ Π² Mininet. Руководство ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° GitHub.Π’Π°ΠΌ ΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ссылки Π½Π° ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅.

SDN-дайдТСст — ΡˆΠ΅ΡΡ‚ΡŒ эмуляторов с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ
/ PxHere / PD

Containernet

Π­Ρ‚ΠΎ β€” Ρ„ΠΎΡ€ΠΊ Mininet для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Docker-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚ Π² качСствС хостов Π² эмулированных сСтях. РСшСниС создавалось, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹ΠΌΠΈ, ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΉΠ½Ρ‹ΠΌΠΈ, Ρ‚ΡƒΠΌΠ°Π½Π½Ρ‹ΠΌΠΈ вычислСниями ΠΈ NFV. БистСму ΡƒΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ»ΠΈ Π°Π²Ρ‚ΠΎΡ€Ρ‹ SONATA NFV для создания систСмы оркСстровки Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… 5G-сСтях. Containernet выступил ядром ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ эмуляции NFV.

Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Containernet ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π³Π°ΠΉΠ΄Π° Π½Π° GitHub.

Tinynet

ЛСгковСсная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, которая ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹ SDN-сСтСй. API-инструмСнт, написанный Π½Π° Go, позволяСт ΡΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ ΡΠ΅Ρ‚Π΅Π²ΡƒΡŽ Ρ‚ΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΡŽ. Π‘Π°ΠΌΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° «вСсит» ΠΌΠ°Π»ΠΎ, Π·Π° счСт Ρ‡Π΅Π³ΠΎ устанавливаСтся ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ быстрСС Π°Π½Π°Π»ΠΎΠ³ΠΎΠ². Π’Π°ΠΊΠΆΠ΅ Tinynet ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с Docker-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌΠΈ.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для эмуляции ΠΌΠ°ΡΡˆΡ‚Π°Π±Π½Ρ‹Ρ… сСтСй ΠΈΠ·-Π·Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Но пригодится ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ Π½Π°Π΄ нСбольшими Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΈΠ»ΠΈ быстрого прототипирования.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для установки Tinynet доступны Π² GitHub-Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ.

MaxiNet

Π­Ρ‚ΠΎΡ‚ инструмСнт Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Mininet Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… физичСских ΠΌΠ°ΡˆΠΈΠ½Π°Ρ… ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΌΠ°ΡΡˆΡ‚Π°Π±Π½Ρ‹ΠΌΠΈ SDN-сСтями. КаТдая ΠΈΠ· машин β€” Workers β€” запускаСт Mininet ΠΈ эмулируСт свою Ρ‡Π°ΡΡ‚ΡŒ ΠΎΠ±Ρ‰Π΅ΠΉ сСти. Π‘Π²ΠΈΡ‚Ρ‡ΠΈ ΠΈ хосты ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ GRE-Ρ‚ΡƒΠ½Π½Π΅Π»Π΅ΠΉ. Для управлСния ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ Ρ‚Π°ΠΊΠΎΠΉ сСти MaxiNet прСдоставляСт API.

MaxiNet ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ быстро ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сСти ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ распрСдСлСниС рСсурсов. Π’Π°ΠΊΠΆΠ΅ Π² MaxiNet Π΅ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°, встроСнный CLI ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ с Docker. Однако инструмСнт Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ ΡΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ свитча для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… машин.

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π΅ΡΡ‚ΡŒ Π½Π° GitHub. Π“Π°ΠΉΠ΄ ΠΏΠΎ установкС ΠΈ руководство для быстрого старта ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ страницС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅ Π² нашСм ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌ Π±Π»ΠΎΠ³Π΅:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com