Ngôn ngữ lập trình P4

Ngôn ngữ lập trình P4
P4 là ngôn ngữ lập trình được thiết kế để lập trình các quy tắc định tuyến gói. Không giống như ngôn ngữ có mục đích chung như C hay Python, P4 là ngôn ngữ dành riêng cho miền với một số thiết kế được tối ưu hóa cho định tuyến mạng.

P4 là ngôn ngữ nguồn mở được cấp phép và duy trì bởi một tổ chức phi lợi nhuận có tên là Hiệp hội Ngôn ngữ P4. Nó cũng được hỗ trợ bởi Open Networking Foundation (ONF) và Linux Foundation (LF), hai trong số các tổ chức bảo trợ lớn nhất cho các dự án mạng nguồn mở.
Ngôn ngữ này ban đầu được tạo ra vào năm 2013 và được mô tả trong một bài báo SIGCOMM CCR năm 2014 có tựa đề “Lập trình bộ xử lý định tuyến gói, độc lập với giao thức”.

Kể từ khi ra đời, P4 đã phát triển và phát triển theo cấp số nhân, nhanh chóng trở thành tiêu chuẩn để mô tả việc truyền gói tin bằng các thiết bị mạng, bao gồm bộ điều hợp mạng, bộ chuyển mạch và bộ định tuyến.

Guru Parulkar, giám đốc điều hành của Open Networking Foundation cho biết: “SDN đã chuyển đổi ngành công nghiệp mạng và P4 đưa SDN lên một tầm cao mới bằng cách đưa khả năng lập trình vào định tuyến”.

Ngôn ngữ P4 ban đầu được tạo ra bởi một nhóm kỹ sư và nhà nghiên cứu từ Google, Intel, Microsoft Research, Barefoot, Princeton và Stanford. Mục tiêu rất đơn giản: tạo ra một ngôn ngữ dễ sử dụng mà nhà phát triển phần mềm có thể học trong một ngày và sử dụng để mô tả chính xác cách các gói được gửi qua mạng.

Ngay từ đầu, P4 đã được thiết kế để độc lập với mục tiêu (tức là một chương trình viết bằng P4 có thể được biên dịch không thay đổi để chạy trên nhiều mục tiêu khác nhau như ASIC, FPGA, CPU, NPU và GPU).

Ngôn ngữ này cũng độc lập với giao thức (tức là chương trình P4 có thể mô tả các giao thức tiêu chuẩn hiện có hoặc được sử dụng để chỉ định các chế độ địa chỉ tùy chỉnh mới).

Trong công nghiệp, P4 được sử dụng để lập trình thiết bị. Có lẽ trong tương lai các tiêu chuẩn Internet-RFC và IEEE cũng sẽ bao gồm đặc tả P4.

P4 có thể được sử dụng cho cả thiết bị có chức năng cố định và lập trình. Ví dụ: nó được sử dụng để ghi lại chính xác hành vi của đường dẫn chuyển đổi trong API Giao diện trừu tượng chuyển đổi (SAI) được hệ điều hành chuyển đổi SONiC nguồn mở sử dụng. P4 cũng được sử dụng trong dự án ONF Stratum để mô tả hành vi chuyển mạch trên nhiều thiết bị cố định và lập trình được.

Lần đầu tiên, việc mô tả hành vi của bộ chuyển mạch và bộ điều hợp mạng cho phép bạn tạo mô hình thực thi chính xác của toàn bộ mạng trước khi triển khai. Các nhà cung cấp đám mây lớn có thể kiểm tra và gỡ lỗi mạng hoàn toàn bằng phần mềm, giảm đáng kể thời gian và chi phí kiểm tra khả năng tương tác trong phòng thí nghiệm mà không yêu cầu phần cứng đắt tiền.

Bằng cách sử dụng P4, các nhà cung cấp thiết bị mạng có thể mong đợi hành vi định tuyến cơ bản chung trên tất cả các sản phẩm, cho phép tái sử dụng cơ sở hạ tầng thử nghiệm, đơn giản hóa việc phát triển phần mềm quản lý và cuối cùng là đảm bảo khả năng tương tác.

Tất nhiên, P4 có thể được sử dụng để viết các chương trình mô tả các cách định tuyến hoàn toàn mới. Ví dụ, P4 được sử dụng rộng rãi để đo lường và đo từ xa trong các trung tâm dữ liệu, mạng doanh nghiệp và nhà cung cấp dịch vụ.

Cộng đồng nghiên cứu cũng đã tăng cường. Một số nhóm nghiên cứu mạng học thuật hàng đầu đã xuất bản các ứng dụng mới thú vị dựa trên các chương trình P4, bao gồm cân bằng tải, giao thức đồng thuận và bộ nhớ đệm giá trị chính. Một mô hình lập trình mới đang được tạo ra, sự đổi mới đang chuyển từ phần cứng sang phần mềm, cho phép xuất hiện nhiều ý tưởng bất ngờ, mới mẻ và khéo léo.

Cộng đồng nhà phát triển đã có những đóng góp đáng kể cho việc phát triển mã, bao gồm trình biên dịch, quy trình, mô hình hành vi, API, khung kiểm tra, ứng dụng, v.v. Các công ty như Alibaba, AT&T, Barefoot, Cisco, Fox Networks, Google, Intel, IXIA, Juniper Networks, Mellanox, Microsoft, Netcope, Netronome, VMware, Xilinx và ZTE đều có các nhà phát triển tận tâm; từ các trường đại học bao gồm BUPT, Cornell, Harvard, MIT, NCTU, Princeton, Stanford, Technion, Tsinghua, UMass và USI; và các dự án nguồn mở bao gồm CORD, FD.io, OpenDaylight, ONOS, OvS, SAI và Stratum nêu bật thực tế rằng P4 là một dự án cộng đồng độc lập.

Thế hệ bộ điều khiển điển hình cho ngôn ngữ P4:

Ngôn ngữ lập trình P4

triển vọng ứng dụng

Ngôn ngữ lập trình P4
Vì ngôn ngữ này dành cho việc định tuyến các ứng dụng nên danh sách các yêu cầu và tùy chọn thiết kế sẽ khác so với các ngôn ngữ lập trình có mục đích chung. Các tính năng chính của ngôn ngữ là:

  1. Độc lập với việc thực hiện mục tiêu;
  2. Tính độc lập của (các) giao thức được sử dụng;
  3. Khả năng cấu hình lại trường.

Độc lập với việc thực hiện mục tiêu

Các chương trình P4 được thiết kế để triển khai độc lập, nghĩa là chúng có thể được biên dịch cho nhiều loại công cụ thực thi khác nhau, chẳng hạn như bộ xử lý đa năng, FPGA, hệ thống trên chip, bộ xử lý mạng và ASIC. Các loại máy khác nhau này được gọi là mục tiêu P4 và mỗi mục tiêu yêu cầu một trình biên dịch để chuyển đổi mã nguồn P4 thành mô hình chuyển đổi mục tiêu. Trình biên dịch có thể được tích hợp vào thiết bị đích, phần mềm bên ngoài hoặc thậm chí là dịch vụ đám mây. Bởi vì nhiều mục tiêu ban đầu của các chương trình P4 là dành cho chuyển mạch gói đơn giản nên người ta thường nghe thuật ngữ "chuyển mạch P4" mặc dù "mục tiêu P4" chính xác hơn.

Tính độc lập của (các) giao thức được sử dụng

P4 là giao thức độc lập. Điều này có nghĩa là ngôn ngữ này không có hỗ trợ riêng cho các giao thức phổ biến như IP, Ethernet, TCP, VxLAN hoặc MPLS. Thay vào đó, lập trình viên P4 mô tả các định dạng tiêu đề và tên trường của các giao thức được yêu cầu trong chương trình, sau đó được chương trình biên dịch và thiết bị đích giải thích và xử lý.

Khả năng cấu hình lại trường

Mô hình ngôn ngữ trừu tượng và độc lập về giao thức cho phép cấu hình lại—các mục tiêu P4 sẽ có thể thay đổi quá trình xử lý gói sau khi hệ thống được triển khai. Khả năng này theo truyền thống được liên kết với việc định tuyến thông qua các bộ xử lý đa năng hoặc bộ xử lý mạng thay vì các mạch tích hợp chức năng cố định.

Mặc dù không có gì trong ngôn ngữ có thể ngăn cản việc tối ưu hóa hiệu suất của một bộ giao thức cụ thể, nhưng những tối ưu hóa này là vô hình đối với tác giả ngôn ngữ và cuối cùng có thể làm giảm tính linh hoạt của hệ thống và các mục tiêu cũng như khả năng cấu hình lại của chúng.

Những đặc điểm này của ngôn ngữ ban đầu được đặt ra bởi những người tạo ra nó với trọng tâm là việc sử dụng rộng rãi nó trong cơ sở hạ tầng mạng.

Ngôn ngữ này đã được sử dụng ở nhiều công ty:

1) Trung tâm dữ liệu siêu quy mô;

Công ty Tencent của Trung Quốc là công ty đầu tư lớn nhất thế giới và là một trong những công ty đầu tư mạo hiểm lớn nhất. Các công ty con của Tencent, cả ở Trung Quốc và các nước khác trên thế giới, chuyên về nhiều lĩnh vực kinh doanh công nghệ cao, bao gồm các dịch vụ Internet khác nhau, phát triển trong lĩnh vực trí tuệ nhân tạo và giải trí điện tử.

P4 và định tuyến có thể lập trình là những công nghệ tiên tiến được sử dụng trong kiến ​​trúc mạng của công ty.

Là một trong những người khởi xướng, Google tự hào ghi nhận việc áp dụng nhanh chóng P4 trong ngành mạng và đặc biệt là trong thiết kế kiến ​​trúc trung tâm dữ liệu.

2) Công ty thương mại;

Goldman Sachs tận dụng lợi thế làm việc với cộng đồng nguồn mở và phát triển các tiêu chuẩn, giải pháp chung để đổi mới cơ sở hạ tầng mạng và cung cấp giải pháp tốt hơn cho khách hàng.

3) Sản xuất;

Toàn bộ ngành công nghiệp mạng sẽ được hưởng lợi từ một ngôn ngữ như P4 xác định hành vi chuyển tiếp duy nhất. Cisco cũng tin tưởng vào việc chuyển các dòng sản phẩm của mình sang sử dụng ngôn ngữ này.

Juniper Networks đã đưa P4 và P4 Runtime vào một số sản phẩm, đồng thời cung cấp quyền truy cập theo chương trình vào bộ xử lý nhúng Juniper và mã phần mềm của nó.

Ruijie Networks là người ủng hộ mạnh mẽ P4 và những lợi ích mà nó mang lại cho mạng. Với P4, công ty có thể tạo và cung cấp các giải pháp tốt nhất cho nhiều đối tượng khách hàng.

4) Nhà cung cấp dịch vụ viễn thông;

AT&T là công ty đầu tiên áp dụng P4, một trong những công ty đầu tiên sử dụng P4 để xác định hành vi mà họ muốn thấy trong mạng của mình và sử dụng các thiết bị chuyển tiếp có thể lập trình P4 trên mạng của mình.

Tại Deutsche Telekom, ngôn ngữ này được sử dụng để tạo nguyên mẫu cho các chức năng mạng chính như một phần của chương trình Access 4.0.

5) Công nghiệp bán dẫn;

Ngôn ngữ này đã cho phép Barefoot triển khai một mô hình mới để cung cấp các khả năng phần mềm cho mặt phẳng định tuyến mạng.

Xilinx là một trong những người sáng lập P4.org và đã tích cực tham gia vào việc phát triển ngôn ngữ P4 và triển khai nó trên các nền tảng lập trình dựa trên FPGA cho phần cứng SmartNIC và NFV, phát hành một trong những trình biên dịch P416 đầu tiên như một phần của thiết kế SDNet.

6) Phần mềm.

VMware tin rằng P4 tạo ra nguồn năng lượng, sự đổi mới và cộng đồng to lớn đang thúc đẩy sự chuyển đổi có ý nghĩa và cần thiết trong mạng. VMware đã là một phần của phong trào ngành này ngay từ đầu, khi làn sóng đổi mới mới được thúc đẩy bởi các phương pháp tiếp cận dựa trên phần mềm nhằm mở rộng khả năng của cơ sở hạ tầng và triển khai nó trong các sản phẩm mới nhất.

Do đó, P4 là ngôn ngữ lập trình không phụ thuộc vào mục tiêu và giao thức, được ngành công nghiệp và giới học thuật sử dụng để xác định duy nhất hành vi định tuyến gói như một chương trình, do đó có thể được biên dịch cho nhiều mục tiêu. Ngày nay, các mục tiêu bao gồm các bộ chuyển mạch phần cứng và phần mềm, bộ chuyển mạch ảo hóa, NPU, GPU, FPGA, SmartNIC và ASIC.

Các tính năng chính của ngôn ngữ mở rộng đáng kể phạm vi ứng dụng của nó và đảm bảo triển khai nhanh chóng trong kiến ​​trúc mạng.

Bắt đầu từ đâu

P4 là dự án mở, mọi thông tin liên quan đều có trên website P4.org

Liên kết kho lưu trữ https://github.com/p4lang, nơi bạn có thể lấy mã nguồn mẫu và hướng dẫn.

Cắm vào dành cho Eclipse có hỗ trợ P4, nhưng chúng tôi có thể khuyến nghị Studio P4 từ chân trần.

Ngôn ngữ lập trình P4

Chúng ta hãy nhìn vào sự trừu tượng chính của kernel:

Xác định tiêu đề — với sự trợ giúp của họ, các tiêu đề giao thức được xác định.

Định nghĩa tiêu đề chỉ định:

  • mô tả định dạng gói và tên trường tiêu đề
  • các trường được phép cố định và thay đổi

Ví dụ

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;
}

Trình phân tích cú pháp - nhiệm vụ của họ là phân tích các tiêu đề.

Ví dụ về trình phân tích cú pháp sau đây sẽ xác định sự chuyển đổi trạng thái cuối cùng của máy từ một trạng thái ban đầu sang một trong hai trạng thái cuối cùng:

Ngôn ngữ lập trình 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;
        }
    }…
}

Những cái bàn - chứa trạng thái máy liên kết khóa người dùng với hành động. Hoạt động - mô tả cách xử lý gói.

Các bảng chứa các trạng thái (được xác định ở cấp quản lý) để chuyển tiếp gói, mô tả đơn vị Match-Action

Các gói được khớp bởi:

  • Kết hợp chuẩn xác
  • Trận đấu tiền tố dài nhất (LPM)
  • Kết hợp ba (mặt nạ)

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

Tất cả các hành động có thể xảy ra phải được xác định trước trong bảng.

Các hành động bao gồm mã và dữ liệu. Dữ liệu đến từ cấp quản lý (ví dụ: địa chỉ IP/số cổng). Một số nguyên hàm nhất định, không có vòng lặp có thể được chỉ định trực tiếp trong hành động, nhưng số lượng lệnh phải có thể dự đoán được. Do đó, các hành động không thể chứa bất kỳ vòng lặp hoặc câu lệnh điều kiện nào.

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;
}

Mô-đun khớp hành động — các hành động để tạo khóa tìm kiếm, tìm kiếm trong bảng, thực hiện các hành động.

Một ví dụ điển hình của mô-đun được hiển thị trong hình:

Ngôn ngữ lập trình P4

Kiểm soát dòng chảy — cho biết thứ tự sử dụng các mô-đun Match-Action. Đây là một chương trình bắt buộc xác định logic cấp cao và trình tự Trận đấu-Hành động. Luồng điều khiển liên kết tất cả các đối tượng bằng cách xác định mức độ điều khiển.

Vật thể bên ngoài là các đối tượng cụ thể có kiến ​​trúc và giao diện API được xác định rõ ràng. Ví dụ: tính toán tổng kiểm tra, thanh ghi, bộ đếm, bộ đếm, v.v.

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
}

metadata - cấu trúc dữ liệu liên quan đến mỗi gói.

Có 2 loại siêu dữ liệu:

  Siêu dữ liệu tùy chỉnh (cấu trúc trống cho tất cả các gói)
    Bạn có thể đặt bất cứ điều gì bạn muốn ở đây
    Có sẵn trên toàn bộ đường ống
    thuận tiện để sử dụng cho mục đích riêng của bạn, ví dụ: để lưu trữ gói băm

  Siêu dữ liệu nội bộ - được cung cấp bởi kiến ​​trúc
    Cổng đầu vào, cổng đầu ra được xác định ở đây
    Dấu thời gian khi gói được xếp hàng đợi, độ sâu hàng đợi
    băm multicast/hàng đợi multicast
    Ưu tiên gói, tầm quan trọng của gói
    Đặc tả cổng đầu ra (ví dụ: hàng đợi đầu ra)

Trình biên dịch P4

Trình biên dịch P4 (P4C) tạo ra:

  1. Thời gian chạy mặt phẳng dữ liệu
  2. API để quản lý trạng thái máy trong mặt phẳng dữ liệu

Ngôn ngữ lập trình P4

Ví dụ về chuyển đổi phần mềm trong ngôn ngữ P4

Mã nguồn có thể được tải xuống từ kho lưu trữ.

p4lang/p4c-bm: tạo cấu hình JSON cho bmv2
p4lang/bmv2: một phần mềm chuyển đổi hiểu cấu hình JSON của phiên bản bmv2

Hình vẽ thể hiện sơ đồ biên soạn dự án:

Ngôn ngữ lập trình P4

Các thao tác với bảng, thanh ghi đọc, bộ đếm:

  • 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>


Mã nguồn chứa chương trình simple_switch_CLI để sử dụng API chuyển đổi phần mềm một cách thuận tiện.

Bạn có thể tải xuống ví dụ này và các ví dụ khác từ kho lưu trữ.

Ngôn ngữ lập trình P4

PS Đầu mùa hè này, Intel đã ký thỏa thuận mua lại Barefoot Networks trong nỗ lực đáp ứng nhanh chóng nhu cầu của người dùng Hyperscale Cloud. Như Navin Shenoy (phó chủ tịch điều hành kiêm tổng giám đốc Nhóm Trung tâm Dữ liệu tại Tập đoàn Intel) cho biết, điều này sẽ cho phép Intel cung cấp khối lượng công việc lớn hơn và nhiều cơ hội hơn cho khách hàng của trung tâm dữ liệu.

Theo ý kiến ​​​​cá nhân của tôi, chúng ta không nên quên rằng Intel là công ty dẫn đầu trong việc sản xuất chip FPGA và nó có môi trường Quartus tuyệt vời. Điều này có nghĩa là chúng ta có thể mong đợi rằng với sự xuất hiện của Intel, Barefoot sẽ không chỉ mở rộng dòng sản phẩm của mình mà Quartus và P4 Studio sẽ nhận được những bản cập nhật và bổ sung nghiêm túc cho dòng Tffino và Tffino 2.

Thành viên chính thức của cộng đồng P4 - công ty Nhóm yếu tố.

Nguồn: www.habr.com

Thêm một lời nhận xét