Network layer
- network : host to host
- 모든 호스트와 라우터에 구현되어 있어야 함
forwarding and routing
- forwarding : 들어온 페킷의 해더를 체크해서 어떤 링크로 보낼지 정하는 것
- routing : source to destination의 경로를 정하는 것
Data plane and control Plane
- data plane : 페킷이 input port로 들어오면 output port로 보내는일 -> forwarding기능 수행
- control plane : 네트워크 전체를 거친 로직 수행(경로를 설정하는 것)
Per-router control plane
- 각각의 라우터가 알고리즘을 수행, 상호작용

- 실제로 옮기는 것 : data plane : forwarding
- 경로를 생성하는 것 : control plane : routing
- control plane이 각각의 라우터에 존재함
Centralized control plane
- 중앙의 컨트롤러가 모든 라우터의 포워딩 테이블을 계산하고 라우터의 CA에게 전송

- 라우터는 전송만 하고 계산은 안하는 방법
- 장점 : 각각의 순간에 정보를 받아서 모으기 때문에 정보의 일관성이 있음(per-router 방법은 보내는 도중 링크가 끊어져 상태가 달라질수도 있다.)
Network service model
- individual datagram
- guranteed delivery : 페킷 전송을 보증
- flow(페킷들) of datagram
- in-order datagram delivery : 플로우를 순서대로 전송
- guaranteed minimum bandwidth to flow : 최소한의 bandwidth 보장
- restrictions on changes in inter-packet spacing : 페킷 간의 전송 간격을 어느정도로 보장해주는 것
inside a router

- input port, output port, routing processor, switching fabric 4개의 구성요소
- routing의 결과는 forwarding 테이블 : 테이블은 input port각각에 써줌

- 신호를 받아서 bit로 만들고 lonk 레이어로 전송
- lookup, forwarding : 포워딩 테이블을 참조해서 output port로 보내줌
output port로 보내는 방법
- destination-based forwarding : 목적지만 중심으로 결정
- generalized forwarding : 헤더에 있는 모든 필드를 참조해서 결정(desination-based 포워딩은 이 방법중에 하나임)
destination-based forwarding
- forwarding 테이블 : 주소를 구간을 나누어 각각의 구간마다 목적지가 정해짐
- Longest prefix matching : 하나의 주소가 여러개의 address range에 매칭되면 와일드카드가 가장 적은곳에 매핑 시킴 = 더 길게 매칭되는 range에 매핑

- 와일드카드가 ~~~ 00011 *** 적용되면 2개다 매칭 되지만 1번이 더 길게 매칭되기 때문에 1로 보냄
- range가 굉장히 많기 때문에 TCAMs라는 하드웨어를 사용
Switching fabrics
- 경로는 정해졌고 그 경로대로 output port로 전송

- memory :
메모리에서 계산하고 output으로 : bus를 2번 거침 -> 속도가 느림
- bus : bus를 한번 사용해서 바로 보냄 : 어느 한 순간에 하나의 input만 보낼 수 있음
- crossbar : 여러개의 input port가 동시에 전송 가능
여기서 초록색은 동시에 보내는게 없어서 원래 갈 수 있었는데 앞의 빨간색에 막혀서 못감 : Head-of-the-line-blocking
Output ports

- buffering : 보내는 속도보다 더 빨리 올 수 있으므로
- scheduling discipline : 큐에서 맨 앞에서 보낼건지 중요도에 따라서 보낼건지
- 버퍼의 크기 :

- 버퍼의 크기가 크면 로스는 잘 안 일어나도 큐잉 딜레이가 길어질 수는 있음
Scheduling mechanisms
- FIFO : 그냥 기본
- discard policy : 큐가 꽉차면 뭘 버릴지
- tail drop : 마지막에 들어온 애를 버림
- priority drop : 우선도에 따라 버림
- random drop : 랜덤
priority

- 우선순위가 높은 큐에서 먼저 보내는 방법

- 중간에 끊는건 없음
Round Robin
Weighted Fair Queing

- 한번씩 보내긴 하지만 한번에 weight만큼 보내기
IP : Internet Protocol
- 최소가 20바이트 + 옵션

- TCP + IP의 헤더 = 40바이트 + app layer 크기를 전송함
IP fragmentation and reassembly
- MTU : 링크별 최대 전송가능 크기
- 페킷의 크기가 MTU보다 크면 한번에 못 보내고 짤라서 여러번 보냄 : fragmentation
- 한번 짜르면 짜른 상태로 보내고 마지막에 다 받고 합침 : reassembly(헤더에 다시 붙이기 위한 정보를 보내야함)

- MTU가 1500일때(헤더 20) 헤더 포함 1500으로 짜르고 나머지에 헤더 붙이기 3980 - (1480 + 1480) = 1020
- ID는 다 같아야 함, fragflag : 마지막만 0
- offset : 나눈거의 처음 바이트의 번호를 8로 나눈 걸 적음 -> 처음 : 0~1479바이트 그 다음은 1480부터 시작이라 1480/8인 185를 적고 마지막은 2960/8인 370 8로 나누는 이유는 크기 줄일려고
IPv4 addressing
- IP address : 32bit의 호스트, 라우터의 인터페이스를 구분
- interface : 호스트 라우터와 물리적 링크를 연결해주는 장치 -> 각각의 인터페이스마다 주소를 가지고 하나가 여러개를 가질 수도 있음
Subnet
- 32비트를 subnet과 host로 나눔
- subnet part가 같으면 물리적으로 바로 무언가를 보낼 수 있음
- subnet mask : /24 --> 223.1.1.0/24 이런식으로 표현하면 223.1.1이 subnet파트
- 라우터가 없이 페킷이 전송 가능한 것들
서브넷이 6개인 예시
- CIDR : Classless InterDomain Routing : 서브넷의 비트수가 정해져 있지 않은 방법
- 과거에는 클래스가 정해져 있었고 그에 따른 서브넷의 비트수도 정해져있었음 -> 그래서 남은 비트로만 주소를 할당 가능한데 모자라면 8비트를 더 추가한걸 사야했음 -- 24비트 중 16비트가 서브넷파트이면 2^8개가 주소 할당 가능 개수
how to get IP address
- DHCP : Dynamic Host Configuration Protocol : host가 서버로부터 자동으로 주소를 얻음
- 일정시간이 지나면 자동으로 갱신, 시간이 지나도 갱신을 안하면 자동으로 반납

- 접속하면 자동으로 discover를 보냄 : 구성원 모두가 받는데 받는 애중 서버가 아니면 그냥 무시하면 됨
- offer : 서버에서 보내는데 이것도 대상자를 모르기 떄문에 모두에게 보냄(transection번호는 같아야함)
- request : 오퍼 받으면 요청
- ack : 요청 허가 마지막 2개는 transection번호 다름

- DHCP : more than IP address : ip주소만 주는 것이 아님
- 서브넷 이외에 외부로 보내기 위해서는 라우터의 인터페이스 정보를 알아야함
- DNS서버 이름도 보내줌
- network mask : 서브넷 파트의 비트 개수
서브넷의 내부를 또 서브넷으로 나누는 느낌

- 계층적으로 주소를 분류해서 그 아래에 해당하는 모든 경로가 그 위로 가는 식으로 처리
- IP가 통쨰로 옮겨가면 그것만 위에서 추가하는데 이러면 이전과 옮겨간 곳 두개에서 위의 계층에서 해당되게 되지만 더 많이 매칭된 곳으로 보내기 때문에 옮겨가도 문제가 없다.
NAT : network address translation
- 내부적으로 내부 호스트에 ip주소를 부여하고 내부끼리는 바로바로 전송가능하게 함
- 외부는 라우팅 테이블을 생성할 방법이 없기 때문에 1개의 라우터를 통해서 해야함
- 장점 : 한 개의 외부 ip주소로 여러개의 호스트 연결, 내부에서 주소를 변경 가능(외부와 상관 없음), 내부의 변경 없이 ISP를 자유롭게 변경가능, 해킹에 안전함
- router의 역할
- 일단 내부끼리의 통신에는 관여 x
- outgoing : 외부로 보내는 데이터 : source IP와 PORT번호를 NAT IP addres, 새로운 포트 번호로 치환(기존은 10.0.0의 ip인데 이걸 외부 ip로 바꾸는 거임
- remember : NAT translation table : 치환 정보를 테이블에 저장 해야함
- incoming : 데이터가 오면 테이블을 확인해서 매핑정보에 맞게 다시 바꿔서 호스트로 보내줌

- 라우터에서 포트번호를 바꿔야 하는데 이건 transport레이어 에서 해야한다는 의견도 있음
- p2p는 NAT내부에 있으면 코드가 굉장히 복잡해 질수 있다.
IPv6
- 40바이트의 고정된 헤더를 사용
- no fragmentation allowed : 데이터를 쪼개는걸 없애버림 -> 처음부터 작게 보내기

changes from IPv4
- checksum : IPv6에서 사라짐 : 그냥 위에 translation에서만 체크하게
- ICMPv6 : ICMP의 새로운 버전
Transition IPv4 to IPv6
- tunneling : IPv4만 이해하는 라우터에 6버전을 보낼때 4버전 포멧 안에 6의 데이터를 통쨰로 보내버림 그래서 사용한 기법

- 터널로 보내도 IPv4의 라우터를 지나가긴 함