زبان برنامه نویسی P4

زبان برنامه نویسی P4
P4 یک زبان برنامه نویسی است که برای برنامه نویسی قوانین مسیریابی بسته ها طراحی شده است. برخلاف زبان های همه منظوره مانند C یا Python، P4 یک زبان دامنه خاص با تعدادی طرح بهینه شده برای مسیریابی شبکه است.

P4 یک زبان متن باز است که توسط یک سازمان غیرانتفاعی به نام کنسرسیوم زبان P4 مجوز و نگهداری می شود. همچنین توسط بنیاد شبکه‌های باز (ONF) و بنیاد لینوکس (LF)، دو تا از بزرگترین سازمان‌های چتر برای پروژه‌های شبکه‌های منبع باز پشتیبانی می‌شود.
این زبان در ابتدا در سال 2013 ابداع شد و در مقاله SIGCOMM CCR در سال 2014 با عنوان "برنامه‌نویسی پردازشگر مسیریابی بسته، مستقل از پروتکل" توضیح داده شد.

از زمان پیدایش، P4 به طور تصاعدی رشد و تکامل یافته است و به سرعت به استانداردی برای توصیف انتقال بسته ها توسط دستگاه های شبکه، از جمله آداپتورهای شبکه، سوئیچ ها و روترها تبدیل شده است.

گورو پارولکار، مدیر اجرایی بنیاد شبکه‌های باز، گفت: «SDN صنعت شبکه‌سازی را متحول کرده است و P4 SDN را با آوردن قابلیت برنامه‌ریزی به مسیریابی به سطح بعدی می‌برد.

زبان P4 در ابتدا توسط گروهی از مهندسان و محققان از گوگل، اینتل، مایکروسافت ریسرچ، پابرهنه، پرینستون و استنفورد ساخته شد. هدف ساده بود: ایجاد زبانی با کاربرد آسان که یک توسعه‌دهنده نرم‌افزار می‌تواند در یک روز یاد بگیرد و از آن برای توصیف دقیق نحوه ارسال بسته‌ها در شبکه‌ها استفاده کند.

از همان ابتدا، P4 به گونه‌ای طراحی شده بود که مستقل از هدف باشد (یعنی برنامه‌ای که در P4 نوشته شده است می‌تواند بدون تغییر برای اجرا روی اهداف مختلفی مانند ASIC، FPGA، CPU، NPU و GPU کامپایل شود).

این زبان همچنین مستقل از پروتکل است (به عنوان مثال، یک برنامه P4 می تواند پروتکل های استاندارد موجود را توصیف کند یا برای تعیین حالت های آدرس دهی سفارشی جدید استفاده شود).

در صنعت، P4 برای برنامه نویسی دستگاه استفاده می شود. شاید در آینده استانداردهای Internet-RFC و IEEE شامل مشخصات P4 نیز باشند.

P4 را می توان هم برای دستگاه های قابل برنامه ریزی و هم برای دستگاه های عملکرد ثابت استفاده کرد. به عنوان مثال، برای ثبت دقیق رفتار خط لوله سوئیچ در APIهای Switch Abstraction Interface (SAI) که توسط سیستم عامل سوئیچ منبع باز SONiC استفاده می شود، استفاده می شود. P4 همچنین در پروژه ONF Stratum برای توصیف رفتار سوئیچینگ در انواع دستگاه های ثابت و قابل برنامه ریزی استفاده می شود.

برای اولین بار، توصیف رفتار سوئیچ و آداپتورهای شبکه به شما امکان می دهد قبل از استقرار یک مدل اجرایی دقیق از کل شبکه ایجاد کنید. ارائه دهندگان ابر بزرگ می توانند شبکه را به طور کامل با استفاده از نرم افزار آزمایش و اشکال زدایی کنند و زمان و هزینه آزمایش قابلیت همکاری در آزمایشگاه را بدون نیاز به سخت افزار گران قیمت به میزان قابل توجهی کاهش دهند.

با استفاده از P4، فروشندگان تجهیزات شبکه می‌توانند رفتار مسیریابی زیربنایی مشترک را در همه محصولات انتظار داشته باشند که امکان استفاده مجدد از زیرساخت آزمایشی، ساده‌سازی توسعه نرم‌افزار مدیریت و در نهایت اطمینان از قابلیت همکاری را فراهم می‌آورد.

البته از P4 می توان برای نوشتن برنامه هایی استفاده کرد که روش های کاملا جدید مسیریابی را توصیف می کنند. به عنوان مثال، P4 به طور گسترده برای تله متری و اندازه گیری در مراکز داده، شبکه های سازمانی و ارائه دهنده خدمات استفاده می شود.

جامعه پژوهشی نیز قدم برداشته است. چندین گروه تحقیقاتی پیشرو دانشگاهی در زمینه شبکه، برنامه های کاربردی جدید و هیجان انگیزی را بر اساس برنامه های P4 منتشر کرده اند، از جمله تعادل بار، پروتکل های اجماع، و ذخیره مقادیر کلیدی. یک الگوی برنامه نویسی جدید در حال ایجاد است، نوآوری از سخت افزار به نرم افزار در حال حرکت است و به بسیاری از ایده های غیر منتظره، جدید و مبتکرانه اجازه ظهور می دهد.

جامعه توسعه‌دهنده کمک‌های قابل توجهی به توسعه کد کرده است، از جمله کامپایلرها، خطوط لوله، مدل‌های رفتاری، APIها، چارچوب‌های آزمایشی، برنامه‌ها و موارد دیگر. شرکت هایی مانند Alibaba، AT&T، Barefoot، Cisco، Fox Networks، Google، Intel، IXIA، Juniper Networks، Mellanox، Microsoft، Netcope، Netronome، VMware، Xilinx، و ZTE توسعه دهندگان اختصاصی دارند. از دانشگاه هایی از جمله BUPT، Cornell، Harvard، MIT، NCTU، Princeton، Stanford، Technion، Tsinghua، UMass و USI. و پروژه‌های منبع باز از جمله CORD، FD.io، OpenDaylight، ONOS، OvS، SAI و Stratum این واقعیت را برجسته می‌کنند که P4 یک پروژه اجتماعی مستقل است.

تولید معمولی کنترلرها برای زبان P4:

زبان برنامه نویسی P4

چشم انداز برنامه

زبان برنامه نویسی P4
از آنجایی که این زبان برای مسیریابی برنامه های کاربردی در نظر گرفته شده است، لیست الزامات و گزینه های طراحی در مقایسه با زبان های برنامه نویسی همه منظوره متفاوت است. ویژگی های اصلی زبان عبارتند از:

  1. استقلال از اجرای هدف؛
  2. استقلال پروتکل(های) مورد استفاده؛
  3. قابلیت پیکربندی مجدد میدان

استقلال از اجرای هدف

برنامه‌های P4 به گونه‌ای طراحی شده‌اند که مستقل از پیاده‌سازی باشند، به این معنی که می‌توان آن‌ها را برای انواع مختلفی از موتورهای اجرایی مانند پردازنده‌های همه منظوره، FPGA، سیستم روی تراشه، پردازنده‌های شبکه و ASIC کامپایل کرد. این انواع مختلف ماشین ها به عنوان اهداف P4 شناخته می شوند و هر هدف به یک کامپایلر برای تبدیل کد منبع P4 به مدل سوئیچ هدف نیاز دارد. کامپایلر را می توان در دستگاه هدف، نرم افزار خارجی یا حتی یک سرویس ابری تعبیه کرد. از آنجایی که بسیاری از اهداف اولیه برای برنامه های P4 برای سوئیچینگ بسته ساده بود، شنیدن عبارت "سوئیچ P4" بسیار رایج است حتی اگر "P4 target" دقیق تر است.

استقلال پروتکل(های) مورد استفاده

P4 مستقل از پروتکل است. این بدان معنی است که این زبان از پروتکل های رایج مانند IP، Ethernet، TCP، VxLAN یا MPLS پشتیبانی نمی کند. در عوض، برنامه نویس P4 فرمت های هدر و نام فیلدهای پروتکل های مورد نیاز در برنامه را توصیف می کند که به نوبه خود توسط برنامه کامپایل شده و دستگاه هدف تفسیر و پردازش می شوند.

قابلیت پیکربندی مجدد میدان

استقلال پروتکل و مدل زبان انتزاعی امکان پیکربندی مجدد را فراهم می کند - اهداف P4 باید بتوانند پردازش بسته را پس از استقرار سیستم تغییر دهند. این قابلیت به طور سنتی با مسیریابی از طریق پردازنده های همه منظوره یا پردازنده های شبکه به جای مدارهای مجتمع با عملکرد ثابت همراه بوده است.

اگرچه هیچ چیزی در زبان وجود ندارد که مانع بهینه سازی عملکرد یک مجموعه خاص از پروتکل ها شود، این بهینه سازی ها برای نویسنده زبان نامرئی هستند و در نهایت می توانند انعطاف پذیری سیستم و اهداف و پیکربندی مجدد آنها را کاهش دهند.

این ویژگی های زبان در ابتدا توسط سازندگان آن با تمرکز بر استفاده گسترده آن در زیرساخت شبکه تعیین شد.

این زبان قبلاً در بسیاری از شرکت ها استفاده می شود:

1) مراکز داده فرامقیاس؛

شرکت چینی تنسنت بزرگترین شرکت سرمایه گذاری در جهان و یکی از بزرگترین شرکت های سرمایه گذاری خطرپذیر است. زیرمجموعه های تنسنت، چه در چین و چه در کشورهای دیگر در سراسر جهان، در زمینه های مختلف تجارت با فناوری پیشرفته، از جمله خدمات مختلف اینترنتی، تحولات در زمینه هوش مصنوعی و سرگرمی های الکترونیکی تخصص دارند.

P4 و مسیریابی قابل برنامه ریزی فناوری های پیشرفته ای هستند که در معماری شبکه این شرکت استفاده می شوند.

به عنوان یکی از مبتکران، گوگل مفتخر است که به پذیرش سریع P4 در صنعت شبکه و به ویژه در طراحی معماری مراکز داده اشاره می کند.

2) شرکت های تجاری؛

گلدمن ساکس از همکاری با جامعه منبع باز و توسعه استانداردها و راه حل های مشترک برای نوآوری زیرساخت شبکه و ارائه راه حل های بهتر برای مشتریان بهره می برد.

3) تولید؛

کل صنعت شبکه از زبانی مانند P4 که رفتار حمل و نقل منحصر به فرد را تعریف می کند، سود می برد. سیسکو نیز به انتقال خطوط تولید خود به استفاده از این زبان معتقد است.

Juniper Networks Runtime P4 و P4 را در تعدادی از محصولات گنجانده است و دسترسی برنامه‌ای به پردازنده جاسازی شده Juniper و کد نرم‌افزار آن را فراهم می‌کند.

Ruijie Networks حامی قوی P4 و مزایایی است که برای شبکه ها به ارمغان می آورد. با P4، این شرکت می تواند بهترین راه حل ها را در کلاس خود ایجاد و به طیف وسیعی از مشتریان ارائه دهد.

4) ارائه دهندگان مخابرات؛

AT&T اولین پذیرنده P4 بود، یکی از اولین کسانی بود که از P4 برای تعریف رفتاری که می‌خواست در شبکه‌های خود ببیند و از دستگاه‌های ارسال قابل برنامه‌ریزی P4 در شبکه خود استفاده کرد.

در Deutsche Telekom، این زبان برای نمونه سازی اولیه عملکردهای کلیدی شبکه به عنوان بخشی از برنامه Access 4.0 استفاده می شود.

5) صنعت نیمه هادی.

این زبان پابرهنه را قادر می سازد تا الگوی جدیدی را برای ارائه قابلیت های نرم افزاری به صفحه مسیریابی شبکه پیاده سازی کند.

Xilinx یکی از بنیانگذاران P4.org بود و فعالانه در توسعه زبان P4 شرکت داشت و آن را در پلتفرم های قابل برنامه ریزی مبتنی بر FPGA برای سخت افزار SmartNIC و NFV پیاده سازی کرد و یکی از اولین کامپایلرهای P416 را به عنوان بخشی از طراحی SDNet منتشر کرد.

6) نرم افزار

VMware معتقد است که P4 انرژی، نوآوری و جامعه فوق العاده ای ایجاد می کند که باعث ایجاد تحول معنادار و ضروری در شبکه می شود. VMware از ابتدا بخشی از این جنبش صنعتی بوده است، زیرا موج جدیدی از نوآوری توسط رویکردهای مبتنی بر نرم افزار هدایت می شود که قابلیت های زیرساخت را گسترش داده و آن را در جدیدترین محصولات پیاده سازی می کند.

بنابراین، P4 یک زبان برنامه نویسی مستقل از هدف و مستقل از پروتکل است که توسط صنعت و دانشگاه برای تعریف منحصر به فرد رفتار مسیریابی بسته به عنوان یک برنامه استفاده می شود که به نوبه خود می تواند برای چندین هدف کامپایل شود. امروزه اهداف شامل سوئیچ های سخت افزاری و نرم افزاری، سوئیچ هایپروایزر، NPU، GPU، FPGA، SmartNIC و ASIC می باشد.

ویژگی های اصلی زبان به طور قابل توجهی دامنه کاربرد آن را گسترش می دهد و اجرای سریع آن را در معماری شبکه تضمین می کند.

شروع

P4 یک پروژه باز است، تمام اطلاعات مربوطه در وب سایت موجود است P4.org

لینک مخزن https://github.com/p4lang، جایی که می توانید نمونه کد منبع و آموزش ها را دریافت کنید.

پلاگین برای Eclipse با پشتیبانی از P4، اما ما می توانیم توصیه کنیم P4 Studio از پابرهنه

زبان برنامه نویسی P4

بیایید به انتزاعات اصلی هسته نگاه کنیم:

تعریف سرصفحه ها - با کمک آنها، هدرهای پروتکل تعیین می شود.

تعریف هدر مشخص می کند:

  • شرح فرمت های بسته و نام فیلدهای سرصفحه
  • فیلدهای مجاز ثابت و متغیر

مثلا

header Ethernet_h{
    bit<48>  dstAddr;
    bit<48>  srcAddr;
    bit<16>  etherType;
}

header IPv4_h{
    bit<4>  version;
    bit<4>  ihl;
    bit<8>  diffserv;
    bit<16>  totalLen;
    bit<16>  identification;
    bit<3>  flags;
    bit<13>  fragOffset;
    bit<8>  ttl;
    bit<8>  protocol;
    bit<16>  hdrChecksum;
    bit<32>  srcAddr;
    bit<32>  dstAddr;
    varbit<320>  options;
}

تجزیه کننده ها - وظیفه آنها تجزیه سرفصل ها است.

مثال تجزیه کننده زیر انتقال وضعیت نهایی ماشین را از یک حالت اولیه به یکی از دو حالت نهایی تعیین می کند:

زبان برنامه نویسی P4

parser MyParser(){
 state  start{transition parse_ethernet;}
 state  parse_ethernet{
    packet.extract(hdr.ethernet);
    transition select(hdr.ethernet.etherType){
        TYPE_IPV4: parse_ipv4;
        default: accept;
        }
    }…
}

جداول - شامل حالات ماشینی است که کلیدهای کاربر را با اقدامات مرتبط می کند. فعالیت - شرح نحوه دستکاری بسته.

جداول شامل حالات (تعریف شده در سطح مدیریت) برای ارسال بسته است، واحد Match-Action را توصیف می کند.

بسته ها با موارد زیر مطابقت دارند:

  • مطابقت کامل
  • طولانی ترین تطابق پیشوند (LPM)
  • تطبیق سه گانه (نقاب)

table ipv4_lpm{
    reads{
        ipv4.dstAddr: lpm;
    } actions {
        forward();
    }
}

تمام اقدامات ممکن باید از قبل در جداول تعریف شوند.

اقدامات شامل کد و داده است. داده ها از سطح مدیریت می آیند (به عنوان مثال آدرس های IP / شماره پورت). برخی از اولیه‌های بدون حلقه را می‌توان مستقیماً در عمل مشخص کرد، اما تعداد دستورالعمل‌ها باید قابل پیش‌بینی باشد. بنابراین، اکشن ها نمی توانند حاوی هیچ حلقه یا عبارت شرطی باشند.

action ipv4_forward(macAddr_t dstAddr, egressSpec_t port){
    standard_metadata.egress_spec = port;
    hdr.ethernet.srcAddr = hdr.ethernet.dstAddr;
    hdr.ethernet.dstAddr = dstAddr;
    hdr.ipv4.ttl = hdr.ipv4.ttl - 1;
}

ماژول های Match-Action - اقدامات برای ایجاد کلید جستجو، جستجو در جدول، انجام اقدامات.

یک مثال معمولی از یک ماژول در شکل نشان داده شده است:

زبان برنامه نویسی P4

کنترل جریان — ترتیب استفاده از ماژول های Match-Action را نشان می دهد. این یک برنامه ضروری است که منطق سطح بالا و دنباله Match-Action را تعریف می کند. جریان کنترل همه اشیا را با تعریف سطح کنترل به هم پیوند می دهد.

اشیاء خارجی اشیاء خاصی با معماری مشخص و رابط های API هستند. به عنوان مثال، محاسبه جمع کنترل، رجیستر، شمارنده، شمارنده و غیره.

extern register{
    register(bit<32> size);
    void read(out T result, in bit<32> index);
    void write(in bit<32> index, in T value);
}

extern Checksum16{
  Checksum16();    //constructor
  void clear();    //prepare unit for computation
  void update(in T data);    //add data to checksum
  void remove(in T data);  /remove data from existing checksum
  bit<16> get(); //get the checksum for the data added since last clear
}

فراداده - ساختارهای داده مرتبط با هر بسته.

2 نوع ابرداده وجود دارد:

  ابرداده سفارشی (ساختار خالی برای همه بسته ها)
    هر چی میخوای میتونی اینجا بذاری
    در سراسر خط لوله موجود است
    مناسب برای استفاده برای اهداف خود، به عنوان مثال، برای ذخیره سازی هش بسته

  فراداده داخلی - ارائه شده توسط معماری
    پورت ورودی، پورت خروجی در اینجا تعریف شده است
    مهر زمانی زمانی که بسته در صف قرار گرفت، عمق صف
    هش چندپخشی / صف چندپخشی
    اولویت بسته، اهمیت بسته
    مشخصات پورت خروجی (به عنوان مثال صف خروجی)

کامپایلر P4

کامپایلر P4 (P4C) تولید می کند:

  1. زمان اجرا صفحه داده
  2. API برای مدیریت وضعیت ماشین در صفحه داده

زبان برنامه نویسی P4

نمونه ای از سوئیچ نرم افزاری در زبان P4

کدهای منبع را می توان از مخزن دانلود کرد.

p4lang/p4c-bm: پیکربندی JSON را برای bmv2 ایجاد می کند
p4lang/bmv2: یک سوئیچ نرم افزاری که تنظیمات JSON نسخه bmv2 را درک می کند

شکل، نمودار تدوین پروژه را نشان می دهد:

زبان برنامه نویسی P4

دستکاری با جداول، رجیسترهای خواندن، شمارنده:

  • table_set_default <table name> <action name> <action parameters>
  • table_add <table name> <action name> <match fields> => <action
    parameters> [priority]
  • table_delete <table name> <entry handle>


کد منبع حاوی برنامه simple_switch_CLI برای استفاده راحت از API سوئیچ نرم افزار است.

این و نمونه های دیگر را می توانید از مخزن دانلود کنید.

زبان برنامه نویسی P4

PS در اوایل تابستان امسال، اینتل قراردادی برای خرید Barefoot Networks امضا کرد تا بتواند به سرعت نیازهای کاربران Hyperscale Cloud را برآورده کند. همانطور که نوین شنوی (معاون اجرایی و مدیر کل گروه مرکز داده در شرکت اینتل) گفت، این به اینتل اجازه می دهد تا حجم کاری بزرگتر و فرصت های بیشتری را برای مشتریان مرکز داده فراهم کند.

به نظر شخصی من نباید فراموش کنیم که اینتل در تولید تراشه های FPGA پیشرو است و محیط Quartus بسیار خوبی دارد. این بدان معناست که می‌توان انتظار داشت که با ورود اینتل، Barefoot نه تنها خط تولید خود را گسترش دهد، بلکه Quartus و P4 Studio نیز به‌روزرسانی‌ها و افزوده‌های جدی به خط Toffino و Toffino 2 دریافت خواهند کرد.

عضو رسمی انجمن P4 - شرکت گروه فاکتور.

منبع: www.habr.com

اضافه کردن نظر