...
전공교육 | 개발실습 | 부서교육 | 부서업무지원 | 기타 | |
---|---|---|---|---|---|
P | 과학데이터교육 일 3.2시간 이상 수강 | p4 tutorial실습 | |||
D | ECN 실습, QoS 실습, Firewall 실습, Link monitoring 실습, 단순한 계산기 구현 | ||||
C | |||||
A |
일일회고
23/02/20
- Fact : ECN, QoS, Firewall을 실습해보고 코드를 이해했다.
- Feelings : 글로만 배웠던 것들을 코딩을 통해 구현해 보니 신기했다.
- Finding : QoS가 무엇인지 처음 알게 되었고 Firewall에 블룸 필터의 개념을 확실히 알게 되었다.
- Future Action Plan : Link Monitoring 실습, P4 튜토리얼 내용 총 정리
- Feedbacks :
...
- Fact : Link monitoring실습을 하고 이해했다.
- Feelings : P4 튜토리얼을 모두 완료해서 뿌듯했다.
- Finding : P4라는 언어를 통해 SDN을 구성할 수 있다는 것을 어느정도 알 수 있었고 기존 네트워크 계층의 스위치, 라우터와 같은 하드웨어의 기능을 프로그래밍으로 구현할 수 있다는것을 알았다.
- Future Action Plan : 간단한 P4 프로그램 제작
- Feedbacks :
23/02/22
- Fact : P4로 단순한 계산기를 구현해보고 실행해봤지만 생각대로 동작하지 않았다. 성과취합 추가분을 완성했다.
- Feelings : 보던거랑 실제로 생각해서 구현하는 거랑 난이도가 너무 달랐다.
- Finding : 아직 P4에 대해 1%도 알지 못한다는 것을 알았다.
- Future Action Plan : P4로 만든 단순한 계산기를 생각대로 동작되도록 수정
- Feedbacks :
Memo
23/02/20
- 참고사항
- 동영상 참고
...
출처 | 왜 | 내용 | 배운 점 및 기억해야할 점 | 비고 |
---|---|---|---|---|
과학데이터교육 인공지능 | 충북대 현장실습 직무교육 | 문제 해결과 탐색 알고리즘, 탐색 트리와 탐색 알고리즘, 너비 우선 탐색과 균일 비용 탐색, 깊이 우선과 깊이 우선 반복 심화 탐색, 양방향 탐색, 주요 탐색 전략 비교 |
23/02/22
- 참고사항
- 사용자 정의 packet을 보낼수 있는 패키지 https://coding-wonderland.tistory.com/30?category=797866
- 동영상 참고
...
출처 | 왜 | 내용 | 배운 점 및 기억해야할 |
---|
...
점 | 비고 | |||
---|---|---|---|---|
과학데이터교육 인공지능 | 충북대 현장실습 직무교육 | 휴리스틱 탐색법과 최적,최고 우선 탐색, 탐욕적 탐색과 A*탐색, 적대적 탐색, 게임트리의 탐색, 지식 표현과 추론 |
배운 것 및 기억해야할 것
P4 튜토리얼 Explicit Congestion Notification(ECN)의 이해
사전조건
s1과 s2의 링크의
P4 튜토리얼 Explicit Congestion Notification(ECN)의 이해
사전조건
s1과 s2의 링크의 대역폭은 512kbps로 제한되어 있다. 이상태에서 s1과 s2의 통로를 h11↔h22가 UDP 통신을 하고 h1↔h2가 패킷을 주고 받는 조건이다.
...
맨 밑줄이 프로브 패킷의 첫 시작이므로 윗 줄로 갈수록 각 포트에서 전송된 바이트가 점점 증가하는 것을 볼 수 있다.
P4로 만든 간단한 계산기
설계
코드 블럭 |
---|
header calc_t{
bit<2> operator;
bit<7> operand1;
bit<7> operand2;
bit<7> result;
bit<1> padding;
} |
사진과 같은 간단한 토폴로지를 이용해서 h1에서 h2로 연산자(0→ 더하기, 1→ 빼기, 2→ 곱하기)와 operand1,2를 헤더에 담아 보내면 s1에서 result에 해당하는 연산의 값을 저장하여 h2에 전달한다.
코드 구현
코드 블럭 |
---|
/* -*- P4_16 -*- */
#include <core.p4>
#include <v1model.p4>
//새로운 헤더의 임시 타입넘버
const bit<16> TYPE_CALC = 0x1213;
/*************************************************************************
*********************** 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;
}
//새로운 헤더
header calc_t{
bit<2> operator;
bit<7> operand1;
bit<7> operand2;
bit<7> result;
bit<1> padding;
}
struct metadata {
/* empty */
}
struct headers {
ethernet_t ethernet;
calc_t calc;
}
/*************************************************************************
*********************** 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_CALC:parse_calc;
default:accept;
}
}
state parse_calc{
packet.extract(hdr.calc);
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() {
mark_to_drop(standard_metadata);
}
//입력값에 맞는 연산을 하고 저장한다.
action calc_operand(macAddr_t dstAddr,egressSpec_t port, bit<2> operator) {
if (operator==0){
hdr.calc.result=hdr.calc.operand1+hdr.calc.operand2;
}
else if (operator==1){
hdr.calc.result=hdr.calc.operand1-hdr.calc.operand2;
}
else if (operator==2){
hdr.calc.result=hdr.calc.operand1*hdr.calc.operand2;
}
standard_metadata.egress_spec = port;
hdr.ethernet.srcAddr = hdr.ethernet.dstAddr;
hdr.ethernet.dstAddr = dstAddr;
}
table operator_exact {
key = {
hdr.calc.operator: exact;
}
actions = {
calc_operand;
drop;
NoAction;
}
size = 1024;
default_action = drop();
}
apply {
if (hdr.calc.isValid()) {
operator_exact.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 { }
}
/*************************************************************************
*********************** D E P A R S E R *******************************
*************************************************************************/
control MyDeparser(packet_out packet, in headers hdr) {
apply {
packet.emit(hdr.ethernet);
packet.emit(hdr.calc);
}
}
/*************************************************************************
*********************** S W I T C H *******************************
*************************************************************************/
V1Switch(
MyParser(),
MyVerifyChecksum(),
MyIngress(),
MyEgress(),
MyComputeChecksum(),
MyDeparser()
) main; |
실행결과
h1에서 h2로 패킷을 보내도 h2에서 받은 패킷의 헤더를 파싱해보면 result에 초기값이 들어있다.
패킷을 보내는 과정을 제대로 손봐야 할것 같다.