네트워크 계층
- 네트워크 계층은 data plane, control plane으로 나뉜다.
- data plane은 라우터 내부 동작을 담당하며 라우터의 어느 input에서 어느 output 링크로 나갈지 결정한다.
- control plane은 네트워크의 라우터간 동작을 담당하며 source에서 destination까지 경로를 결정한다.

- Sending host는 network layer에서 segment를 encapsulate하고 datagram를 만들고 link layer로 보낸다
- Receiver host는 network layer에서 link layer으로부터 datagram을 받고 segment를 transport layer로 보낸다
- 라우터는 packet의 헤더 정보를 확인하고 올바른 output 포트로 보낸다
- 올바른 output 포트를 어떻게 찾을까?
- 수많은 라우터가 있는데 올바른 종단 간 경로는 어떻게 찾을까?

Network layer의 주요 동작
- forwarding 동작은 라우터 input link에 들어온 packets을 올바른 output link로 보낸다
- routing 동작은 pakcets이 도착할 수 있도록 경로를 정한다.
Routing
- 라우터는 packet의 header 값에 대응하는 output 값들을 local forwarding table에 보관한다.
- local forwarding table는 어떻게 계산되는가?
- 기존에는 Network 매니저가 수동으로 기입했지만 라우터 수가 많아지면서 forwarding table를 계산하기 시작했다.
- routing algorithm, software defined networking
Routing Alogrithm

- 라우터들이 개별적으로 Routing alogrithm을 시행하며 정보를 주고 받는다
- Forwarding table을 각자 계산하고 보관한다
- data plane, control plane 모두 라우터별로 있다
Software-Defined Networking(SDN)

- SDN은 중앙화된 Remote Controller에서 계산하고 forwarding table (flow table)을 만들어 라우터들에게 전달하는 방식이다
- CA가 Remote Controller에서 계산된 forwarding table (flow table)을 가져온다
- data plane은 라우터별로 있고 control plane을 한 곳에 모은다

- Network service는 각각의 packet이 40msec delay만에 도착하는 것을 보장한다
- 여러 packets에 대해 순서대로 전달되고 최소 대폭역을 보장한다.
- 패킷간의 간격 일정 (ex. video streaming jitter)을 통한 QoS (Quality of Service) 보장

- "best effort" service model은 대폭역, 패킷 손실, 순서, 딜레이는 보장하지 못한채 최선을 다해 packets을 주고 받는다

- "best effort" service는 여러가지 항목을 보장 못하지만 모델이 간단하여 넓게 채택 받았다
- 새로운 host나 network를 추가하기 쉬워 인터넷이 빠르게 발전했다
- 상대적으로 IP network의 유지 보수가 간단한다
- 충분한 대폭역 덕분에 실시간 통신이 가능하다
- Netflix와 같이 여러 지역에서 제공되는 서비스를 복제하고 더 가까이서 제공 할 수 있다
- "best effort" service 덕분에 여러 방면으로 발전할 수 있었다
라우터 구조

- Input 포트, high- speed switching fabric, output 포트가 있다
- Switching fabric은 packet을 input 포트에서 output포트로 보대주는 역할을 한다
- Routing processor는 control plane 영역 소프트웨어이며 input 포트에 forwarding table을 설치한다
- Forwarding은 nanosecond 걸리지만 routing processor의 processing은 millisecond 걸린다
- 즉 routing processor가 bottleneck이며 input port에 queueing delay가 일어나는 이유다

- Physical Layer (line termination)-> Link Layer -> Queue -> Switch fabric순으로 맨밑 계층부터 Network Layer로 packet이 올라온다
- Match plus action이란 look up, forwarding 기능을 통해 packet이 switch fabric을 통해 올바른 output 포트로 찾아가는 것이다
- Forwarding에는 destination-based forwarding, generalized forwarding이 있다
Destination-based forwarding
Range 방식

- Destination IP가 약 2^32개나 있는데 forwarding table에 IP 한개씩 link interface에 매핑할 수 없을 것이다
- 따라서 위와 같이 IP 범위에 따라 link interface를 매핑한다
- 예시에서는 11001000 … 00000000 부터 11001000 … 11111111까지는 link interface 0번으로 보낸다

- 만약 범위가 잘 나뉘어지지 않아 다른 link interface에 매핑해야할 subrange가 생긴다면 위와 같이 추가하면 해결할 수 있다
- 하지만 더 간단하고 깔끔한 Longest prefix matching 방식이 있다
Prefix 방식

- Longest prefix matching 방식은 IP를 forwarding table에서 왼쪽 비트에서 부터 매칭하는 가장 긴 값을 찾고 output port/link를 알아낸다
- *는 아무 값이나 일치할 수 있다
- Harware인 ternary content addressable memories (TCAMs)에서 수행되며 table 사이즈와 상관없이 1 clock cycle만에 매칭 값을 가져온다
- Longest prefix matching이 끝나면 이제 packet이 이동할 output 포트를 알아냈으며 switching fabrics를 통해 forwarding 된다 (match plus action)
Switching fabrics

- Packet을 input buffer에서 output buffer로 보내는 역할을 한다
- Switching rate이란 초당 보낼 수 있는 최대 packet 개수
- N개의 input과 R input rate이라면 switching rate은 N*R이다
- Switching fabrics는 3가지로 나뉜다
- Switching via memory, bus, interconnection network

Memory

- CPU 제어를 통한 스위칭 방식이다
- Input과 Output 포트가 IO 장치로 기능한다
- Input 포트에 packet이 도착하면 interrupt로 CPU에 알린다 -> Packet이 input 버퍼를 통해 memory에 복사된다 -> CPU가 destination IP를 가지고 forwarding table에서 올바른 output 포트를 찾는다 -> output 버퍼를 통해 memory의 packet 내용을 보낸다
- 즉 input -> memory, memory -> output 흐름이며 bus를 두번 지난다
- memory bandwith에 의해 제한되는데 memory 연산이 느려 이 방식은 느리다고 할 수 있다
Bus

- memory 방식과 다르게 bus를 한번만 지나며 input 포트의 버퍼에서 output 포트의 버퍼간에 직접 복사된다
- 중간에 공용 bus를 지나가기 때문에 직접 복사가 가능하다
- switching speed가 bus bandwith에 의해 제한된다
- Cisco 5600의 32 Gbps bus는 access network를 구성하는데 충분하다
- 하지만 공용 bus를 사용하기 때문에 전송 도중에 input에 다른 packet이 도착하면 동시에 전송될 수 없다
- 따라서 input buffer, output buffer 한 쌍이 독점하는 제약이 있다
Interconnection network

- crossbar 형태의 네트워크를 사용하며 중간에 있는 스위치를 통해 전달된다
- N개의 input과 M개의 output인 경우 N*M개의 interconnection points가 있어 모든 input과 output쌍들이 동시에 전송이 가능하다

- multistage 형태의 네트워크에서는 스위치 개수를 줄일 수 있다
- 한 packet이 쪼개져 스위치들을 통과하고 output 포트에서 다시 합쳐진다

- multistage 형태의 switching fabric 여러개를 병렬로 연결하면 속도 개선과 스케일링도 가능하다
- 위 예시는 Cisco CRS 라우터이며 3 stage로 구성된 fabric plane 8개를 병렬로 연결한다
- 무려 100's Tbps switching capacity를 가진다
memory 방식에서 느린 memory bandwith에 의한 제약을 극복하고자 bus 방식이 나왔다. 하지만 공용 bus를 사용한다는 점에서 한 쌍의 input, output 포트가 독점하는 제약이 생긴다. 이를 극복하기 위해 bus를 교차하여 switch를 두어 모든 input과 output 쌍이 동시에 전송할 수 있도록 만들었다. 더 나아가 이 네트워크를 병렬로 이어 연결하여 성능 향상 시켰다
-
Switch fabric의 처리 속도가 모든 input 포트를 합친 것보다 느리면 input 포트의 버퍼에서 packet 큐잉이 발생한다
-
packet 큐잉이 계속 누적되면 더 심한 큐잉 딜레이로 인해 buffer overflow가 발생하고 packet 손실이 일어난다
-
Head-of-the-Line (HOL) blocking은 input 버퍼 맨앞에 큐잉중인 packet 때문에 그 뒤에 있는 packet들이 앞으로 못가는 현상이다

-
위에서 첫번째 그리고 세번째 input 포트에서 switch fabric을 통해 똑같은 첫번째 output 포트로 packet을 forward하려 한다
-
첫번째 input 포트에서 첫번째 output 포트로 먼저 보내는 바람에 세번째 input 포트에서 packet이 대기중이다
-
이 대기중인 packet 때문에 뒤에 초록색 packet이 forwarding 되지 못하고 있고 이를 HOL Blocking 현상이라고 부른다
Output Port Function

- Switch fabric을 거친 후의 packet은 외부로 보내기 위해 먼저 output 버퍼에 잠시 저장된다
- 버퍼에 저장하는 이유는 link의 transmission rate R보다 switch fabric의 처리 속도 N*R가 빠를 수 있기 때문이다
- 버퍼링으로 조절하지만 버퍼 사이즈 제한이 있기 때문에 packet이 버려지는 buffer overflow가 발생할 수 있다
Buffer Size
- 그렇다면 버퍼의 크기를 늘려면 overflow가 안일어나지 않을까?
- 버퍼링을 늘리면 overflow날 확률은 낮아지지만 packet 딜레이가 길어진다
- RTTs가 길어지면 실시간 어플리케이션을 사용하는데 있어서 매우 낮은 성능을 보일 것이다
- bottleneck을 바쁘지면 너무 가득차지만 않게 유지하는 적당한 크기를 찾는게 중요하다
- 버퍼의 크기는 RTT C(capacity) 로 정하고 만약 N개의 flow가 있다면 (RTTC)/sqrt(N)가 된다
Buffer Management

Drop
- 버퍼가 가득하면 packet drop이 일어나는데 어떠 packet이 drop되는지 기준이 있다
- tail drop은 도착하는 packet을 drop하고 priority는 packet의 우선순위를 보고 drop한다
Packet Scheduling
- Packet scheduling은 다음에 어떤 packet을 링크로 보낼지 정하는 작업이다
- First come, first served
- Priority
- Round Robin
- Weighted Fair queueing
First Come First Served

- FCFS 방식은 패킷이 들어온 순서대로 output 포트로 보낸다
- tail drop : 방금 도착한 패킷을 버린다
- priority : 우선순위에 기반해 패킷을 버린다
- random : 랜덤으로 패킷을 버린다
Priority

- FCFS에서는 큐 하나에 packets를 넣었지만 priority 스케쥴링에서는 우선순위 클래스 마다 별도의 큐가 있어 해당하는 큐에 packet을 넣는다
- 우선순위가 높은 큐에 packet이 없을때만 우선순위가 낮은 큐에서 packet 처리한다
- 그림에서 1,2,3번 packet 순서로 들어왔지만 2번 초록색 낮은 우선순위 packet이 3번보다 나중에 처리됨을 확인할 수 있다
- 근데 낮은 순위 packet이 너무 처리를 못 받는게 아닌가?
Round Robin

- Priority 스케쥴링의 단점을 보완한다
- 우선순위 클래스 큐를 순서대로 돌아가면서 packet 하나씩 처리한다
- 만약에 어떤 특정 큐가 좀 더 숫자가 적다면 더 빨리 처리 될 수 있는 장점이다
Weighted Fair Queuing

- WRQ은 Round Robin 스케쥴링을 일반화한 방식이다
- 각각 우선순위 클라스를 번갈아 packet을 보내는 방식은 Round Robin과 비슷하지만 추가적으로 큐에 가중치(weight)를 둔다
- 우선순위 클라스의 클래스 전체 가중치 합 비중에 따라 한 사이클에서 처리되는 packet 개수가 결정된다
- 따라서 각각의 클래스는 최소 대폭역을 보장받는다
The Internet Protocol

- OSPF, BGP와 같은 라우팅 프로토콜들이 forwarding table을 참고하여 source부터 destination까지 길을 결정한다
- 라우팅 프로토콜이 동작하기 위해서는 IP 프로토콜과 ICMP 프로토콜 정보가 필요하다
- IP 프로토콜
- datagram 구성
- 주소와 주소 형태
- packet 처리 방식
- 에러 관련된 정보는 ICMP 프로토콜

- ver: IP 프로토콜 버전
- head. len: 헤더 길이 (bytes)이며 라우터에서 payload가 어디서부터 시작하는지 알 수 있다
- 주로 options가 없어서 20 bytes (그림상 4bye*5줄)
- length: 헤더와 payload를 합한 길이 (bytes)
- 최대 64k bytes이며 주로 1500 bytes 이하
- type of service: datagram 종류 구분
- time to live: 남아있는 hop 수이며 라우터 지나갈때마다 1씩 감속한다
- upper layer: payload가 전해질 계층이며 transport layer다
- 6: TCP segment
- 17: UDP segment
- 16-bit identifier, flgs, fragment offset: datagram이 작은 datagrams들로 쪼개졌을때 사용된다
- header checksum: datagram이 라우터를 지날때마다 ttl이 바뀌기 때문에 checksum은 매번 갱신된다
- destination IP address : 라우터의 destination base forwarding에서 올바른 output 포트를 찾는데 사용된다
- payload data: Transport layer segment
total size = segment header 20 bytes + datagram header 20 bytes + application data size
IP Addressing

- IP 주소는 각각의 라우터 또는 호스트의 interface를 식별하기 위한 32비트의 식별자다
- Interface는 호스트 및 라우터와 물리적 링크 간의 연결을 의미한다
- 한 router 또는 호스트가 여러 랜카드를 설치하면 여러 IP 주소를 가질 수 있다
사진상 같은 interface에 속해있는 IP 주소들이 조금씩 다른데 어떻게 host가 interface를 통해 물리적 링크와 연결되는가?
Subnet

- subnet이란 하나의 네트워크가 분할되어 나눠진 작은 네트워크이다
- 같은 subnet에 속해있는 기기들은 router 없이도 서로 data를 주고 받을 수 있다
- 그림에서 처럼 같은 interface에 속하면 같은 subnet 주소를 가진다
IP 주소 뒤에 붙는 /24 subnet address이란?
Classful Addressing

- IP 주소를 5개의 클래스 (A-E)로 나눠서 배분하는 방식이다
- TCP/IP 체계 도입 초반에 제안된 주소지정 개념이다

- 상위 Bit의 주소 시작값을 보고 클래스 판별한다
- 1 octet = 8 bit = 1 byte
- 오른쪽 그림은 최상위 Byte의 값의 범위를 십진수로 판별하는 방법을 알려준다.
- 네트워크 주소 필드에는 한 Byte당 한 Bit가 Parity Bit로 지정된다.
- ex) Class B의 2개 Parity Bit: 10으로 시작
- 한 기관이 클래스(A-E) 주소를 배정 받는다면 사용 가능한 주소가 너무 많이 남아 주소 낭비가 발생한다
어떻게 하면 효과적으로 주소를 나눠 배정할 수 있을까?
Classless InterDomain Routing(CIDR)

- IP 주소 형식인 a.b.c.d/x에서 x는 네트워크 주소에 해당하는 상위 비트 수이다
- /23 이면 이 주소의 상위 23비트가 subnet 주소이며 나머지는 host 주소이다
- 클래스를 나눠 배정하면 필요 이상의 사용 가능 주소가 주어지지만 CIDR를 사용하여 규격화된 구분없이 필요한 만큼만 유연하게 배정할 수 있다
효과적으로 주소를 나눌 수 있게 됐는데 host와 network는 어떻게 IP 주소를 배정받을까?
Dynamic Host Configuration Protocol (DHCP)
- 기존에는 시스템 관리자가 직접 IP 주소를 host 설정 파일에 기입했다
- 네트워크에 있는 DHCP 서버를 통해 host 스스로가 IP 주소를 자동으로 얻을 수 있다
- 주소의 재사용과 재갱신이 가능하다
- 외부로 나가는 first hop router의 주소, DNS 서버 이름과 주소, 그리고 네트워크 마스크도 제공한다

- DHCP 서버는 subnet에 연결된 모든 host들을 담당한다
- DHCP 서버 또한 subnet에 포함되기 때문에 같은 subnet 주소를 가진다
새로운 DHCP client가 IP 주소를 요청하면 어떻게 받을까?
DHCP Discover

- 서브넷에 DHCP service를 제공하는 서버가 존재하는지 묻는다
- client는 DHCP 메시지를 같은 서브넷 내 모든 host와 router로 보낸다

- DHCP 서버는 메세지를 listen중이며 UDP 67 포트를 사용한다
- client는 아직 IP 주소가 없어서 0.0.0.0이며 68 포트를 사용한다
- client가 메시지를 255.255.255.255로 보낸 이유는 서브넷 내 모든 host와 router가 전달 받을 수 있는 broadcast IP 주소이기 때문이다
- 나중에 transaction ID를 통해 요청에 대한 답변임을 확인할 수 있다
DHCP Offer

- DHCP 서버가 응답하면 다시 broadcast IP 주소로 정보를 보낸다
- yiaddrr이 client가 받을 IP 주소이며 lifetime 시간만큼 사용할 수 있다
- client 요청의 transcation ID와 같다
DHCP Request

- client가 원하는 IP 주소와 lifetime을 DCHP 서버에 요청한다
- 아직 주소를 확정짓지 못해 0.0.0.0이다
DHCP ACK

- DHCP Request에 대한 수락 답변이다
- DHCP Offer 이후에 끝내면 될 것 같은데 DHCP 서버가 한대만 있다는 보장이 없어 다시 Offer 내용을 Request 후 ACK을 받아 확정 짓는다
host가 어떻게 IP 주소를 받는지 알아봤는데 network는 어떻게 IP 주소를 받을까?
Network IP Address

- network는 상위 ISP 주소의 서브넷 주소로 할당 받는다
- 그림에서는 ISP 주소의 상위 20 bit를 가져와 3 bit 주소 공간을 8개로 서브네팅해 client network 8곳에 할당한다
Hierarchical Addressing: Route Aggregation

routing의 목적은 forwarding table을 형성하는 것이다.
예를 들어 한양대학교 소속 네트워크 8군데에서 자신의 IP 주소를 알리려고 한다 -> 상위 20 bit가 같다는 점을 이용해 상위 ISP 라우터에서 상위 20 bit prefix만 알린 -> prefix를 forwarding table에 넣는다
따라서 하나의 prefix를 사용하여 여러 IP 주소에 대한 destination을 설정할 수 있다 = aggregation

네트워크 200.23.18.0/23가 다른 ISP로 이동했다 -> 상위 ISP는 더 정확한 상위 23 bit prefix를 알린다 -> longest prefix matching 방식으로 packet forwarding하기 때문에 기존의 3 bit 짧은 200.23.16.0/20쪽으로 더 이상 가지 않는다
ISP IP Address
- Internet Corporatoin for Assigned Names and Numbers(ICANN)은 5개의 대륙별 인터넷 레지스트의 IP 주소를 할당한다
- 대륙별 레지스트는 지역별 레지스트 / ISP의 IP 주소를 배정한다
2^32 비트짜리 IP 주소를 할당하다보면 고갈되지 않을까?
Network Address Translation(NAT)

- 여러대의 컴퓨터를 사용하면서 IP 주소가 더 많이 필요해졌다
- 굳이 local network의 컴퓨터들을 외부에 있는 다른 컴퓨터들과 구별하지 않고 local network 내부에서만 서로 구별할 수 있으면 된다
- 그림 오른쪽처럼 local network 내부 기기들은 내부에서만 사용 가능한 32-bit private IP 주소를 갖는다
장점:
1. ISP는 public IP 하나만으로 local network 내 모든 기기들을 연결시킬 수 있다
2. 외부에 알리지 않고 private IP를 바꿀 수 있다
3. private IP를 유지한채 ISP를 바꿀 수 있다
4. 외부에서 local network 내 기기들에 직접적으로 닿을 수 없어 보안상 좋다
NAT Router

- local network에서 datagram이 나갈때 source IP 주소와 port 번호를 NAT IP 주소와 새로운 port 번호로 바꾼다
- 이전 (source IP 주소, port 번호) 와 바뀐 (NAT IP 주소, port 번호)을 NAT translation table에 기록한다
- 외부에서 datagram이 들어오면 NAT translation table를 참고하여 (NAT IP 주소, port 번호)를 (source IP 주소, port 번호)로 바꾼다

- 초기 NAT translation table은 비어있다
- host (IP 10.0.0.1, 포트 3345)가 웹 서버 (IP 128.119.40.186, 포트 80)로 datagram을 보낸다

-
datagram이 NAT 라우터에 도착하면 (IP 10.0.0.1, 포트 3345)를 (NAT IP 138.76.29.7, 포트 5001)로 바꾸고 NAT translation table에 기록한다
-
NAT 라우터는 바뀐 datagram을 웹 서버 (IP 128.119.40.186, 포트 80)로 보낸다

-
웹 서버 (IP 128.119.40.186, 포트 80)로 부터 NAT 라우터(NAT IP 138.76.29.7, 포트 5001)로 답장이 온다
-
NAT 라우터는 translation table을 참고하여 datagram 정보를 (IP 10.0.0.1, 포트 3345)로 바꾸고 보낸다
NAT Controversy
- layer 3 프로토콜이 포트번호를 조작한느 것은 원칙에 어긋난다
- IPv6로 IP 주소 고갈을 해결할 수 있다
- NAT traversal problem?
local network 기기가 외부의 서버에 접속하는 경우 local network 쪽에서 먼저 request를 보내기 때문에 문제가 없다. 하지만 client가 local network에 서버를 두는 경우 서버 주소가 private IP라서 client가 서버에 접속 할 수 없다
- 하지만 아직도 NAT는 home, institutional, 4G/5G cellcular network에서 많이 쓰이고 있다
주소 고갈 문제를 DHCP나 NAT 프로토콜로 완전히 해결 할 수는 없어 보인다. 그럼 다른 확실한 방법이 있을까?
IPv6
- 32 bit IPv4 주소 공간은 언젠가 고갈될텐데 주소 공간을 늘리자
- 더 빠른 forwarding과 processing을 할 수 있도록 헤더 사이즈를 40 byte로 고정하자

Same with IPv4
- version: 4 또는 6
- payload len: segment length
- next hdr: 상위 레이어의 프로토콜
- hop limit: 중개되는 횟수 (IPv4의 TTL)
- payload: segment
Edited from IPv4
- source/destination address: 기존의 32 bit를 128 bit 주소 공간으로 늘렸다
- hop limit: 중개되는 횟수 (IPv4의 TTL)
Added to IPv4
- flow label: IPv4에서는 같은 프로세스에서 출발한 datagram을 독집적으로 취급했지만 IPv6에서는 flow label을 부여하여 하나의 flow로 취급한다
- priority: priority scheduling에서 우선순위로 사용
Removed from IPv4
- option
- checksum: IPv4에서는 라우터를 거칠때 마다 checksum을 확인하고 문제가 있으면 버렸다. 현대 통신 기술이 발전하면서 에러 발생 확률이 낮아져 IPv6에서는 checksum을 없앴다
- fragmentation & reassembly
이미 IPv4로 설치 해놨는데 IPv6로 바로 바꿀수 있을까?
Transition from IPv4 to IPv6
- 엄청나게 많은 IPv4 라우터들이 있어 동시에 IPv6로 교체하는 것은 불가능하다
Tunneling 방식을 사용해 IPv4와 IPv6 라우터를 공존 시켜가며 교체중이다

- IPv4 라우터는 header가 다른 IPv6
datagram을 처리하지 못한다
- 하지만 IPv6 datagram을 payload로 두고 IPv4 헤더를 붙인다면 가능하다

- A(IPv6 라우터)에서 F(IPv6 라우터)로 datagram을 보내려고한다
- 중간에 IPv4 라우터들이 있어 tunneling을 해줄 IPv6/v4 라우터가 사이에 두개 필요하다

- 그림과 같이 IPv6/v4 라우터에서 datagram에 IPv4 헤더를 붙인다
- 마치 일반적인 IPv4 datagram인 것 처럼 만들어 IPv4 라우터들을 이동해 IPv6/v4 라우터로 도착한다
- 결과적으로 tunneling을 통해 A에서 IPv6 datagram이 IPv4 라우터들을 통과해 F로 도착한다
Generalized Forwarding (SDN)
- Destinationed based forwarding은 forwarding table에서 destination IP 주소에 대한 포트 번호를 확인하고 forward했다 (look up and forward)
- Generalized forwarding에서는 destination IP 뿐만 아니라 다른 header 필드 값도 비교하여 forward한다 (match + action)
- 따라서 사용자가 정한 정보의 집합에 기반해서 forwarding한다
- Forwarding table보다 더 자세한 정보들을 가지고 판단하는 flow table을 기반한다
- flow: header 필드의 flow 값으로 정의된다
- match: header 필드 값을 보고 실제 패턴이 맞는지 보는 작업이다
- actions: drop, forward, modify, matched datagram, or send matched datagram to controller와 같은 행동을 정의한 것이다
- priority: 겹치는 패턴에 대해 우선순위를 정의한다
- counters: 트래픽 양을 datagram 수와 바이트로 표시

- destination IP의 longest prefix가 3.4..인 datagram을 (match) 2번 포트로
forward 한다 (action)
- src IP의 longest prefix가 1.2.. 인 datagram (match)을 drop 한다 (action)
- src IP가 10.1.2.3이고 모든 destination IP인 datagram을 (match) sent to controller 한다 (action)
OpenFlow
- 네트워크 컨트롤러가 스위치망을 통해 네트워크 패킷의 경로를 정의하는 소프트웨어 정의 네트워크(SDN) 프로토콜.

- match할 header 필드 값들은 Link Layer, Network Layer, Transport Layer들을 모두 포함한다
- 그래서 포트 번호, 서비스 타입, source, destination IP 주소와 위와 같은 것들을 고려 할 수 있다

- OpenFlow를 이용한 Destinated base forwarding이다
- Destination IP 주소가 51.6.08인 datagram은 (match) 6번 포트로 보내기 (action)

- OpenFlow를 이용한 Firewall 설치다
- TCP destination 포트 22인 datagram은 (match) drop한다 (action)

- frame의 Link 계층 forwarding이다
- Destination 주소가 22:A7:23:11:E1:02인 frame은 (match) 3번 포트로 보내기 (action)
Router
match: longest destination IP prefix
action: forward
Firewall
match: IP address and TCP/UDP port number
action: permit/deny
Switch
match: destination MAC address
action: forward/flood
NAT
match: IP address and port
action: rewrite address and port
Middlebox

- source와 destination 사이 데이터 경로에서 라우터의 기능과 별도의 기능을 수행하는 중간 장치다
- NAT, firwall, loadbalancer, cache,
IDS, CDN 등 다양하다
- 초기에는 하드웨어에서만 관리되든 독점적인 해결책으로 개발됐지만 이후 open API를 구현하는 whitebox 하드웨어로 이동했다
- 이를 통해 match+action을 통한 local action들이 프로그래밍 가능해졌다

- 모든 internet connected device는 해당 프로토콜들이 구현되어 있어야한다
- 그림에서 network 계층에는 network core인 IP 프로토콜 하나 밖에 없다
- core는 simple해야한다!

- middlebox 덕분에 network 계층에도 프로토콜들이 생겼는데 이는 end-end argument에 위배되는 기능들이다


- 초반에는 core에만 intelligence가 있었다
- 인터넷 초기에는 intelligence가 host로 옮겨졌다
- 이후 지금은 host와 core에도 intelligence들이 추가되고 있다 (ex. SDN)
지금까지 forwarding table과 flow table를 통해 forwarding하는 과정을 봤는데 이 table들은 어떻게 생성될까?