## 1. IPv4의 한계와 해결책
<br>
**IPv4의 한계**
- **주소 공간의 한계** : 인터넷 사용자가 급격히 증가함에 따라 32비트 주소 체계가 부족해짐
- 패킷 우선순위 지정 및 대역폭 예약과 같은 QoS 기능을 효과적으로 지원하지 못함
<br>
### 1-1. CIDR
![[Network Layer - Figure 7.8 Slash notation (CIDR).png|center|500]]
- IP 주소를 네트워크 클래스에 따라 할당하는 대신, **필요한 만큼의 주소 블록을 유연하게 할당하는 방식**
- 슬래시(/)를 사용하여 prefix 길이를 지정함
- **주소 효율성**: 필요한 만큼의 주소 블록을 할당하여 주소 공간을 더 효율적으로 사용함
- 라우팅 테이블 축소: 라우팅 테이블의 항목 수를 줄여 네트워크 성능을 향상시킴
<br>
### 1-2. NAT: network address translation
![[Network Layer - NAT- network address translation.png|center|500]]
- **네트워크 주소 변환 기술로, 로컬 네트워크의 모든 장치들이 하나의 IPv4 주소를 공유하여 외부와 통신할 수 있도록 하는 기술**
- 로컬 네트워크를 떠나는 모든 패킷은 동일한 NAT IP 주소를 가지지만, 서로 다른 포트 번호를 가짐
- 로컬 네트워크의 모든 장치들은 “프라이빗” IP 주소 공간(10/8, 172.16/12, 192.168/16 prefixes)을 사용함
- **IP 주소 절약** : 모든 장치에 제공자 ISP로부터 단 하나의 IP 주소만 있으면 됨
- **주소 변경 유연성** : 로컬 네트워크 내 호스트의 주소를 외부 세계에 알리지 않고 변경할 수 있음
- **ISP 변경 용이성** : ISP를 변경해도 로컬 네트워크 내 장치의 주소를 변경할 필요가 없음
- **보안 강화** : 로컬 네트워크 내 장치는 외부 세계에서 직접 주소 지정이 불가능하고 가시적이지 않음
<br>
**구현 방법**
- 모든 출발 데이터그램의 (출발지 IP 주소, 포트 번호)를 (NAT IP 주소, 새로운 포트 번호)로 대체함
- 원격 클라이언트/서버는 (NAT IP 주소, 새로운 포트 번호)를 목적지 주소로 사용하여 응답함
- **NAT 변환 테이블**에 각 (출발지 IP 주소, 포트 번호)와 (NAT IP 주소, 새로운 포트 번호) 변환 쌍을 기억함
- 도착 데이터그램의 목적지 필드에서 (NAT IP 주소, 새로운 포트 번호)를 NAT 테이블에 저장된 해당 (출발지 IP 주소, 포트 번호)로 대체함
<br>
**문제점**
- 라우터는 오직 네트워크 계층(레이어 3)까지만 처리해야 한다는 관점이 있는데, NAT는 전송 계층(레이어 4)까지 영향을 미침
- IP 주소 부족 문제는 IPv6로 해결되어야 한다고 주장함 (더 많은 주소 공간을 통해 해결)
- NAT는 네트워크 계층 장치가 포트 번호를 조작하기 때문에 종단 간 원칙(**end-to-end argument**)을 위반함
- 네트워크의 기능이 end 시스템에서만 구현되어야 한다는 개념
- NAT 테이블은 내부 네트워크 장치가 외부 네트워크로 데이터그램을 보낼 때 생성되므로 내부 네트워크 장치가 먼저 외부 네트워크로 데이터를 보내야만 테이블이 생성된다는 문제가 있음
- 외부에서의 접근 제한, 연결 초기화 문제 등등
- <span style="color:rgb(186, 186, 186)">이를 위해 포트 포워딩이나 UPnP 같은 기술을 써서 NAT 라우터에서 특정 포트를 미리 개방해 두는 방법이 있음</span>
<br>
그럼에도 불구하고 NAT은 IP 주소 절약과 보안 측면에서 실질적인 장점을 제공하기 때문에 가정과 기관 네트워크, 4G/5G 셀룰러 네트워크에서 광범위하게 사용되고 있음
<br>
### 1-3. IPv6
- 1990년대 초반, IPv4 주소 공간의 고갈과 기타 문제점 때문에 새로운 IP 프로토콜이 필요해짐
- **주소 공간 확장** : IPv6 주소 공간은 $2^{128}$개의 주소를 포함하고 있음
- 340, 282, 366, 920, 938, 463, 374, 607, 431, 768, 211, 456
- IPv4 주소 공간의 $2^{96}$배로, 사실상 주소 고갈이 없음
- **속도 향상** : 40바이트 고정 길이 헤더를 사용하여 처리와 전달 속도를 높임
- 특정 데이터 흐름에 대해 차별화된 처리가 가능해짐
<br><br>
**Representation, 표현 방법**
- IPv6 주소는 128비트(16바이트)로, IPv4 주소 길이의 4배임
- 약어 사용 : IPv6 주소가 매우 긴 관계로 많은 숫자가 0으로 이루어짐
1. **선행 0 생략:** 섹션의 선행 0은 생략할 수 있음
- 0074 → 74, 000F → F, 0000 → 0, 3210 → 3210
2. <mark style="background: #FFF3A3A6;">**0 압축**</mark>: 연속된 0으로 이루어진 섹션은 모두 생략하고 이중 세미콜론(::)으로 대체할 수 있음
- zero compression은 주소당 한 번만 허용됨 (가장 긴 곳에 적용)
- FDEC:0000:0000:0000:0000:BBFF:0000:FFFF → FDEC:0:0:0:0:BBFF:0:FFFF → FDEC::BBFF:0:FFFF
<br><br>
**Address Space, 주소 공간**
- IPv6 주소 공간은 $2^{128}$개의 주소를 포함하고 있음
- 340, 282, 366, 920, 938, 463, 374, 607, 431, 768, 211, 456
- IPv4 주소 공간의 $2^{96}$배로, 사실상 주소 고갈이 없음
- 세 가지 주소 유형
- **Unicast 주소:** 하나의 특정 장치에 대한 주소.
- **Anycast 주소**
- 하나의 주소를 공유하는 여러 컴퓨터 그룹을 정의함.
- 패킷은 여러명 중에 가장 가까운 멤버 하나에게 전달됨
- inquiry에 응답할 수 있는 여러 서버가 있는 경우에 사용됨
- **Multicast 주소:** 여러 장치에게 동시에 전달되는 주소
<br><br>
**주소 공간 할당**
- IPv6 주소 공간은 다양한 크기의 여러 블록으로 나뉘며, 각 블록은 특정 용도로 할당됨
- 많은 블록이 아직 할당되지 않았으며, 미래에 사용을 위해 예약되어 있음
- 아래 표는 할당된 블록만 보여줌
- 마지막 열은 전체 주소 공간에서 각 블록이 차지하는 비율을 나타냄
- 3비트만 봤을 때 2가 된다면 그건 Global unicast 주소다(?)
![[Network Layer - Table 7.5 Prefixes for assigned IPv6 addresses.png|center|400]]
- **Global Unicast 주소 할당**
- Global Unicast 주소 할당을 위한 **CIDR (Classless Inter-Domain Routing)** 주소 블록은 2000::/3 (크기: $2^{125}$ 비트)임
- Global Unicast 주소인 경우에는 세 부분으로 나눔
- global routing prefix (n bits) : 인터넷을 통해 패킷을 라우팅하는 데 사용됨
- ISP와 같은 조직이 이 블록을 소유함
- n = 48: 3 bits (001, fixed) + 45 bits (for $2^{45}$ sites)
- Subnet identifier (m bits)
- Interface identifier (q bits)
- n=48, m=16, q=64 정도로 권장함
![[Network Layer - Figure 7.41 Global unicast address.png|center|600]]
- **link layer 주소와의 관계, interface identifier**
- IPv6 주소 체계는 호스트 ID와 링크 계층 주소 간의 상관 관계를 허용함
- IPv4 주소 체계에서는 link layer 주소가 일반적으로 호스트 ID보다 훨씬 길기 때문에 이러한 관계가 존재하지 않음
- 길이가 64비트 이하인 link layer 주소는 전체 또는 일부가 interface identifier에 포함될 수 있음
- 64-bit extended unique identifier (EUI-64) defined by IEEE
- 64비트 물리적 주소를 매핑하려면, 인터페이스 주소를 정의하기 위해 이 형식의 글로벌/로컬 비트를 **0에서 1로 변경해야 함**
- 48-bit link-layer address defined by Ethernet
- 48비트 Ethernet 주소를 64비트 인터페이스 식별자로 매핑하려면, **로컬/글로벌 비트를 1로 변경하고 추가로 16비트를 삽입해야 함**
- 추가 비트는 15개의 1과 하나의 0으로 정의되며, 이는 $FFFE_{16}$으로 표시함
![[Network Layer - Mapping EUI-64, Mapping Ethernet MAC Address.png|center|500]]
![[Network Layer - Example 7.25.png|center|500]]
- **Example 7.25** - 조직이 블록을 할당받았을 때, 이 조직의 첫 번째와 두 번째 서브넷의 CIDR 표기법은?
- IPv6 주소는 128비트이며, /48은 첫 48비트가 네트워크 부분임을 의미함
- 나머지 80비트는 서브넷 및 호스트 부분으로 사용할 수 있음
- 여기서 서브넷팅을 통해 서브넷을 구분함
- 서브넷 식별자를 추가하여 전체 64비트 네트워크 주소를 만들어야 함. 즉, /48에서 /64로 확장
- 첫 번째 서브넷은 서브넷 식별자 $0001_{16}$을 사용해야 하고, 두 번째 서브넷은 서브넷 식별자 $0002_{16}$을 사용해야 함
- 첫 번째 서브넷: 2000:1456:2474:0001/64
- 두 번째 서브넷: 2000:1456:2474:0002/64
![[Network Layer - Example 7.26.png|center|500]]
- **Example 7.26** - EUI의 물리적 주소가 있을 때, 이더넷 주소 형식을 사용하여 interface identifier 찾기
- 첫 8비트의 7번째 비트를 0에서 1로 바꾸고, colon hex notation으로 적으면 됨
- **notation 방법 주의하기** (이더넷 주소 표기법)
![[Network Layer - Example 7.27.png|center|500]]
- **Example 7.27** - 이더넷 물리적 주소가 있을 때, 이더넷 주소 형식을 사용하여 interface identifier 찾기
- 첫 8비트의 7번째 비트를 0에서 1로 바꾸고, 첫 24비트 뒤에 $FFFE_{16}$ 추가하기
![[Network Layer - Example 7.28.png|center|500]]
- <mark style="background: #FF5582A6;">**Example 7.28** - 조직이 블록을 할당받았을 때 세 번째 서브넷의 IPv6 주소 구하기</mark>
- **Interface identifier 생성**
- IEEE 물리 주소 $(F5-A9-23-14-7A-D2)_{16}$
- 이더넷 주소 형식에서는 48비트 주소를 64비트로 변환하기 위해, 중간에 FF:FE를 추가하고 첫 번째 옥텟의 7번째 비트를 0에서 1로 변경함
- 변환된 interface identifier는 F7A9:23FF:FE14:7AD2
- **global prefix 및 subnet identifier 할당**
- 2000:1456:2474:0003
- **전체 IPv6 주소 조합**
- 2000:1456:2474:0003:F7A9:23FF:FE14:7AD2**<mark style="background: #FFF3A3A6;">/128</mark>**
- 꼭 끝에 어디까지 네트워크 주소인지 명시하기
<br><br>
**Special Addresses**
![[Network Layer - Table 7.5 Prefixes for assigned IPv6 addresses.png|center|400]]
- prefix (0000::/128) 을 가지는 주소
1. **미지정 주소 (Unspecified Address)**
- 주소: 0000::/128 (모두 0)
- 용도: 호스트가 자신의 주소를 모를 때, 부트스트랩 과정 중 문의를 보내기 위해 사용함
2. **루프백 주소 (Loopback Address)**
- 주소: 0000::1/128
- 용도: 호스트가 자신에게 패킷을 보낼 때 사용함 (IPv4에 있던 거. 디버깅용. 마지막 비트만 1)
3. **호환 주소 (Compatible Address)**
- 주소: 0000::/96 (0000 0000으로 시작. 그 뒤로 96비트까지는 알아서 주소 설정)
- 용도: IPv6를 사용하는 컴퓨터가 다른 IPv6 컴퓨터에 메시지를 보낼 때 사용함
4. **매핑된 주소 (Mapped Address)**
- 주소: 0000::FFFF/96
- 용도: IPv6로 마이그레이션된 컴퓨터가 여전히 IPv4를 사용하는 컴퓨터에 메시지를 보낼 때 사용함
![[Network Layer - Special Addresses.png|center|400]]
<br><br>
**기타 할당된 블록들**
![[Network Layer - Other Assigned Blocks.png|center|600]]
1. **Unique Local Unicast Block**
- 사이트가 자체적으로 생성하여 사용하는 사설 주소
- 이 주소를 목적지로 사용하는 패킷은 라우팅되지 않음
- 1111 110; 다음 비트는 0 또는 1로 설정되어 주소가 로컬에서 또는 기관에 의해 선택되었음을 정의.
- 그 다음 40비트는 사이트에서 무작위로 생성됨
2. **Link Local Addresses**
- 네트워크 내에서 사설 주소로 사용됨
- 10비트 블록 식별자 1111111010을 사용하고, 그 다음 54비트는 0으로 설정됨
- 마지막 64비트는 각 컴퓨터의 인터페이스를 정의하는 데 사용됨
3. **Multicast Addresses**
- 호스트 그룹을 정의하는 데 사용됨
- 모든 멀티캐스트 주소는 프리픽스 11111111 (8비트)을 사용함
- flag는 그룹 주소를 영구적 또는 일시적으로 정의함
- **permanent** : 인터넷 당국에 의해 정의되며 항상 접근할 수 있음
- **transient** : 임시적으로 사용됨
<br><br>
**Autoconfiguration, 자동 구성**
- autoconfiguration : 네트워크에 연결된 장치가 스스로 IP 주소를 설정하는 방법
- **IPv4** : 네트워크 관리자에 의해 수동으로 설정되거나 동적 호스트 구성 프로토콜(DHCP)에 의해 자동으로 설정됨
- **IPv6** : DHCP 프로토콜을 사용하여 IPv6 주소를 호스트에 할당할 수 있지만, 호스트가 스스로 주소를 구성할 수도 있음
1. 호스트가 **link local address**를 생성함
- 10-bit prefix (1111 1110 10) + 54 zeros + 64-bit interface identifier
2. **고유성 테스트**
- 호스트는 link local address가 다른 호스트에 의해 사용되지 않는지 확인함
3. **고유성 테스트 통과 시**
- 호스트는 이 주소를 link local address로 저장함 (사설 통신용)
- 여전히 global unicast address가 필요하기에, 호스트는 로컬 라우터에 메시지를 보냄
- 네트워크에 라우터가 있으면, 호스트는 global unicast prefix와 subnet prefix를 포함하는 메시지를 수신함
- 이를 인터페이스 식별자에 추가하여 global unicast address를 생성함
![[Example 7.29-1.png|center|500]]
![[Example 7.29-2.png|center|500]]
- **Example 7.29** - 호스트의 글로벌 유니캐스트 주소 구하기
- **1단계: 인터페이스 식별자 생성**
- **Ethernet 주소:** F5-A9-23-11-9B-E2
- **변환 규칙:** 첫 번째 옥텟의 7번째 비트를 0에서 1로 변경하고, FF:FE를 추가함
- **결과:** F7A9:23FF:FE11:9BE2
- **2단계: 링크 로컬 주소 생성**
- **프리픽스:** FE80::
- **인터페이스 식별자**: F7A9:23FF:FE11:9BE2
- **링크 로컬 주소:** FE80::F7A9:23FF:FE11:9BE2
- **3단계: 라우터 광고 메시지 수신**
- 호스트는 라우터로부터 글로벌 유니캐스트 프리픽스와 서브넷 식별자가 포함된 메시지를 수신함
- **프리픽스:** 3A21:1216:2165
- **서브넷 식별자:** A245
- **결합:** 3A21:1216:2165:A245
- **4단계: 글로벌 유니캐스트 주소 생성**
- **프리픽스 및 서브넷 식별자:** 3A21:1216:2165:A245
- **인터페이스 식별자 추가:** F7A9:23FF:FE11:9BE2
- **글로벌 유니캐스트 주소:** 3A21:1216:2165:A245:F7A9:23FF:FE11:9BE2
<br><br>
**IPv6 Protocol**
![[Network Layer - Figure 7.46 IPv6 datagram.png|center|400]]
**- 데이터그램 포맷**
- **Version:** 4-bits 버전 정보 필드로, IPv6 프로토콜 버전(6가지)을 정의함
- **Traffic class:** 8-bits. 다른 전송 요구 사항을 가진 페이로드를 구분하기 위해 사용
- IPv4의 서비스 타입 필드와 비슷함
- **Flow Label:** 20-bits. 특정 데이터 흐름에 대한 특별한 처리를 제공하기 위해 설계됨
- **Payload Length:** 16-bits. 헤더를 제외한 IP 데이터그램의 길이를 정의함
- **Next Header:** 8-bits. 첫 번째 확장 헤더(있는 경우) 또는 기본 헤더 다음에 오는 데이터의 유형을 정의함
- **Hop Limit:** 8-bits. TTL(Time to Live) 필드와 동일한 목적을 수행
- **Concept of Flow and Priority in IPv6**
- 초기 IP 프로토콜은 connectionless하게 설계됨
- 현재는 connection-oriented 프로토콜로 사용하는 경향이 있음 (ACK 줘잉)
- MPLS 기술 : IPv4 패킷을 MPLS 헤더에 레이블 필드를 사용하여 캡슐화할 수 있음
- 버전 6에서는 플로우 레이블(flow label)이 직접 IPv6 데이터그램 형식에 추가되어 IPv6를 연결지향 프로토콜로 사용할 수 있게 함
- **Fragmentation and Reassembly**
- **<mark style="background: #FFF3A3A6;">IPv6 데이터그램은 source(시작지)에서만 쪼개질 수 있고 라우터에서는 쪼개지지 않음</mark>**
- 재조립은 마찬가지로 목적지에서 이루어짐
- **Extension Header**
![[Network Layer - Extension Header.png|center|400]]
<br><br>
**ICMPv6 Protocol**
- ICMPv4보다 더 복잡해짐
- 몇 가지 프로토콜이 추가되고 새로운 메시지들이 추가됨
- 이웃 탐색 (Neighbor-Discovery, ND) 프로토콜과 역방향 이웃 탐색 (Inverse-Neighbor-Discovery, IND) 프로토콜
- Membership-query 과 membership-report 메시지
<br><br>
**IPv4 to IPv6**
- **Dual Stack**
![[Network Layer - Figure 7.51 Dual stack.png|center|500]]
- 가장 많이 쓰이는 방법
- 인터넷의 모든 호스트가 IPv6를 사용할 때까지 스테이션은 IPv4와 IPv6를 동시에 실행함
- 호환성 유지 및 점진적 전환 지원
- **Tunneling**
![[Network Layer - Figure 7.52 Tunneling strategy.png|center|500]]
- 두 대의 IPv6 컴퓨터가 서로 통신해야 하지만, 패킷이 IPv4를 사용하는 지역을 통과해야 하는 경우에 사용되는 전략
- IPv6 패킷이 IPv4 지역에 진입할 때 IPv4 패킷으로 캡슐화되었다가 이 지역을 벗어나면 캡슐화가 해제됨
- IPv4 패킷이 IPv6 패킷을 데이터로 운반하고 있음을 명확히 하기 위해 프로토콜 값이 41로 설정됨
- **Header Translation**
![[Network Layer - Figure 7.53 Header translation strategy.png|center|500]]
- 인터넷의 대부분이 IPv6로 전환되었지만 일부 시스템이 여전히 IPv4를 사용하는 경우 필요함
- 송신자가 IPv6를 사용하고 싶지만 수신자가 IPv6를 이해하지 못할 때
- 헤더 변환을 통해 IPv6 패킷의 헤더가 IPv4 헤더로 완전히 변환됨
- IPv6와 IPv4 간의 호환성 유지
<br><br><br><br>
## 2. 라우팅 프로토콜
- **라우팅 프로토콜의 목표**
- 호스트에서 목적지 호스트로 데이터를 전달하는 “좋은” 경로를 찾는 것
- 경로 : 주어진 출발지 호스트에서 최종 목적지 호스트까지 데이터 패킷이 거치는 라우터들의 연속
- **“좋은” 경로**: 비용이 가장 적거나, 가장 빠르거나, 혼잡이 가장 적은 경로
- **그래프로 추상화**
- 좋은 경로를 찾기 위해 네트워크를 그래프로 추상화하고, 링크 비용을 정의함
- $C_{a,b}$ = 노드 a와 b를 연결하는 직접 링크의 비용 e.g. $C_{u,z} = \infty$ 이면 u와 z 사이에 링크가 없음을 의미함
- 비용은 네트워크 운영자가 정의하며 상황에 따라 다름
- **라우팅 알고리즘 분류**
- **global vs decentralized(분산)**
- **global** : 모든 라우터가 네트워크의 전체 토폴로지와 링크 비용 정보를 가지고 있어서, 모든 라우터가 네트워크 전체를 보고 가장 좋은 경로를 계산함 **(e.g. link state 알고리즘)**
- **decentralized** : 라우터가 자신의 이웃과만 정보를 교환하고, 이 정보를 바탕으로 최적의 경로를 점진적으로 계산함 **(e.g. distant vector 알고리즘)**
- **static vs dynamic**
- **static** : 경로가 잘 변하지 않으며, 초기 설정 후 큰 변경이 없을 때 유리함
- **dynamic** : 네트워크 상태 변화에 빠르게 반응하여 경로를 업데이트함. 네트워크의 실시간 상태에 따라 최적의 경로를 유지하는 데 유리함 (주기적인 업데이트 또는 링크 비용 변화에 즉각적으로 대응)
<br><br>
**link state 알고리즘**
![[Network Layer - Dijkstra’s algorithm an example.png|center|600]]
- **전체 그림과 정보 수집**\
- **centralized**: 네트워크 토폴로지와 링크 비용이 모든 노드에게 알려져 있음
- link state broadcast를 통해 이루어지며, 모든 노드가 동일한 정보를 가짐
- flooding : 링크 상태 정보를 받은 노드가 주변 노드에게 다시 보내고 중복된 정보는 무시함
- **Dijkstra’s algorithm**을 사용함
- 앞선 정보를 바탕으로 다익스트라 알고리즘을 써서 출발지에서 모든 목적지까지의 최소 비용 경로를 계산함
- **최소 비용 경로**를 한 노드(출발지)에서 연결된 다른 모든 노드로 계산하고, 이 정보를 바탕으로 해당 노드의 포워딩 테이블을 만듦
- 이 과정을 **반복**해서 모든 목적지에 대한 최소 비용 경로를 알게 됨
- **효율성 및 복잡도**
- 다익스트라 알고리즘의 시간 복잡도는 일반적으로 $O(n^2)$ 이지만, 더 효율적인 구현으로 $O(n \log n)$이 가능함
- 메시지 복잡도는 각 라우터가 자신의 상태를 방송하는 횟수와 관련이 있음
- 한 소스에서 방송 메시지를 보내기 위해 $O(n)$ 의 링크를 교차함
- 각 라우터의 메시지는 $O(n)$ 의 링크를 교차하기 때문에 전체 메시지 복잡도는 $O(n^2)$
- **oscillations 문제**
- link cost가 트래픽 양에 따라 변할 경우, 경로 선택이 변동될 수 있음
- 네트워크 안정성에 영향을 미침
<br><br>
**distance vector 알고리즘**
![[Network Layer - Bellman-Ford Example.png|center|600]]
- <mark style="background: #FFF3A3A6;">**Bellman-Ford(BF) 방정식**에 기반한 동적 프로그래밍</mark>
- 각 노드는 주기적으로 자신의 거리 벡터($D_v$) 추정치를 이웃에게 보냄
- 노드 x가 이웃으로부터 새로운 $D_v$ 추정치를 받으면, Bellman-Ford 방정식을 사용해 자신의 $D_v$를 업데이트함
- $D_x(y) \leftarrow \min_v \{c_{x,v} + D_v(y)\}$ for each node $y \in N$
- $D_x(y)$: x에서 y까지의 최소 코스트
- 자연스러운 조건 하에서, $D_x(y)$ 의 추정치는 실제 최소 비용 $d_x(y)$ 로 수렴함
- **반복적이고 비동기적인 업데이트**
- <mark style="background: #FFF3A3A6;">**지역 link cost 변화 혹은 이웃으로부터의 $D_v$ 업데이트 메시지를 받으면 이를 활용해 라우팅 정보를 업데이트하고, 지역 $D_v$ 를 재계산함**</mark>
- **어떤 목적지로 가는 $D_v$가 변경되면 이웃에게 알림**
- **distributed, self-stopping** : 변경 사항이 있으면 이웃에게 알림, 이웃도 필요한 경우에만 이웃에게 알림, 알림을 받지 않으면 아무런 행동도 취하지 않음
- 좋은 소식은 빠르게 전파되고, 나쁜 소식은 천천히 전파됨
- **긍정적인 변경**(좋은 소식)은 네트워크 상의 다른 노드들이 바로 수용하고 반영할 수 있음. 예를 들어, 새로운 경로가 더 저렴하거나 빠른 경우, 노드들은 이를 즉시 받아들여 업데이트함
- **부정적인 변경**(나쁜 소식)은 네트워크 상의 다른 노드들이 이전의 정보를 계속 사용하려는 경향이 있기 때문에 천천히 전파. 경로의 비용이 증가하거나 링크가 끊어지면, 노드들은 새로운 경로를 찾기 위해 더 많은 시간을 필요로 함. 이 과정에서 잘못된 정보가 여러 번 교환되며, 전체 네트워크에 반영되기까지 시간이 걸림
- <mark style="background: #FFF3A3A6;">**count-to-infinity 문제**</mark> : 네트워크에서 경로의 비용이 증가하거나 링크가 끊어지는 등의 부정적인 변경 사항이 전체 네트워크에 반영되는 데 시간이 오래 걸림
- **라우팅 루프 발생 가능** : 네트워크에서 패킷이 목적지에 도달하지 못하고 동일한 경로를 반복해서 순환하는 문제
![[count-to-infinity 문제.png|center|500]]
<br><br>
**link state vs distance vector**
- **메시지 복잡도**
- LS : n개의 라우터, $O(n^2)$ 메시지 전송
- DV : 이웃 간의 교환; 수렴 시간은 다양함
- **수렴 속도**
- LS : $O(n^2)$ 알고리즘, $O(n^2)$ 메시지
- oscillations 문제
- DV : 수렴 시간 다양
- 라우팅 루프 가능성
- count-to-infinity 문제
- **견고성(robustness)**
- LS : 라우터가 잘못된 링크 비용을 광고할 수 있음, 각 라우터는 자신의 테이블만 계산함
- DV : **DV 라우터가 잘못된 경로 비용을 광고할 수 있음** (“나한테 어디든지 매우 낮은 비용 경로가 있음” : black-holing), **각 라우터의 테이블이 다른 라우터에 사용됨: 오류가 네트워크 전체에 전파됨**
<br><br><br>
### 2-1. intra-ISP routing
<br>
**라우팅을 확장 가능하게 만들기**
- 지금까지는 모든 라우터가 동일하고 네트워크가 플랫하다는 이상적인 가정 하에 라우팅 방법을 고민함
- 실제로는 확장성과, 관리의 자율성 문제에 부딪힘
- scale : 모든 목적지를 라우팅 테이블에 저장할 수도 없고, 커질수록 저장 및 교환이 어려워짐
- administrative autonomy : 각 네트워크 관리자가 자신의 네트워크에서 라우팅을 제어하고 싶은 경우도 있을 수 있음
- **인터넷의 확장 가능한 라우팅을 위한 접근법**
- 라우터(네트워크)를 AS, autonomous systems 또는 “도메인”으로 알려진 지역으로 나눠서 묶음
- **intra-AS(도메인 내)** : 같은 AS 내에서의 라우팅
- AS 내의 모든 라우터는 동일한 intra-domain 프로토콜을 실행해야 함
- 다른 AS의 라우터는 서로 다른 intra-domain 라우팅 프로토콜을 실행할 수 있음
- **gateway 라우터**: 자신의 AS 가장자리에 위치하며 다른 AS의 라우터와 연결됨
- **inter-AS(도메인 간)** : AS 간의 라우팅
- 게이트웨이는 내부 라우팅과 외부 라우팅을 모두 처리함
- 포워딩 테이블은 intra-AS 및 inter-AS 라우팅 알고리즘에 의해 구성됨
- intra-AS 라우팅은 AS 내 목적지, intra-AS&inter-AS 같이 외부 목적지에 대한 엔트리를 결정함
<br>
**Intra-AS routing**
- **intra-domain 포워딩에서의 역할**
- 주변 AS를 통해 어떤 목적지에 도달할 수 있는지 학습해야 함
- 이 도달 가능성 정보를 본인 AS의 모든 라우터에 전파함
- **가장 일반적인 intra-AS 라우팅 프로토콜**
- **RIP**: 고전적인 DV(Distance Vector) 알고리즘, DVs는 30초마다 교환됨
- 오버헤드가 커서 더이상 사용되지 않음
- **EIGRP**: DV 기반, 시스코 내부에서 사용되는 프로토콜 (2013년에 개방형 표준이 됨)
- **<mark style="background: #FFF3A3A6;">OSPF</mark>**: link-state 라우팅 사용
<br>
**OSPF (Open Shortest Path First) 라우팅**
- 공개적으로 사용 가능한 프로토콜
- **클래식한 link state 라우팅 방법**
- 각 라우터는 OSPF link-state advertisements(LSA)를 네트워크 내의 모든 다른 라우터에게 브로드캐스트함 (TCP/UDP 대신 직접 IP를 통해 이루어짐)
- multiple link cost 지표가 가능함 (대역폭, 딜레이 등)
- 각 라우터는 네트워크의 전체 토폴로지를 가지고 있으며, 다익스트라 알고리즘을 사용하여 포워딩 테이블을 계산함
- 모든 OSPF 메시지는 인증되어 악의적인 침입을 방할 수 있음
- **Hierarchical OSPF**
- 네트워크가 커짐에 따라 모든 라우터가 전체 토폴로지를 알고 있는 것은 비효율적일 수 있음
- 따라서, OSPF는 **계층적 구조**를 도입하여 네트워크를 로컬 영역과 백본으로 나눔
- **각 로컬 영역 내에서만 LSA를 전파하고, Area Border Routers가 영역 간의 정보를 요약하여 백본을 통해 교환함**
- LSA는 해당 영역이나 백본에서만 브로드캐스트됨
- 각 노드는 자신의 영역 내의 상세한 토폴로지를 가지고 있으며, 다른 목적지에 도달하기 위한 방향만 알고 있음
- **Area Border Routers** : 자신의 영역 내 정보를 요약하여 백본에 광고하고, 백본을 통해 다른 영역과의 경로 정보를 교환함
- **Local Routers** : 자신의 영역 내에서만 라우팅을 관리하며, 외부로의 패킷은 영역 경계 라우터를 통해 전달
![[Network Layer - Hierarchical OSPF.png|center|600]]
<br><br>
### 2-2. Internet inter-AS routing
- **Border Gateway Protocol** : 도메인 간 라우팅 프로토콜 (“인터넷을 묶어주는 접착제” 역할)
- BGP는 서브넷이 자신의 존재와 도달 가능한 목적지를 인터넷에 광고할 수 있게 해줌
- **BGP가 각 AS에 제공하는 기능**
- **eBGP** (외부 BGP): 이웃 AS로부터 서브넷 도달 가능 정보(reachability information) 획득
- **iBGP** (내부 BGP): 도달 가능 정보를 모든 AS 내부 라우터에 전파
- 도달 가능 정보와 정책에 기반하여 다른 네트워크로 가는 “좋은” 경로 결정
![[Network Layer - BGP session.png]]
- **BGP session** : 두 BGP 라우터(피어)가 반영구적 TCP 연결을 통해 BGP 메시지를 교환함 (물리적 연결이 아님)
- 서로 다른 목적지 네트워크 프리픽스로 가는 경로를 광고함 (BGP는 **<mark style="background: #FFF3A3A6;">path vector 프로토콜</mark>**임)
- <span style="color:rgb(186, 186, 186)">e.g. AS3의 게이트웨이 3a가 AS2의 게이트웨이 2c에게 AS3,X 경로를 광고하면, AS3는 AS2에게 X로 가는 데이터그램을 전달할 것임을 약속함</span>
- <span style="color:rgb(186, 186, 186)">AS2의 라우터 2c가 AS3의 라우터 3a로부터 AS3,X 경로 광고를 수신하면, AS2의 정책에 따라 AS3,X 경로를 수락하고, 이를 AS2의 모든 라우터에 전파함(iBGP)</span>
- <span style="color:rgb(186, 186, 186)">AS2의 라우터 2a는 AS2의 정책에 따라 AS2,AS3,X 경로를 AS1의 라우터 1c에게 광고함(eBGP)</span>
- **BGP 광고 경로** : prefix + attributes
- prefix : 광고되는 목적지
- attributes : **AS-PATH**(prefix 광고가 통과한 AS들의 리스트), **NEXT-HOP**(다음 홉 AS로 가는 특정 내부 AS 라우터를 나타냄) 속성을 통해 경로를 정의함
- **경로 정보에 포함된 AS-PATH를 통해 경로 루프를 방지함**
- **policy-based routing**
- 정책 기반으로 경로 광고를 수락하거나 거부하며, 이를 다른 AS에 광고할지 여부를 결정함
- **BGP 메시지**
- BFP 메시지는 TCP 연결을 통해 피어 간에 교환되고, 이를 통해 경로 정보를 관리하고 연결을 유지함
- e.g. OPEN(연결 열고 인증 수행), UPDATE(새로운 경로 광고 or 이전 광고 철회), KEEPALIVE(연결 유지, 요청 확인), NOTIFICATION(이전 메시지 오류 보고, 연결 종료)
<br>
**왜 intra-AS와 inter-AS 구분할까?**
- inter-AS는 정책에 따라 트래픽을 관리하며, intra-AS는 성능에 집중함
- 계층적 라우팅은 테이블 크기를 줄이고, 업데이트 트래픽을 감소시킴 (네트워크 확장성 유지)
<br>
**Hot Potato Routing**
![[Network Layer - Hot potato routing.png|center|600]]
- Hot potato routing은 **내부 도메인(intra-domain) 비용이 가장 적은 로컬 게이트웨이를 선택하는 방식**을 말함
- **예시**: 라우터 2d가 iBGP를 통해 목적지 X로 가는 경로를 2a 또는 2c를 통해 선택할 수 있다고 배운다고 가정함. 이때, 2d는 **inter-domain(도메인 간) 비용을 고려하지 않고**, intra-domain(도메인 내) 비용이 더 적은 2a를 선택함. 따라서 더 많은 AS 홉이 필요할지라도, 2d는 2a를 통해 라우팅함
<br>
**더 많은 정보**
- 일반적으로 ISP는 자신의 고객 네트워크로의 트래픽만 라우팅하고, 다른 ISP들 간의 중계 트래픽을 처리하지 않기를 원함
- **BGP 경로 선택 기준**
- 정책 결정에 기반한 로컬 선호도 값, AS-PATH가 가장 짧은 경로, 가장 가까운 NEXT-HOP 라우터(Hot potato routing) 등등
<br><br>
### 2-3. 라우팅 알고리즘 비교
<br>
| **특징** | **Link State 라우팅** | **Distance Vector 라우팅** | **Path Vector 라우팅** |
| -------------- | ------------------ | ----------------------- | ------------------- |
| **대표 프로토콜** | OSPF, IS-IS | RIP, EIGRP | BGP |
| **정보 교환 방식** | 네트워크 전체 상태 | 이웃 라우터와 거리 벡터 | AS 간 경로와 경로 속성 |
| **정보 수집 범위** | 네트워크 전체 토폴로지 | 이웃 라우터로부터 | AS 경로(AS-PATH) |
| **경로 계산 방식** | 다익스트라 알고리즘 | Bellman-Ford 알고리즘 | 정책 기반 경로 선택 |
| **경로 갱신 빈도** | 이벤트 기반, 빠름 | 주기적 또는 이벤트 기반, 느림 | 이벤트 기반 |
| **루프 방지 메커니즘** | 전체 토폴로지 인식 | 거리 벡터 비교 | AS-PATH를 통한 루프 방지 |
| **장점** | 빠르고 정확한 경로 계산 | 구현이 간단, 계산이 용이 | 확장성, 정책 기반 경로 선택 |
| **단점** | 높은 메모리 및 CPU 사용 | 느린 수렴 시간, 루프 가능성 | 복잡한 정책 설정 |
| **확장성** | 제한적 | 제한적 | 매우 높음 |
| **복잡성** | 높은 복잡성 | 낮은 복잡성 | 중간 복잡성 |
| **사용 사례** | ISP 내부, 대규모 네트워크 | 소규모 네트워크, 역사적 사용 | 인터넷 전역, AS 간 라우팅 |
<br>
**link state **
- **방법**
- 각 라우터는 자신과 직접 연결된 모든 링크의 상태 정보를 수집하여 **네트워크 전체에 방송함**
- 모든 라우터는 수집한 LSA 정보를 기반으로 네트워크의 전체 토폴로지를 나타내는 **데이터베이스를 구축**함
- 각 라우터는 네트워크 전체 토폴로지를 알고 있으므로, **다익스트라 알고리즘**을 사용하여 자신을 출발지로 하는 최단 경로 트리를 계산하고, 이를 바탕으로 포워딩 테이블을 생성함
- **특징**
- **전체 네트워크 정보**: 각 라우터는 네트워크의 전체 구조를 알고 있음
- **정확하고 신속한 업데이트**: 링크 상태 변화가 발생하면 네트워크 전체에 신속하게 반영됨
**distant vector **
- **방법**
- 각 라우터는 자신과 직접 연결된 이웃 라우터들에게 자신의 **거리 벡터**(각 목적지까지의 거리 정보)를 **주기적으로 전송**함
- 각 라우터는 이웃으로부터 받은 거리 벡터 정보를 사용하여 자신과 각 목적지 간의 최단 경로를 업데이트함. 이 과정에서 **Bellman-Ford 방정식**을 사용함
- 경로 정보가 변경되면 이웃 라우터들에게 다시 알림
- **특징**
- **부분적인 네트워크 정보**: 각 라우터는 직접 연결된 이웃 라우터들과의 정보만 알고 있음
- **점진적 업데이트**: 네트워크 변화가 있을 때 정보가 점진적으로 전파되며, 전체 네트워크가 업데이트되기까지 시간이 걸릴 수 있음
**path vector **
- **방법**
- 각 라우터는 목적지 네트워크까지의 경로와 해당 경로를 거치는 AS들의 목록(AS-PATH)을 유지함
- 라우터는 자신이 알고 있는 경로 정보를 이웃 AS에 광고함
- 정책에 따라 경로를 수신한 라우터는 AS-PATH에 자신을 추가한 후 다음 이웃 AS에 경로를 광고함
- **특징**
- **확장성**: 경로 정보가 AS 단위로 요약되므로, 인터넷과 같은 대규모 네트워크에서 효과적으로 동작함
- **루프 방지**: AS-PATH를 통해 경로 루프를 방지할 수 있음
- **정책 유연성**: 각 AS는 자체 정책을 통해 경로 선택을 조절할 수 있음
<br><br><br>
## 3. SDN control plane
**전통적인 라우팅 vs SDN**
- 전통적인 인터넷의 network layer는 분산된, 라우터별 제어 방식으로 구현됨
- monolithic 라우터는 스위칭 하드웨어와 독점 라우터 운영 체제를 실행함
- 방화벽, 로드 밸런서, NAT 박스 등 다양한 네트워크 계층 기능을 수행하는 서로 다른 미들박스가 존재함
- 각 라우터의 개별 라우팅 알고리즘 구성 요소들이 control plane(제어 평면)에서 상호작용하여 포워딩 테이블을 계산함
- **SDN에서는 원격 컨트롤러가 라우터의 포워딩 테이블을 계산하고 설치함** = logically centralized
- 네트워크 관리가 더 쉬워짐 : 라우터의 잘못된 설정을 피하고, 트래픽 흐름의 유연성을 높임
- 테이블 기반 포워딩(OpenFlow API)을 통해 라우터를 “프로그래밍”할 수 있음
- 중앙 집중화된 프로그래밍이 더 쉬움 : 테이블을 중앙에서 계산하고 배포함
- 분산프로그래밍에서는 모든 라우터에서 구현된 분산 알고리즘(프로토콜)의 결과로 테이블을 계산해야 하기 때문에 어려움
- control plane의 개방형(비독점, non-proprietary) 구현: 혁신 촉진, 많은 새로운 아이디어들이 등장하도록 유도함
- SDN은 수직 통합된 폐쇄적, 독점적, 혁신이 느린 소규모 산업(특화된 OS, 앱 등등)에서 수평적인 개방형 인터페이스로 변화, 빠른 혁신, 거대한 산업으로 이어짐
<br>
**전통적인 라우팅 방법에서는 어려운 Traffic engineering**
![[Network Layer - 전통적인 라우팅 방법에서는 어려운 Traffic engineering.png|center|400]]
- **네트워크가 특정 경로를 따라 흐르기를 원하는 경우**, 링크 가중치를 재정의하여 트래픽 라우팅 알고리즘이 경로를 계산하도록 해야 함. 아니면 새로운 라우팅 알고리즘이 필요함
- 링크 가중치가 유일한 제어 방법임: 제어할 것이 많지 않음
- 네트워크 운영자가 u에서 z로의 **트래픽**을 uvwz와 uxyz로 **분할**하고 싶어도 방법이 없음. 아니면 새로운 라우팅 알고리즘이 필요함
- w가 z로 가는 트래픽을 다르게 라우팅하고 싶어도 할 수 없음 (목적지 기반 포워딩과 LS, DV 라우팅에서는 불가능)
→ generalized forwarding and SDN을 사용하면 모두 해결 가능!
<br>
**SDN**
![[Network Layer - Software defined networking (SDN).png|center|500]]
- **특징**
- generalized “flow-based” 포워딩(e.g. OpenFlow) 사용
- control plane과 data plane의 분리
- control plane 스위치 외부에 control plane function이 존재함
- 프로그래머블한 제어 애플리케이션
![[Network Layer - Software defined networking (SDN) layer.png|center|250]]
- **SDN 컨트롤러의 동작 방식**
- **Data-plane switches**
- 빠르고 간단한 상용 스위치, 하드웨어에서 일반화된 data plane 포워딩 구현
- 컨트롤러 감독 하에 계산되고 설치된 플로우(포워딩) 테이블
- 테이블 기반 스위치 제어를 위한 API, 컨트롤러와 통신하기 위한 프로토콜 (e.g. OpenFlow)
- **SDN controller (network OS)**
- 네트워크 state 정보 유지
- 위쪽 API를 통해 네트워크 제어 애플리케이션과 상호작용
- 아래쪽 API를 통해 네트워크 스위치와 상호작용
- 성능, 확장성, 오류 내성을 위한 분산 시스템으로 구현
- **network-control apps**\
- 제어의 “두뇌”: SDN 컨트롤러가 제공하는 하위 서비스와 API를 사용하여 제어 기능 구현
- 분리되어 있음: 제3자에 의해 제공 가능, 라우팅 벤더나 SDN 컨트롤러와 독립적임
![[Network Layer - Components of SDN controller.png|center|500]]
- **SDN 컨트롤러의 구성 요소**
- **네트워크 제어 애플리케이션을 위한 인터페이스 계층**:
- **네트워크 전체 상태 관리**: 네트워크 링크, 스위치, 서비스의 상태를 관리하는 분산 데이터베이스로 구성됨
- **통신**: SDN 컨트롤러와 제어되는 스위치 간의 통신을 담당함
- **OpenFlow 프로토콜**
- TCP를 통해 컨트롤러와 스위치 간의 통신을 담당함, 선택적으로 암호화를 사용함
- 세가지 클래스의 메시지를 사용함
- **controller-to-switch 메시지**
- 스위치 기능 조회, 구성 설정, 플로우 엔트리 수정, 특정 포트로 패킷 전송
- **비동기 메시지 (switch to controller)**
- 패킷 전송, 플로우 엔트리 삭제, 포트 상태 변경 알림
- 네트워크 운영자는 직접 OpenFlow 메시지를 생성하거나 전송하지 않고, 컨트롤러에서 더 높은 수준의 추상화를 사용함
- **대칭 메시지**
- OpenFlow API와 구별됨: API는 일반화된 포워딩 동작을 지정하는 데 사용됨
![[Network Layer - SDN control,data plane interaction example.png|center|300]]
- **control/data plane 상호작용 예시** : 링크 장애 시 컨트롤러가 새로운 경로를 계산하고, 필요한 스위치에 업데이트된 테이블을 설치함
1. <span style="color:rgb(186, 186, 186)">S1에서 링크 장애 발생 시 OpenFlow 포트 상태 메시지를 사용하여 컨트롤러에 알림</span>
2. <span style="color:rgb(186, 186, 186)">SDN 컨트롤러가 OpenFlow 메시지를 수신하고 링크 상태 정보를 업데이트함</span>
3. <span style="color:rgb(186, 186, 186)">이전에 링크 상태 변경 시 호출되도록 등록된 다익스트라 라우팅 알고리즘 애플리케이션이 호출됨</span>
4. <span style="color:rgb(186, 186, 186)">다익스트라 라우팅 알고리즘이 컨트롤러의 네트워크 그래프 정보와 링크 상태 정보를 사용하여 새로운 경로를 계산함</span>
5. <span style="color:rgb(186, 186, 186)">링크 상태 라우팅 애플리케이션이 SDN 컨트롤러 내의 플로우 테이블 계산 구성 요소와 상호작용하여 필요한 새로운 플로우 테이블을 계산함</span>
6. <span style="color:rgb(186, 186, 186)">컨트롤러가 OpenFlow를 사용하여 업데이트가 필요한 스위치에 새로운 테이블을 설치함</span>
- <span style="color:rgb(186, 186, 186)">**OpenDaylight 및 ONOS 컨트롤러**: 내부 및 외부 애플리케이션과 서비스를 연결, 고수준의 서비스 사양 제공, 분산 코어 중점</span>
- **SDN의 주요 과제**
- 제어 평면 강화, 신뢰성 및 보안성 내재화, 특정 요구 사항 충족, 인터넷 확장성, 5G에서의 중요성
<br><br><br><br>
## 4. Performance
- 상위 계층 레이어가 기대한 만큼 네트워크 레이어가 완벽하지는 않음
- 네트워크의 성능은 **delay(지연 시간), throughput(처리량), packet loss(패킷 손실)**를 지표로 평가할 수 있음
- 성능 향상을 위해 congestion control은 아주 중요한 문제임
<br>
### <mark style="background: #FF5582A6;">4-1. delay, 지연 시간</mark>
**Transmission Delay**
- 패킷을 송신자가 송신 매체로 전송하는 데 걸리는 시간
- 송신자가 패킷의 비트를 하나씩 라인(transmission media)에 올리는 데 필요한 시간
- 패킷의 첫 번째 비트를 시간 ${t}_{1}$에 라인에 올리고 마지막 비트를 시간 ${t}_{1}$에 올린다면, 패킷의 전송 지연은 $({t}_{2} - {t}_{1})$
- **패킷의 길이와 링크의 전송 속도**에 따라 결정됨
- <mark style="background: #FFF3A3A6;">$\text{Delay}_{tr} = \frac{\text{packet length}}{\text{transmission rate}}
lt;/mark> 즉, 패킷 길이 / 전송 속도
- $\text{Delay}_{tr}$ 단위는 sec
- $\text{packet length}$ 단위는 bits
- $\text{transmission rate}$ 단위는 bits/sec
<br>
**Propagation delay**
- 패킷이 송신지에서 수신지로 이동하는 데 걸리는 시간
- 진공에서의 전파 속도는 $3×10^8 \text{m/sec}$ 이며, 유선 매체에서는 일반적으로 이보다 낮음
- 신호가 물리적 매체(예: 광섬유, 구리선)를 통해 이동하는 속도(**전파 속도**)와 **전송 거리**에 따라 결정됨
- <mark style="background: #FFF3A3A6;">$\text{Delay}_{pg} = \frac{\text{distance}}{\text{propagation speed}}lt;/mark> 즉, 거리 / 전파 속도
- $\text{Delay}_{pg}$ 단위는 sec
- $\text{distance}$ 단위는 m(미터)
- $\text{propagation speed}$ 단위는 m/sec
<br>
**Processing delay**
- 라우터나 스위치가 패킷을 처리하고 다음 hop으로 전송하기 전에 내부적으로 처리하는 데 걸리는 시간
- 패킷의 헤더를 검사하고, 오류를 확인하고, 라우팅 경로를 결정하는 데 걸리는 시간
- 일반적으로 이 시간은 매우 짧아서 평균값이나 작은 상수 값으로 두고 계산함
- $\text{Delay}_{pr} = \text{time required to process a packet in a router or a destination host}$
<br>
**Queuing delay**
- 패킷이 라우터나 스위치의 출력 큐에서 대기하는 데 걸리는 시간
- 네트워크 트래픽이 많아지면 패킷이 큐에 쌓이고, 이로 인해 패킷이 전송되기 전에 대기하는 시간이 발생함
- 네트워크 혼잡도에 크게 영향을 받음
- 가장 예측하기 어려운 delay
- $\text{Delay}_{qu} = \text{time a packet waits in input and output queues in a router}$
<br>
**Total delay**
- 송신자, 라우터, 수신자의 지연이 동일하다고 가정하면, 패킷이 출발지에서 목적지까지 도달하는 총 지연 시간을 계산할 수 있음
- 전체 경로에 있는 라우터의 수를 n이라고 하면, 전체 경로에는 n개의 라우터와 n+1개의 링크가 있음
- <mark style="background: #FFF3A3A6;">$\text{Total delay} = (n + 1) (\text{Delay}_{tr} + \text{Delay}_{pg} + \text{Delay}_{pr}) + (n) (\text{Delay}_{qu})lt;/mark>
<br><br>
### 4-2. throughput, 처리량
- 네트워크의 특정 지점에서의 처리량은 **해당 지점을 통과하는 초당 비트 수**로 정의됨
- 이는 해당 지점에서의 데이터 전송 속도를 의미함
- 출발지에서 목적지까지의 경로에서 패킷은 여러 링크를 통과할 수 있으며, 각 링크는 서로 다른 전송 속도를 가질 수 있음
- 전체 경로의 처리량은 <mark style="background: #FFF3A3A6;">**각 링크의 전송 속도 중 가장 낮은 값**</mark>을 경로의 처리량으로 간주함
- 이는 병목 지점이 전체 경로의 처리량을 결정하기 때문
- <mark style="background: #FF5582A6;">$\text{Throughput} = \min \{\text{TR}_{1}, \text{TR}_{2}, …, \text{TR}_{n} \}lt;/mark>
![[Network Layer - Figure 7.3 A path through the Internet backbone.png|center|600]]
- 실제 인터넷 상황에서 데이터는 일반적으로 두 개의 액세스 네트워크와 인터넷 backbone을 통과함
- backbone = 여러 하위 네트워크를 서로 연결하는 중심적인 고속 네트워크
- 각 구간의 전송 속도는 다를 수 있으며, 전체 경로의 처리량은 이들 중 가장 낮은 전송 속도에 의해 결정됨
<br><br>
### 4-3. packet loss, 패킷 손실
- 전송 중 손실되는 패킷의 수는 통신 성능에 영향을 미침
- **오버플로우**로 인한 packet loss, packet drop 발생
- 라우터가 다른 패킷을 처리하는 동안 새로운 패킷을 받으면, 그 받은 패킷은 입력 버퍼에 저장되어 자신의 순서를 기다려야 함
- 이때 버퍼의 크기는 제한적이라 버퍼가 가득 차면 새로운 패킷을 저장할 수 없고, 이 패킷은 버려지게 됨
- 손실된 packet을 재전송하는 과정에서 네트워크에 추가적인 부하가 걸리게 되고, 결과적으로 더 많은 패킷 손실이 발생할 수 있음
<br><br><br><br>