《開放數據中心委員會:P4可編程應用案例技術白皮書(2021)(47頁).pdf》由會員分享,可在線閱讀,更多相關《開放數據中心委員會:P4可編程應用案例技術白皮書(2021)(47頁).pdf(47頁珍藏版)》請在三個皮匠報告上搜索。
1、P4 可編程應用案例技術白皮書 編號 ODCC-2021-03006 開放數據中心委員會 2021-09-15 發布 ODCC-2021-03006 P4 可編程應用案例技術白皮書 i 目目 錄錄 前 言.ii 版權說明.iv P4 可編程應用案例技術白皮書.1 1.參考資料.1 2.縮略術語.1 2.1.P4-16 常用基礎代碼范例.1 3.P4 應用案例.21 3.1.流量實時統計.21 3.2.特征報文復制.23 3.3.一致性 HASH 網關.25 3.4.VPC EIP 卸載.29 3.5.安全防火墻.31 3.6.四層網關卸載.33 3.7.應用服務鏈.35 3.8.可編程交換機增
2、強型 PTP.37 4.結語.41 ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)ii 前前 言言 計算機網絡伴隨著時代發展,每十年總會出現一些革命性的技術,我們相信從傳統的固定功能芯片到可編程芯片業界正在迎來新的變革,而本次變革的終態就是可編程網絡,一張白盒化、芯片能力可定制化的網絡??删幊绦酒陌l展最早是從研究領域開始的,學術界紛紛提出了利用交換芯片的可編程能力實現很多應用的能力,例如 LOAD BANLANCE、協議一致性等將原本軟件實現的能力通過可編程芯片硬件化后,達到 HIGH THROUGHPUT 和 LOW LATENCY。而工業界各大云網絡公司也在加速
3、步伐,紛紛投入可編程網絡的技術研發?;?P4 可編程芯片技術的應用在各大互聯網公司也已逐步承載海量業務流量,解決了網絡高帶寬、低延遲、快速迭代演進的訴求。大家對數據面需要一種能夠支持可靈活編程的語言也越來越形成共識,P4應運而生,以其開放,通用,和良好的軟硬件生態受到廣大學術界和工業界的歡迎。我們知道,網絡轉發技術發展初了成本外,通常伴隨兩大訴求:一是轉發性能和功能訴求。在過去的 10 年中,軟轉發技術發展迅猛,但摩爾定律放緩,軟轉發技術性能已趨于瓶頸。硬件轉發性能強,但功能迭代緩慢,一個特性的需求可能都要耗時半年??删幊绦酒夹g給這一現狀的破局注入了新的發動機。二是研發和運維支撐體系上的訴
4、求,上線前需要可預期,從網絡的架構,功能,規格,監控,運維,調整,驗證等方面,都需要可預期。上線運行時要能可感知,從單點網元,網元連接,上層使用等都需要高緯度和細粒度的感知;上線運行后,要快速低成本的可調整。而端到端的可編程,是一個非常重要的支撐因素。業界圍繞 P4 開放可編程技術生態,生機勃勃。從 ONF,底層硬件交換芯片,網卡芯片,到各芯片廠商驅動,編譯器,到設備廠商 ODM,OEM 產業鏈,齊全。以及最終學術界和工業界推出的各種 SWITCH,INT,HPCC,GATEWAY 等的可編程應用也越來越多,P4 語言也從 P4-14 到 P4-16 逐漸完善,整體生態日趨成熟。ODCC-20
5、21-03006 P4 可編程應用案例技術白皮書(中文版)iii P4 可編程應用案例技術白皮書希望能夠沉淀我們 P4-16 編程中常用的應用案例,拋磚引玉,歡迎更多同仁一起來群策群力,創建更多創新的應用。起草單位:阿里巴巴(中國)有限公司、三快在線科技有線公司、星融元數據技術有限公司 起草者:阿里巴巴(湯明),美團(黃淮),星融元 Asterfusion(齊航)ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)iv 版權說明版權說明 ODCC(開放數據中心委員會)發布的各項成果,受著作權法保護,編制單位共同享有著作權。轉載、摘編或利用其它方式使用 ODCC 成果中的文字
6、或者觀點的,應注明來源:“開放數據中心委員會”。對于未經著作權人書面同意而實施的剽竊、復制、修改、銷售、改編、匯編和翻譯出版等侵權行為,ODCC 及有關單位將追究其法律責任,感謝各單位的配合與支持。ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)1 P4 可編程應用案例技術白皮書 1.參考資料參考資料下列文件對于本文件的應用是必不可少的。凡是注日期的引用文件,僅注日期的版本適用于本文件。凡是不注日期的引用文件,其最新版本(包括所有的修改)適用于本文件。1.P4 編程介紹 https:/p4.org/2.P4 語言編程規范 https:/ 編程練習 https:/ 常用基
7、礎代碼范例常用基礎代碼范例 P4 的各應用編程中,都會遇到一些通用的邏輯,這部分主要涉及數據結構的定義,PARSER,DEPARSER 部分,如下:2.1.1.常用數據結構定義常用數據結構定義 通用長度定義通用長度定義 typedef bit mac_addr_t;typedef bit ipv4_addr_t;typedef bit ipv6_addr_t;typedef bit vlan_id_t;常用頭部字段定義常用頭部字段定義 ETHERNET_HEADER header ethernet_h ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)2 mac_addr
8、_t dst_addr;mac_addr_t src_addr;bit ether_type;VLAN_HEADER header vlan_tag_h bit pcp;bit cfi;vlan_id_t vid;bit ether_type;MPLS_HEADER header mpls_h bit label;bit exp;bit bos;bit ttl;IPV4_HEADER header ipv4_h ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)3 bit version;bit ihl;bit diffserv;bit total_len;bit ide
9、ntification;bit flags;bit frag_offset;bit ttl;bit protocol;bit hdr_checksum;ipv4_addr_t src_addr;ipv4_addr_t dst_addr;IPV4_OPTION_HEADER header ipv4_option_h bit type;bit length;bit value;IPV6_HEADER ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)4 header ipv6_h bit version;bit traffic_class;bit flow_label;bit
10、 payload_len;bit next_hdr;bit hop_limit;ipv6_addr_t src_addr;ipv6_addr_t dst_addr;TCP_HEADER header tcp_h bit src_port;bit dst_port;bit seq_no;bit ack_no;bit data_offset;bit res;bit flags;bit window;ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)5 bit checksum;bit urgent_ptr;UDP_HEADER header udp_h bit src_por
11、t;bit dst_port;bit length;bit checksum;VXLAN_HEADER/VXLAN-RFC 7348 header vxlan_h bit flags;bit reserved;bit vni;bit reserved2;VXLAN_GPE_HEADER/Generic Protocol Extension for VXLAN-IETFv4 ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)6 header vxlan_gpe_h bit flags;bit reserved;bit vni;bit reserved2;ICMP_HEADE
12、R header icmp_h bit type;bit code;bit checksum;/.IGMP_HEADER header igmp_h bit type;bit code;bit checksum;/.ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)7 ARP_HEADER/Address Resolution Protocol-RFC 6747 header arp_h bit hw_type;bit proto_type;bit hw_addr_len;bit proto_addr_len;bit opcode;/.ROCEV2_HEADER/RDMA
13、 over Converged Ethernet(RoCEv2)header rocev2_bth_h bit opcodee;bit se;bit migration_req;bit pad_count;bit transport_version;bit partition_key;bit f_res1;ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)8 bit b_res1;bit reserved;bit dst_qp;bit ack_req;bit reserved2;/.GRE_HEADER/Generic Routing Encapsulation(GRE)
14、-RFC 1701 header gre_h bit C;bit R;bit K;bit S;bit s;bit recurse;bit flags;bit version;bit proto;ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)9 NVGRE_HEADER/Network Virtualisation using GRE(NVGRE)-RFC 7637 header nvgre_h bit vsid;bit flow_id;ERSPAN_HEADER/ERSPAN common header for type 2/3 header erspan_h bit
15、 version_vlan;bit session_id;/include cos_en_t(6)and session_id(10)ERSPAN_TYPE2_HEADER/ERSPAN Type II-IETFv3 header erspan_type2_h bit index;/include reserved(12)and index(20)ERSPAN_TYPE3_HEADER/ERSPAN Type III-IETFv3 header erspan_type3_h ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)10 bit timestamp;bit ft_
16、d_other;/*bit sgt;/Security group tag bit p;bit ft;/Frame type bit hw_id;bit d;/Direction bit gra;/Timestamp granularity bit o;/Optional sub-header */BFD_HEADER/Bidirectional Forwarding Detection(BFD)-RFC 5880 header bfd_h bit version;bit diag;bit flags;bit detect_multi;bit len;ODCC-2021-03006 P4 可編
17、程應用案例技術白皮書(中文版)11 bit my_discriminator;bit your_discriminator;bit desired_min_tx_interval;bit req_min_rx_interval;bit req_min_echo_rx_interval;TELEMETRY_REPORT_HEADER/Telemetry report header-version 0.5/See https:/ header dtel_report_v05_h bit version;bit next_proto;bit d_q_f;bit reserved;bit hw_id;
18、bit seq_number;bit timestamp;bit switch_id;ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)12 2.1.2.常用協議類型定義常用協議類型定義 常用以太網協議常用以太網協議/Common protocols/types#define ETHERTYPE_IPV4 0 x0800#define ETHERTYPE_ARP 0 x0806#define ETHERTYPE_VLAN 0 x8100#define ETHERTYPE_IPV6 0 x86dd#define ETHERTYPE_MPLS 0 x8847#define E
19、THERTYPE_PTP 0 x88F7#define ETHERTYPE_FCOE 0 x8906#define ETHERTYPE_ROCE 0 x8915#define ETHERTYPE_BFN 0 x9000#define ETHERTYPE_QINQ 0 x8100 常用常用 IP 協議協議#define IP_PROTOCOLS_ICMP 1#define IP_PROTOCOLS_IGMP 2#define IP_PROTOCOLS_IPV4 4#define IP_PROTOCOLS_TCP 6#define IP_PROTOCOLS_UDP 17#define IP_PRO
20、TOCOLS_IPV6 41 ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)13#define IP_PROTOCOLS_SRV6 43#define IP_PROTOCOLS_GRE 47#define IP_PROTOCOLS_ICMPV6 58 常用常用 UDP 協議協議#define UDP_PORT_VXLAN 4789#define UDP_PORT_ROCEV2 4791#define UDP_PORT_GENV 6081#define UDP_PORT_SFLOW 6343#define UDP_PORT_MPLS 6635 常用常用 GRE 協議協議
21、#define GRE_PROTOCOLS_ERSPAN_TYPE_3 0 x22EB#define GRE_PROTOCOLS_NVGRE 0 x6558#define GRE_PROTOCOLS_IP 0 x0800#define GRE_PROTOCOLS_ERSPAN_TYPE_2 0 x88BE 常用常用 TCP 協議協議#define TCP_FLAGS_FIN 0 x01#define TCP_FLAGS_SYN 0 x02#define TCP_FLAGS_RST 0 x04#define TCP_FLAGS_ACK 0 x10#define TCP_FLAGS_FIN_MAS
22、K 0 x01 ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)14#define TCP_FLAGS_SYN_MASK 0 x17/SYN is 1,FIN,RST and ACK are 0#define TCP_FLAGS_RST_MASK 0 x04#define TCP_FLAGS_ACK_MASK 0 x10 2.1.3.常見數據包類型完整定義常見數據包類型完整定義#define VLAN_DEPTH 2#define MPLS_DEPTH 3 Struct packet_header_t ethernet_h ethernet;vlan_tag_hVLAN
23、_DEPTH vlan_tag;mpls_hMPLS_DEPTH mpls;ipv4_h ipv4;ipv4_option_h ipv4_option;ipv6_h ipv6;arp_h arp;udp_h udp;icmp_h icmp;igmp_h igmp;tcp_h tcp;rocev2_bth_h rocev2_bth;vxlan_h vxlan;ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)15 gre_h gre;erspan_h erspan;erspan_type2_h erspan_type2;erspan_type3_h erspan_type3
24、;ethernet_h inner_ethernet;ipv4_h inner_ipv4;ipv6_h inner_ipv6;udp_h inner_udp;tcp_h inner_tcp;icmp_h inner_icmp;常用常用 PARSER 邏輯邏輯 PARSER_ETHERNET state parse_ethernet pkt.extract(hdr.ethernet);transition select(hdr.ethernet.ether_type,ig_intr_md.ingress_port)(ETHERTYPE_IPV4,_):parse_ipv4;(ETHERTYPE_
25、ARP,_):parse_arp;(ETHERTYPE_IPV6,_):parse_ipv6;(ETHERTYPE_VLAN,_):parse_vlan;ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)16 default:accept;PARSER_IPV4 state parse_ipv4 pkt.extract(hdr.ipv4);ipv4_checksum.add(hdr.ipv4);transition select(hdr.ipv4.ihl)5:parse_ipv4_no_options;6:parse_ipv4_options;default:accept
26、;PARSER_IPV4_OPTIONS state parse_ipv4_options pkt.extract(hdr.ipv4_option);transition parse_ipv4_no_options;PARSER_IPV4_NO_OPTIONS state parse_ipv4_no_options ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)17 transition select(hdr.ipv4.protocol,hdr.ipv4.frag_offset)(IP_PROTOCOLS_ICMP,0):parse_icmp;(IP_PROTOCOL
27、S_IGMP,0):parse_igmp;(IP_PROTOCOLS_TCP,0):parse_tcp;(IP_PROTOCOLS_UDP,0):parse_udp;(IP_PROTOCOLS_IPV4,0):parse_ipinip;default:accept;PARSER_ARP state parse_arp pkt.extract(hdr.arp);transition accept;PARSER_VLAN state parse_vlan pkt.extract(hdr.vlan_tag.next);transition select(hdr.vlan_tag.last.ether
28、_type)ETHERTYPE_ARP:parse_arp;ETHERTYPE_IPV4:parse_ipv4;ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)18 ETHERTYPE_VLAN:parse_vlan;ETHERTYPE_IPV6:parse_ipv6;default:accept;PARSER_IPV6 state parse_ipv6 pkt.extract(hdr.ipv6);transition select(hdr.ipv6.next_hdr)IP_PROTOCOLS_ICMPV6:parse_icmp;IP_PROTOCOLS_TCP:par
29、se_tcp;IP_PROTOCOLS_UDP:parse_udp;IP_PROTOCOLS_IPV4:parse_ipinip;IP_PROTOCOLS_IPV6:parse_ipv6inip;default:accept;PARSER_UDP state parse_udp pkt.extract(hdr.udp);ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)19 transition select(hdr.udp.dst_port)udp_port_vxlan:parse_vxlan;UDP_PORT_ROCEV2:parse_rocev2;default:a
30、ccept;PARSER_TCP state parse_tcp pkt.extract(hdr.tcp);transition accept;PARSER_ICMP state parse_icmp pkt.extract(hdr.icmp);transition accept;PARSER_IGMP state parse_igmp pkt.extract(hdr.igmp);transition accept;ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)20 PARSER_ROCEV2 state parse_rocev2 pkt.extract(hdr.ro
31、cev2_bth);transition accept;state parse_vxlan pkt.extract(hdr.vxlan);transition accept;2.1.4.常用常用 DEPARSER 邏輯邏輯 pkt.emit(hdr.ethernet);pkt.emit(hdr.vlan_tag);pkt.emit(hdr.arp);pkt.emit(hdr.ipv4);pkt.emit(hdr.ipv4_option);pkt.emit(hdr.ipv6);pkt.emit(hdr.udp);pkt.emit(hdr.tcp);pkt.emit(hdr.icmp);ODCC-
32、2021-03006 P4 可編程應用案例技術白皮書(中文版)21 pkt.emit(hdr.igmp);pkt.emit(hdr.rocev2_bth);pkt.emit(hdr.vxlan);3.P4 應用案例應用案例上述 P4-16 常用基礎數據結構和 PARSER,DEPARSER 在下面案例中,會直接使用。下面案例將強調重點 MATCH-ACTION 部分,以及一些控制層邏輯。3.1.流量實時統計流量實時統計 3.1.1.流量統計轉發層設計流量統計轉發層設計 P4 可以允許我們再每個報文中,獲取很多信息,我們可以根據這些信息,將相關聯的部分,映射到 P4 里面的 COUNTER 上
33、我們可以先定義 counter 數組,然后根據報文的特征把報文關聯到多個counter 上 /bit counter value;bit counter index Counterbit,bit(10240,CounterType_t.PACKETS_AND_BYTES)counter;我們可以定義如下 MATCH-ACTION 把報文關聯到 counter 上 ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)22 action set_counter _id(bit counterid)ig_md.counter.id=counterid;table counter_
34、merter_id key=ig_md.l4_sip:ternary;ig_md.l4_dip:ternary;ig_md.vni:ternary;ig_md.ip_proto:ternary;ig_md.l4_sport:ternary;ig_md.l4_dport:ternary;actions=set_counter_id;NoAction;const default_action=NoAction;size=table_size;ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)23 然后對這些 id 進行流量統計 action do_count()counter
35、.count(ig_md.counter.id);Apply Do_count();3.1.2.流量統計控制層設計流量統計控制層設計 控制層上,counterid 的維護由控制層進行維護。我們把需要關注的流量,通過報文特征如 sip,dip,proto,vni,sport,dport 等維度(可設計掩碼匹配)關聯到特定的 counterid;控制層面也可以維護多組轉換關系,對應不同的 counterid。將規則通過 p4-runtime 下發到芯片上。報文在經過 match-action 后,會對這些 id 挨個進行逐包 bps 和 pps 維度的統計,然后通過控制層 p4-runtime(或
36、芯片廠商提供的接口)讀取流量數據即可。3.2.特征報文復制特征報文復制 ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)24 3.2.1.特征報文復制轉發層設計特征報文復制轉發層設計/根據芯片的不同,報文復制 mirror 這部分的操作方式可能有所不同,以下以 barefoot 芯片為例 action set_mirror_session(bit session_id)mirror_md.session_id=session_id;table mirror_table key=ig_md.l4_sip:ternary;ig_md.l4_dip:ternary;ig_md
37、.vni:ternary;ig_md.ip_proto:ternary;ig_md.l4_sport:ternary;ig_md.l4_dport:ternary;actions=set_mirror_session;NoAction;Size=10240;ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)25 apply mirror_table.apply();在 deparser 中 mirror.emit(ig_md.mirror.session_id,mirror_metadata_h 的字段實例)3.2.2.征報文復制轉發層設計征報文復制轉發層設計 通過芯片提
38、供的 fixed 功能,將 match 住的報文發到指定的出端口上。3.3.一致性一致性 HASH 網關網關 3.3.1.一致性一致性 HASH 網關轉發層設計網關轉發層設計/轉發層的核心思想為先對目標 vip,依據 tcp 五元組計算出 hash 值,然后根據 vip 和 hash 值,設置對應的 real server 的 ip;bit hash;Hashbit(HashAlgorithm_t.CRC32)hashgo;ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)26 action cal_hash()hash=hashgo.get(hdr.ipv4.src_a
39、ddr,hdr.ipv4.dst_addr,hdr.ipv4.ip_proto,hdr.tcp.sport,hdr.tcp.dport);action set_real_server_ip(bit ip)hdr.ipv4.dst_addr=ip;table vip_to_real_server key=hdr.ipv4.dst_addr:exact;hash8:0:exact;action=set_rs_ip;size=1024*256;apply cal_hash();vip_to_real_server.apply();ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版
40、)27 3.3.2.一致性一致性 HASH 網關控制層設計網關控制層設計(1)后端節點常規)后端節點常規 ECMP 情況情況對于簡易一致性 hash 網關來說,關鍵是控制層對表項 vip,hash 值 對應的 real server ip 的調整,以上述案例為例,每個 vip 對應 hash 值有 8bit,存在 256種可能結果。我們可以均勻的將 real server 分配到 256 個槽位中。比如有 4 個real server,256/4=64;所以我們將 Vip+hash 值為 0-63 的都通過 p4-runtime 下發 value 為 realserver A 的 ip;Vip
41、+hash值為64-127 的都通過p4-runtime下發value 為realserver B的ip;Vip+hash 值為 128-191 的都通過 p4-runtime 下發 value 為 realserver C 的ip;Vip+hash 值為 192-255 的都通過 p4-runtime 下發 value 為 realserver D 的ip;此時理論上已形成 4 臺 realserver 的 ECMP;(2)后端節點刪除情況)后端節點刪除情況例如此時由于 A 宕機需要刪除 realserver A,按照一致性 hash 原理,我們需要正常的流量不受到影響,而只應該將故障節點
42、A 的流量重新分配到剩下的節點 BCD 中,來保障流量影響為 1/n;所以則只需要調整控制層邏輯為(2.1)BCD 對應的流量保持不變,所以以下表項不用調整 Vip+hash值為64-127 的都通過p4-runtime下發value 為realserver B的ip;Vip+hash 值為 128-191 的都通過 p4-runtime 下發 value 為 realserver C 的ip;Vip+hash 值為 192-255 的都通過 p4-runtime 下發 value 為 realserver D 的ip;ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)2
43、8(2.2)A 的流量分攤到 BCD 上,64/3=21(忽略最后 1/64 的影響)Vip+hash 值為 0-20 的都通過 p4-runtime 下發 value 為 realserver B 的 ip;Vip+hash 值為 21-41 的都通過 p4-runtime 下發 value 為 realserver C 的 ip;Vip+hash 值為 42-62 的都通過 p4-runtime 下發 value 為 realserver D 的 ip;Vip+hash 值為 63 的都通過 p4-runtime 下發 value 為 realserver B 的 ip;/B,C,D 任選
44、一個即可(3)后端節點新增的情況)后端節點新增的情況例如此時需要新增 realserver E 進入 hash 組,按照一致性 hash 原理,我們需要保證受影響流量為 1/n,即 256/4=64,256/5=51(忽略最后 1),所以需要從 ABCD每個 realserver 拿出 64-51=13 個槽位分配給 E 注:收到影響的流量為13*4=52,52/256 約1/5,即可保證最終一致性HASH效果。按照上述思想 控制層需要下發表項可如下:Vip+hash 值為 0-50 的都通過 p4-runtime 下發 value 為 realserver A 的 ip;Vip+hash 值
45、為 51-63 的都通過 p4-runtime 下發 value 為 realserver E 的 ip;Vip+hash值為64-114 的都通過p4-runtime下發value 為realserver B的ip;Vip+hash 值為 115-127 的都通過 p4-runtime 下發 value 為 realserver E 的ip;Vip+hash 值為 128-178 的都通過 p4-runtime 下發 value 為 realserver C 的ip;Vip+hash 值為 179-191 的都通過 p4-runtime 下發 value 為 realserver E 的ip
46、;ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)29 Vip+hash 值為 192-242 的都通過 p4-runtime 下發 value 為 realserver D 的ip;Vip+hash 值為 243-255 的都通過 p4-runtime 下發 value 為 realserver E 的ip;經過多輪迭代后,控制層可以統計出出每個節點實際承載的流量,通過軟件計算出需要調整的 realserver 節點號,控制權重即可做到增刪影響均為 1/n 的一致性 hash 網關效果。3.4.VPC EIP 卸載卸載 3.4.1.VPC EIP 卸載轉發層設計卸載轉
47、發層設計(1)公網入方向進)公網入方向進 VPC本案例假設 vpc 報文為 vxlan 報文。核心為將公網進來的報文,匹配目標 IP,轉換為 vxlan 報文,目標 ip 轉換為 vpc 內的 ip。action set_vpc_innerip(bit vni,bit nc_ip,bit inner_dip)ig_md.vni=vni;ig_md.nc_ip=nc_ip;ig_md.inner_dip=inner_dip;ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)30 table eip_to_vpc key=hdr.ipv4.dst_addr:exact;act
48、ion=set_vpc_innerip;size=1024*32;然后進行 hdr.vxlan.setValid(),對相應 vxlan 報文的各字段進行賦值,最后pk.emit(hdr.vxlan)即可,常規操作,略去代碼。(2)VPC 報文轉公網出報文轉公網出核心為通過報文的 vni 和 sip 這兩個 vpc 的信息,轉換為出口 eip action set_vpc_eip(bit eip)ig_md.sip=eip;table vpc_to_eip key=hdr.vxlan.vni:exact;hdr.vxlan.ipv4.sip:exact;action=set_vpc_eip;O
49、DCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)31 size=1024*256;然后進行 hdr.vxlan.setInvalid(),對相應 hdr.ipv4.sip=ig_md.sip 進行賦值,常規操作,略去代碼。3.4.2.VPC EIP 卸載控制層設計卸載控制層設計 控制側主要維護住兩個方向的規則,下發到芯片即可。一個是公網入方向:eip-vni+vpc innerip 一個是公網出方向:vni+vpc innerip-eip 3.5.安全防火墻安全防火墻 3.5.1.安全防火墻轉發層設計安全防火墻轉發層設計/根據芯片的不同,防火墻這部分的操作方式可能有所不同
50、,以下以 barefoot芯片為例 action set_fwd_port(bit port)fw_md.out_port=port;ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)32 table fw_table key=ig_md.l4_sip:lpm;ig_md.l4_dip:lpm;ig_md.vni :ternary;ig_md.ip_proto:exact;ig_md.l4_sport:range;ig_md.l4_dport:range;actions=set_fwd_port;NoAction;apply fw_table.apply();Cpu po
51、rt 收到的包通過 DPDK 進行包過濾,需要轉發的包再下發給 barefoot芯片進行轉發;3.5.2.安全防火墻控制層設計安全防火墻控制層設計 控制層上,主要完成 mac 地址學習,路由學習等功能,流表信息更新;ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)33 3.6.四層網關卸載四層網關卸載 3.6.1.四層網關卸載快速路徑設計四層網關卸載快速路徑設計/根據芯片的不同,防火墻這部分的操作方式可能有所不同,以下以 barefoot芯片為例 action set_session_inf(bit ip,bit port)gw_md.ip=ip;gw_md.port=
52、port;action set_cpu_port(bit port)gw_md.cpu_port=port;table session_table key=ig_md.l4_sip:exact;ig_md.l4_dip:exact;ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)34 ig_md.vni :exact;ig_md.ip_proto:exact;ig_md.l4_sport:exact;ig_md.l4_dport:exact;actions=set_session_inf;defaultonly set_cpu_port;apply session_ta
53、ble.apply();3.6.2.四層網關卸載慢速路徑設計四層網關卸載慢速路徑設計 Cpu port 收到的包通過 DPDK 進行慢速處理,并把大象流對應 session offload到芯片里面;3.6.3.四層網關卸載控制層設計四層網關卸載控制層設計 控制層完成 mac 地址學習,路由學習以及流表配置等功能;ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)35 3.7.應用服務鏈應用服務鏈 3.7.1.應用服務鏈轉發層設計應用服務鏈轉發層設計 轉發層根據報文特征,分發給不同的 service chain 后端。分發方式可以為添加 vxlan,gre,ipinip
54、等各種加頭方式,也可以直接修改報文 ip 等操作,或者直接把報文修改出端口送到直連的硬件網卡或者 fpga 等 service chain。案例如下:action send_to_chain1(bit dip)add_header_chain1(dip);/modfiy_header();action send_to_chain2(bit dip)add_header_chain2(dip);/modfiy_header();action send_to_chain3(bit dip)add_header_chain2(dip);ODCC-2021-03006 P4 可編程應用案例技術白皮書(
55、中文版)36/modfiy_header();action send_to_chain4(bit phy_port)send_to_port(phy_port);table dipatch_table key=ig_md.l4_sip:ternary;ig_md.l4_dip:ternary;ig_md.ip_proto :ternary;ig_md.l4_sport:ternary;ig_md.l4_dport :ternary;actions=send_to_chain1;send_to_chain2;send_to_chain3;send_to_chain4;NoAction;size=
56、10240;apply dipatch_table.apply()ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)37 3.7.2.應用服務鏈控制層設計應用服務鏈控制層設計 控制層根據不同 chain 需要處理的報文內容,下發匹配規則。同時控制層下發不同的 service chian 對應的后端服務器或直連的硬件端口信息。每個對應的 chain 處理完成后,需要把報文再發回來給應用服務分發中心,發回來的可以通過修改或者添加報文頭來標識對應的 chain 已經處理完成。如此通過修改 service chain 返回的報文回送到分發中心,分發中心再根據不同的報文匹配規則,完
57、成整個 service chain 的處理即可。3.8.可編程交換機增強型可編程交換機增強型 PTP 可編程交換機獨具特色的再編程能力可以提供協議可編程、資源可編程、轉發邏輯可編程等能力。由此帶來的裁剪功能、調整規格、定制特性的特點,為客戶帶來自主可控的網絡。下面以星融元對 PTP 這一特性的改進作為切入點,介紹可編程交換機在定制以及優化特性這一維度的嘗試。3.8.1.可編程交換機增強型可編程交換機增強型 PTP 轉發層設計轉發層設計 轉發層設計的基本思路是,將識別 PTP 類型的包轉給控制面。ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)38 數據面解析 PTP 報
58、文識別出 EVENT 類型報文,根據識別出的 EVENT 報文觸發硬件時間戳機制,再根據 EVENT 類型將時間更新到 PTP 報文中,將獲取的時間信息提交給控制面處理。PTP header:header ptp_h bit transportSpecific;bit messageType;bit reserved1;bit versionPTP;bit messageLength;bit domainNumber;bit reserved2;bit flags;header ptp_correction_h bit correction;header ptpv_rxtime_h bit p
59、tpv_rxtime;根據 ptp 報文類型獲取報文發出時間戳:action set_updated_cf(bit cf_byte_offset)table map_ptp_md key=ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)39 hdr.udp.dst_port:exact;hdr.ptpv2.messageType:exact;actions=set_ptp_md;NoAction_nop;const default_action=NoAction_nop;table ptp key=eg_md.egress_ptp.dst_port:exact;eg_m
60、d.egress_ptp.messageType:exact;actions=set_updated_cf;trig_tstamp;NoAction;const default_action=NoAction;counters=stats;根據 ptp 報文類型獲取報文收到時間戳:action SetTimeStmp()hdr.ptpv_rxtime.ptpv_rxtime=ig_md.timestamp;ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)40 hdr.ptpv_rxtime.setValid();hdr.udp.checksum=0;hdr.udp.le
61、ngth=hdr.udp.length+6;hdr.ipv4.total_len=hdr.ipv4.total_len+6;stats.count();action set_ptp_messageType()ig_md.ingress_ptp.messageType=hdr.ptpv2.messageType;Table recve_time key=ig_md.lkp.l4_dst_port:exact;ig_md.ingress_ptp.messageType:exact;ig_md.cpu_reason:exact;actions=SetTimeStmp;NoAction;const d
62、efault_action=NoAction;counters=stats;3.8.2.可編程交換機增強型可編程交換機增強型 PTP 控制層設計控制層設計 交換機將收到的 PTP 報文發送給控制面,PTPD 接收時間信息,同時在控制面維護一套接口管理全局時鐘,PTPD 與該接口交換實現了對全局時間的調控。ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)41 4.結語結語P4 可編程芯片技術已成為新時代最具競爭力的可編程芯片語言之一,具有廣闊的應用場景和成熟的產業鏈生態。P4 可編程應用案例技術白皮書 希望能夠引發更多同仁的共鳴,促進 P4 可編程生態的健康發展。同時拋磚引玉,歡迎更多同仁一起來創建更多創新的應用。由于作者時間和水平有限,文中內容不免有不足和錯誤,懇請各位讀者朋友和行業專家指正并不吝賜教!ODCC-2021-03006 P4 可編程應用案例技術白皮書(中文版)42 開放數據中心委員會(秘書處)地址:北京市海淀區花園北路 52 號 電話:010-62300095 郵箱:ODCC