PDCA


전공교육개발실습부서교육부서업무지원기타
P과학데이터교육센터 강의 수강

P4를 이용한 네트워크 시뮬레이션 실행.

miniedit을 이용하여 GUI를 이용하여 P4 스위치 활용

2022 연구 보고서 정리
D

모든 강의 수강 완료(~2/17)


P4 VM이미지를 활용하여 가상머신 구동.

miniedit 관련 이미지 구동시도

연구 보고서 정리 완료
C100%

50% - miniedit또한 VM이미지를 이용하여 구동하였지만,

구동 실패



A

miniedit은 관련 언어에 어려움이 있어서 어려울 것을 대비한 것 이었지만,

튜토리얼에 상세히 알려주고 있어 PASS



Memo

2/13 

  • P4 VM이미지를 이용하여 P4 example 실행.

Vagrant와 VirtualBox를 이용하여 P4 환경이 설치되어 있는 리눅스 환경을 설치하여 실행

p4 tutorial에 들어가 zip으로된 파일을 다운받고, Obtiaing re~에 쓰여있는 글을 따라 순차적으로 설치.

그 후 p4 tutorial_vm-ubuntu-20.04 위 사이트의 installation을 활용하여 설치 완료.

가장 간단한 p4 스위치를 이용한 mininet 시뮬레이션 실행가능

- p4 VM이미지를 이용하여 간단한 실습

  • 부서 업무 지원 수행


2/14 

  • 부서 업무 지원 
    • 2022년도 KREONET 성과 보고서 취합.
    • 32개 중 16개 취합 완료.
  • KISTI 과학데이터교육 강의 수강

2/15 

Basic Fowarding
/* -*- P4_16 -*- */
#include <core.p4>
#include <v1model.p4>


const bit<16> TYPE_IPV4 = 0x800;


/*************************************************************************
*********************** H E A D E R S ***********************************
*************************************************************************/


typedef bit<9> egressSpec_t;
typedef bit<48> macAddr_t;
typedef bit<32> ip4Addr_t;

// 이더넷에 관한 헤더 선언 //
header ethernet_t {
macAddr_t dstAddr;
macAddr_t srcAddr;
bit<16> etherType;
}

// IPV4 에 관한 헤더 선언 //
header ipv4_t {
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;
ip4Addr_t srcAddr;
ip4Addr_t dstAddr;
}


struct metadata {
/* empty */
}


struct headers {
ethernet_t ethernet;
ipv4_t ipv4;
}


/*************************************************************************
*********************** P A R S E R ***********************************
*************************************************************************/
// 들어오는 패킷의 헤더에 관한 분석을 하기 위한 함수 선언 //

parser MyParser(packet_in packet,
out headers hdr,
inout metadata meta,
inout standard_metadata_t standard_metadata) {


state start {
transition parse_ethernet; 
}


state parse_ethernet {
packet.extract(hdr.ethernet); - 이더넷 헤더를 분리
transition select(hdr.ethernet.etherType) {
TYPE_IPV4: parse_ipv4; - 이더넷의 타입이 IPV4이면 parse_ipv4.
default: accept; - 아니라면 accept.
}
}


state parse_ipv4 { - 전단계에서 받은 패킷을 ipv4의 헤더에 맞게 추출
packet.extract(hdr.ipv4);
transition accept;
}


}


/*************************************************************************
************ C H E C K S U M V E R I F I C A T I O N *************
*************************************************************************/


control MyVerifyChecksum(inout headers hdr, inout metadata meta) {
apply { }
}




/*************************************************************************
************** I N G R E S S P R O C E S S I N G *******************
*************************************************************************/
 - 패킷을 처리해 출력 포트를 결정 - 

control MyIngress(inout headers hdr,
inout metadata meta,
inout standard_metadata_t standard_metadata) {              - 패킷을 처리할 때 해당 테이블에 매칭을 시켜본 후
action drop() {                                               일치하는 테이블이 없는 경우에 drop.  
mark_to_drop(standard_metadata);
}


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;                        - 한개의 라우터를 거쳤으므로 TTL - 1 감소
}


table ipv4_lpm {
key = {
hdr.ipv4.dstAddr: lpm;
}
actions = {
ipv4_forward;
drop;
NoAction;
}
size = 1024;
default_action = drop();
}


apply {
if (hdr.ipv4.isValid()) {   - ipv4 의 헤더가 적정한지에 따라 액션취한다.
ipv4_lpm.apply();
}
}
}


/*************************************************************************
**************** E G R E S S P R O C E S S I N G *******************
*************************************************************************/
  -   출력 처리 하는 과정  -

control MyEgress(inout headers hdr,
inout metadata meta,
inout standard_metadata_t standard_metadata) {
apply { }
}


/*************************************************************************
************* C H E C K S U M C O M P U T A T I O N **************
*************************************************************************/


control MyComputeChecksum(inout headers hdr, inout metadata meta) {
apply {
update_checksum(
hdr.ipv4.isValid(),
{ hdr.ipv4.version,
hdr.ipv4.ihl,
hdr.ipv4.diffserv,
hdr.ipv4.totalLen,
hdr.ipv4.identification,
hdr.ipv4.flags,
hdr.ipv4.fragOffset,
hdr.ipv4.ttl,
hdr.ipv4.protocol,
hdr.ipv4.srcAddr,
hdr.ipv4.dstAddr },
hdr.ipv4.hdrChecksum,
HashAlgorithm.csum16);
}
}


/*************************************************************************
*********************** D E P A R S E R *******************************
*************************************************************************/
 - 패킷을 송신하기 위해 분석했던 패킷을 다시 묶는 과정 -

control MyDeparser(packet_out packet, in headers hdr) {
apply {
packet.emit(hdr.ethernet);
packet.emit(hdr.ipv4);
     }
}


/*************************************************************************
*********************** S W I T C H *******************************
*************************************************************************/


V1Switch(
MyParser(),
MyVerifyChecksum(),
MyIngress(),
MyEgress(),
MyComputeChecksum(),
MyDeparser()
) main;


2/16 

  • Basic Tunneling - 기본적인 포워딩 방식에 더해 터널을 만들 터널 헤드로만 통신이 가능 하게 만든다.
Basic Tunneling
----------------------------------------------------------------- Basic Forwarding과 다르게 Tunnel에 관련된 헤더가 추가되어 패킷을 분석할때 Tunnel에 관련된 헤더도 분석하기 위해 경우를 추가.
state parse_ethernet {
packet.extract(hdr.ethernet);
transition select(hdr.ethernet.etherType) {
TYPE_MYTUNNEL: parse_myTunnel;
TYPE_IPV4: parse_ipv4;
default: accept;
    }
}

----------------------------------------------------------------------etherType 이 Tunnel인 경우 parse_myTunnel의 함수를 이용하여 패킷을 먼저 분리 그 다음에 Forwarding과 같이 IPV4에 관하여 분석.
state parse_myTunnel {
packet.extract(hdr.myTunnel);
transition select(hdr.myTunnel.proto_id) {
TYPE_IPV4: parse_ipv4;
default: accept;
   }
}

----------------------------------------------------------------------ingress하기 위해 터널 헤더에 맞는 테이블 값이 있을 시에 행동을 취하게 끔 분석 및 전송을 하는 함수.
action myTunnel_forward(egressSpec_t port) {
standard_metadata.egress_spec = port;
    }


table myTunnel_exact {
key = {
hdr.myTunnel.dst_id: exact;
      }
actions = {
myTunnel_forward;
drop;
      }
size = 1024;
default_action = drop();
 }  


  • P4Runtime - P4 스위치를 터널을 통해 송수신되는 패킷에 관련되어 테이블 작성 및 터널을 지나는 패킷에 관한 카운트 실행


P4Runtime
# 1) Tunnel Ingress Rule                            -------- 터널을 통한 패킷 수신 시에 터널 포트에 관한 테이블 작성
table_entry = p4info_helper.buildTableEntry(
table_name="MyIngress.ipv4_lpm",
match_fields={
"hdr.ipv4.dstAddr": (dst_ip_addr, 32)
},
action_name="MyIngress.myTunnel_ingress",
action_params={
"dst_id": tunnel_id,
})
ingress_sw.WriteTableEntry(table_entry)
print("Installed ingress tunnel rule on %s" % ingress_sw.name)

#2) Tunnel Transit Rule                          --------- 테이블과의 매칭을 통해 패킷 전송에 관한 것
table_entry = p4info_helper.buildTableEntry(
table_name="MyIngress.myTunnel_exact",
match_fields={
"hdr.myTunnel.dst_id": tunnel_id
},
action_name="MyIngress.myTunnel_forward",
action_params={
"port": SWITCH_TO_SWITCH_PORT
})
ingress_sw.WriteTableEntry(table_entry)
print("Installed transit tunnel rule on %s" % ingress_sw.name)

# 3) Tunnel Egress Ruletable_entry = p4info_helper.buildTableEntry(                 -------- 패킷 송신 시에 터널 포트에 관한 테이블 작성
table_name="MyIngress.myTunnel_exact",
match_fields={
"hdr.myTunnel.dst_id": tunnel_id
},
action_name="MyIngress.myTunnel_egress",
action_params={
"dstAddr": dst_eth_addr,
"port": SWITCH_TO_HOST_PORT
})
egress_sw.WriteTableEntry(table_entry)
print("Installed egress tunnel rule on %s" % egress_sw.name) 


2/17 

일일회고


2 / 132/142/152/162/17
Facts

Vagrant를 이용하여 간단한 VM이미지 설치 및 활용

P4 스위치를 활용한 간단한 실습, wireshark를 이용한 패킷 캐치

부서업무지원 일을 모두 처리.

들어야 하는 교육자료 모두 수강 완료.

P4 네트워크 언어를 이용하여 Basic Forwarding 수행,

기본적인 패킷 전송 방법에 관하여 실습

miniedit 이미지 설치 시도

P4 언어 튜토리얼에서 Basic Tunneling과 P4Runtime과

관련하여 이해 및 실습 진행

P4 언어 튜토리얼에서 ECN과 관련되어 정리 및 이해 진행

성과 보고서 정리본 완료 및 제출

Feeling

vagrant 이미지를 처음 사용해봐서 버벅거렸지만,

다른 인턴 직원의 도움으로 쉽게 할 수 있었습니다.

P4가 무엇을 하는지 조금 더 알아야한다고 생각햇습니다.

P4 스위치에 대해서 알아보기에 신체적으로

힘듬을 느껴 오늘 하루는 서류 작업 및 끝낼 수 있는

과제들 모두 해결.

P4라는 네트워크 언어를 알게 되었고, 추가적인 검색을 통해

어떤 언어 인지와 튜토리얼을 통해 조금 친숙하게 만들 수 있을 것

같다는 생각이 들게 되었습니다.

Basic Forwarding과 Basic Tunneling을 통해 P4언어를 

이용하여 라우터로의 패킷 전달을 성공시켜보았습니다.


ECN과 관련하여 이해를 하고, 실습을 통해 지식을

습득하였습니다. 이와 관련된 페이지로 정리한 것을

추가적으로 보니 더욱 이해가 잘되었습니다.

Finding

다음에 행할 실습에 대비해서 P4스위치에 대해서 개념적으로

접근해야 될것같습니다.

내일부터는 다시 부서 실습에 맞는 교육 실습에

임해야 겠다.

miniedit을 이용하여 구동하려 해보았지만, 이미지가 깨진 것인지

구동이 불가능 하였습니다. 그러나, 박사님의 말대로 튜토리얼 정도만

잘 정리하면 될 것 같습니다.

튜토리얼에서 알려주는 대로 실행하였지만, 

실제로 내가 코딩을 해서 패킷을 올바른 곳에 전달했다는

느낌이 들어 열심히 해보고 싶다는 생각이 들었습니다.

오늘은 몸이 안좋아서 집중을 하지 못하여 

많은 것을 이루진 못하였습니다.

푹 쉬고 다음 주에는 마무리를 잘 해보겠습니다.

  • 레이블 없음