---
# System prepended metadata

title: 電腦網路概論
tags: [大學筆記系列]

---

# introduction
## network 的組成元素
network 是將多個計算機、設備或系統連接在一起，使其能夠彼此通信的集合

![image](https://hackmd.io/_uploads/B1pYT_W2T.png =50%x)
* ![image](https://hackmd.io/_uploads/ryZjTOWhT.png =20%x): **device**，連接網路的各種設備
* ![image](https://hackmd.io/_uploads/BJx1CdZ2p.png =20%x): **Packet switch**，負責傳輸 (**forward**) 資料，包含 
	* router: 負責在不同網路間傳遞資料
	* switch: 負責在同一個網路間傳遞資料
* ![image](https://hackmd.io/_uploads/HJy4Rdbnp.png =20%x): **Communication links**，代表連接設備的線路 (有線或無線皆可)
* ![image](https://hackmd.io/_uploads/SynJ1t-na.png =20%x): 每個這樣的區域便是一個 **network**

## internet 簡介
* **Internet**: 連接各個 network 的 network
* **protocols**: 描述了 device 間互相溝通的規則
* **Internet  standards**:
	* RFC: 各種 protocols 的書面標準
	* IETF: 修訂 protocols 的協會

### internet 結構
* **network edge** (網絡邊緣): 接入網路的末端設備，包含
	* client: 使用服務的終端
	* server: 提供服務的終端
	![image](https://hackmd.io/_uploads/SygzxQVhp.png =40%x)

* **access network**: 介於 network edge 以及 network core 的溝通橋梁，負責連接兩者 (可以為有線或無線)
	![image](https://hackmd.io/_uploads/Sy7XgmN36.png =40%x)
	* frequency division multiplexing (FDM): 是一種不同的頻道在不同的頻段傳輸的技術
	* hybrid fiber coax (HFC): 一種同時使用了光纖和同軸電纜，來連接家庭和互聯網服務提供商（ISP）路由器的技術
	* digital subscriber line (DSL): 在保留電話原有功能的同時，利用電話線來傳輸數據的技術

* **network core**: 由介於 client 跟 server 間的 routers 組成，負責各個網路之間的通信
	* edge router: 最接近終端的那個 router
	![image](https://hackmd.io/_uploads/SJvExQVnT.png =40%x)

### access netowrks
#### Wireless access networks (無線電存取網路)
*  分成兩種
	*  **Wireless local area networks** (無線局域網): 又稱 WLANS
		*  覆蓋範圍小
		*  較慢
		![image](https://hackmd.io/_uploads/S1jRl7E2p.png =40%x)
	*  **Wide-area cellular access networks** (廣域蜂窩接入網路): 由網路服務供應商提供
		*  覆蓋範圍大
		*  較快
		*  4G / 5G
		![image](https://hackmd.io/_uploads/rkh1ZQN26.png =40%x)

#### enterprise networks (企業網路)
* 包含有線、無線網路技術
![image](https://hackmd.io/_uploads/BJEVWmE3T.png =40%x)

#### data center networks (資料中心網路)
* 要求 high-bandwidth 傳輸
* 速度非常快
![image](https://hackmd.io/_uploads/BJsiWX436.png =20%x)

### physical media (傳輸資料的物理媒介)
又稱為 guided media，訊息在固體媒介中傳播

#### **Twisted pair (TP)**
* 由兩條銅線扭轉而成的線材
* **最常見**
![image](https://hackmd.io/_uploads/HJ7V47N2a.png =40%x)

#### **Coaxial cable (同軸電纜)**
* 由兩個同心的銅導體組成

#### **Fiber optic cable (光纖電纜)**
* 透過玻璃纖維傳送光脈衝，以傳遞訊息
* 最快但很貴
* 不受 (immune) 電磁波干擾

### Wireless radio (無線電)
* 又稱為 unguided media，訊息在固體媒介中傳播
* 電磁波譜中的各種頻段傳輸的信號
* 無線連結分成以下類型
	* Wireless LAN (WiFi)
	* wide-area (4G / 5G)
	* Bluetooth
	* terrestrial  microwave: 端對端
	* satellite

補充:
**主要的有線網路技術: IEEE 802.3**
**主要的無線網路技術: IEEE 802.11**
**ZigBee: 短距離無線網路傳輸協定**
**LTE: 高速無線通訊標準**

## network core
* 由相互連接的路由器組成，負責傳遞封包
* Host 將 application-layer messages 切成封包
* 有兩種傳遞方式:
	* packet switching
	* circuit switching

### packet switching
host 將資料拆成一個個 packet (封包)，並透過網路傳遞給 distination
![image](https://hackmd.io/_uploads/S1pwWrWa6.png)

傳遞方式:
1. 首先透過 routing 的技術，建立 "forwarding table"，以決定封包傳遞的路徑
	* routing 是 global action
2. 接著透過 forwarding 的技術，查詢 "forwarding table"，實際將封包向前傳遞；封包完整的到達 router 時，才會往下一個 router 傳送
	* forwarding 是 local action

* 適用於 "bursty" data (不總是有資料流的情況)
* on-demand allocation (資源只在需要時才被分配和使用)

#### host sending function
![image](https://hackmd.io/_uploads/ByuifmNnT.png =50%x)
* host: 送出 package 的主機
* package (封包): 資料包
* 公式: 假設封包長 L bits、transmission rate 為 R
	* 則 packet transmission delay (傳遞一個封包所需的時間) = $\frac{L}{R}$
### **circuit switching**
在 host 跟 distination 間建立一個持續存在的專屬通道，專門保留用來給兩者通信用 (無論是否真的有在使用)
![image](https://hackmd.io/_uploads/B1L5bSW6p.png =40%x)

當有多個使用者想要使用網路時，實作方式又分成兩種
* FDM: 用不同頻率為使用者切分出各自使用的頻域空間
	![image](https://hackmd.io/_uploads/BJBQGHbpa.png =40%x)
* TDM: 用不同時間為使用者切分出各自使用的時間空間
	![image](https://hackmd.io/_uploads/BJXNGB-T6.png =40%x)


* 使用於須持續連接的情境中，例如實時影像通訊
* reserved resources (無論資源是否使用，都會被分配出去)
* **過去被實作於的電話線路中**

## Internet 宏觀結構
Internet 可以被視作 "network of networks"，負責將各個 network 連接起來

![image](https://hackmd.io/_uploads/B1hiXB-Ta.png =70%x)
![image](https://hackmd.io/_uploads/HkuQurWT6.png =50%x)

* access net: 連接至 Internet 中的 network
* ISP: 網路服務供應商
* IXP: 於各個 ISP 間溝通
* Regional ISP: 地區性的 ISP
* access ISP: 與 access net 連接的最後一層 ISP

## packet loss
本小節將繼續探討在 packet switching 的方式下，出現的 packet loss 的問題
* 封包到達 router 時，會暫存在 queue (記憶體)中等待處理
* 當封包把 router 中的記憶體都消耗完時，router 無法再暫存新來的封包，便會出現 loss

![image](https://hackmd.io/_uploads/rJlTc8T3a.png =70%x)
* 由於 router 的 buffer 滿了，故 B 送的最後一個藍色封包發生 loss

## **packet delay**
本小節將繼續探討在 packet switching 的方式下，出現的 packet delay 的問題

* packet delay 指的是 router 在接收封包到封包發送之間所花費的時間
* packet delay 為以下四項相加:
	* **nodal processing**: **router 實際處理封包所需的時間**
	* **queueing delay**: **封包在 router 的 queue 中排隊等待的時間**
	* **transmission delay**: **封包從 router 傳輸至網路上所消耗的時間，跟 packet bits 有關 (time = 封包大小 / 傳輸速率)**
	* **propagation delay**: **封包從連結一端傳至另一端所消耗的時間，跟傳輸媒介有關 (time = 距離 / 傳輸速度)**
![image](https://hackmd.io/_uploads/SyH1Jp53a.png =70%x)

* Packet queueing delay: $\frac{L*a}{R}$
	* a: 平均的封包到達速率
	* L: 封包大小
	* R: 每單位時間能處理的 bit 大小

* 可以使用 traceroute 程式，來測量封包傳輸路徑上遇到的每一個路由器的延遲

## Throughput
* 每單位時間從 server 至 receiver 能傳送的 bits 數量，有兩種衡量方式
	* instantaneous: 瞬時
	* average: 平均
* 整體的 Throughput 受到該路徑中 Throughput 最小的路段限制 (bottlenet)
	![image](https://hackmd.io/_uploads/HJz568ThT.png =60%x)
	
![image](https://hackmd.io/_uploads/BkfqC8pnp.png =50%x)
* 如果有多個 connection 共用某條網路，這些 connection 將會公平地分享這條網路的流量
	![image](https://hackmd.io/_uploads/SJKRRU6ha.png =20%x)

## Network security
### 攻擊方式
* **packet interception: 封包在傳輸的過程中被偷看 (sniffing)**
* **fake identity: 利用偽造 IP (IP spoofing) 的技術，送出一些假來源的封包**
* **denial of service(DoS): 利用大量的假流量來癱瘓伺服器**
	1. 選擇攻擊目標
	2. 建立殭屍網路 (**botnet**)
	3. 利用殭屍網路攻擊目標
### 防禦方式
* authentication: 驗證來源的真實性 (例如使用 SIM 卡進行物理驗證)
* Confidentiality: 將欲傳遞的資訊加密
* integrity checks: 確保資訊在傳遞的過程中未被竄改
* access restrictions: 限制能訪問服務的來源 (例如透過 VPN 限制)
* firewalls: 防火牆

## Protocol layers (協定層)
將通信協定分解為不同層次的結構，方便管理與更改

![image](https://hackmd.io/_uploads/B1m-yxVpa.png =20%x)
* application: 透過 Application 交換 message，以支援各式各樣的網路服務
	* ex: HTTP、DNS
* transport: 負責支援不同 process 之間的溝通
	* 在本層，將會封裝 Application layer 的 message
	* 在包含 transport layer header 後，訊息將會被打包成 **segment**
	* ex: TCP、UDP
* netwrk: 與 routing 有關的資訊傳遞
	* 在本層，將會封裝來自 transport layer 的 segment
	* 在包含 netwrk layer header 後，訊息將會被打包成 **datagram**
	* ex: IP、routing proticol
* link: 用於處理附近的 network element
	* 在本層，將會封裝來自 netwrk layer 的 datagram
	* 在包含 link layer header 後，訊息將會被打包成 **frame**
	* ex: Ethernet
* physical: 負責處理實際在 "線路" 中傳輸的資料

![image](https://hackmd.io/_uploads/r11O5g466.png)
* sourse 會將 message 一層一層的包起來
* sourse 將包好的資訊利用線路傳輸給 destination
* destination 則一層一層的解讀訊息

# Application layer
## network application
* network application 指的是在終端上運行的程式
	* ex: 網站
* Client-server paradigm: 傳統的網路架構，可以進一步分成兩類
	* server
		* 總是在運行
		* 固定 ip
	* client
		* 與 server 溝通
		* 間歇性連接
		* 可能有動態的 ip
		* 不直接與其他客戶端通訊
* Peer-to-Peer architecture: 不再有 server 跟 client 之分。每個終端都可以自由地跟其他終端溝通
	* ex: P2P file sharing

## Processes communicating
* 同一個 host 的不同 process，使用機器內部的 inter-process communication 進行溝通即可
* 不同 host 的不同 process，使用 socket 進行溝通 (socket 可以想像成門，而訊息將從門中接收或是丟出)
	* client process: 負責發起兩個 process 間的通訊
	* server process: 等待被聯繫的 process
	* 為了能唯一識別這個在某台主機上的 process，需要兩項資訊
		* IP: 用來識別唯一的主機設備
		* port: 用來識別主機設備中的 process

## application-layer protocol
* application-layer protocol 定義了以下數項
	* 交換的訊息種類
		* ex: request, reponse
	* 交換的訊息格式
	* 開放的協定
		* ex: HTTP
	* 專有的協定
		* ex: skype 等私人的傳輸協定

### HTTP
* HTTP (超文本傳輸協定) 是一種應用層協議
* 其建立在 client/server model 之上
* 使用 TCP 定義的方式 (creates socket) 進行資料的傳輸
* 在傳輸過程中，HTTP 始終保持 stateless 的，即 server 不會主動紀錄 client 過去的 request 紀錄
* client pull 性質: 客戶端需主動請求資料
* **通常使用 port 80**

#### Non-persistent HTTP
* server 與 client 一次只會交換一次資料，下載多個 object 可能會需要多次連接
* 互動步驟:
	1. client 初始化與 server 的 TCP connection (使用 port 80)
	2. server 接受與 client 的 connection
	3. client 送 一個 HTTP request 給 server
	4. server 送 一個 HTTP response 給 client
	5. 結束 TCP connection
* RTT: 將一個小到大小可忽略不計的封包，從 server 送出，並讓 client 送回來所花的時間
* 一個 object 的 HTTP response time: 1 RTT (初始化 connection 用) + 1 RTT (傳輸 object 用) + object transmission time

#### persistent HTTP
* 與 Non-persistent HTTP 的不同是，單次連接中會互相交換多次資料
* 由於不用一直重新初始化連接，一個 object 的 HTTP response time 降為 1 RTT + object transmission time

#### **HTTP request method**
* **GET method: 請求指定資源**
	* 將要傳輸的資料直接放在 url 中 (most common) 
* **POST method: 提交指定資源**
	* 將要傳輸的資料直接放在 body 中 (second common) 
* **PUT method: 更新指定資源**
* **HEAD method: 單純用來測試連接情況用**
	* 跟 GET method 相比，是不帶 body 的 method

#### HTTP response message
透過 HTTP response status codes 表達 client 請求的狀態
* ex:
	* 200 OK
	* 404 Not Found

#### HTTP Cookie
* 由於 HTTP 的互動是 stateless 的，若是需要紀錄狀態 (例如登入資訊)，便需要 Cookie 的幫助
* server 可以使用 setCookie()，讓 client 的瀏覽器紀錄 cookie 資訊
* client 的瀏覽器 會將紀錄的 cookie 資訊 存在 request Header 中，隨著下一個 HTTP request 一同發送至 server

#### Web cathe
目標是在不向 server 本身請求的情況下滿足 client 需求

* 概念是透過一台離客戶端更近的 web cathe ，紀錄其他 client 的 request-response 關係。這樣一來，其他 client 在訪問時，便能使用更短的路徑獲得回應，也能降低 server 負擔
* HTTPS 不適用，因為在傳輸過程中加密了

![image](https://hackmd.io/_uploads/r1d2gA1RT.png =70%x)

補充:
另一種加速方法是透過 brower cathe，瀏覽器會將先前 request 得到的資源暫存在本地 cathe 中，當再次訪問且資源為更新時，便不需要再次下載

#### HTTP 各版本功能
* HTTP/1.0: 
	* 最初的版本
	* 支援各種 HTTP method
* HTTP/1.1: 
	* 引入了 pipeline GETs 的概念，使用者無需等待上一個請求完成便能送出下一個請求
	* 這些請求採用 First come first serve 的原則處理
		* 缺點: 即使某個 request 不大，還是需要等待前面的 request 做完才能回傳結果
* HTTP/2: 降低 multi-object HTTP requests 的延遲
	* 不需要再遵循 FCFS的原則
	* 將欲傳輸的資料分成更小的 frame 進行傳輸，以避免 HOL blocking (隊頭阻塞，大檔案塞在處理 queue 的最前面)
* HTTP/3:
	* 提升安全性、在 UDP 上實作錯誤處理與擁塞控制

### SMTP
* SMTP 用於 Email 的傳輸，是一種應用層的傳輸協定
* SMTP 底層基於 TCP/IP
* 傳輸過程中，分成兩個不同的角色
	* User Agent: 跟使用者有關的一方，負責讀訊息
	* mail servers: 負責存放接收到的郵件(mailbox)、待發送的郵件(message queue)，郵件伺服器間使用 SMTP 協議傳遞
* 信件發送者將信件傳遞至 mail server；信件接收者負責訪問位於 mail server 的信件，並展示給使用者
* 與 HTTP 最大的不同是，這個通訊協定採用 client push 的方式 (client 主動推送訊息)
* 一封郵件中可以包含多個不同的資源，代表一次 SMTP 可以傳輸多個資料
* 使用 persistent connections，建立連接，將會保持連接直到資料傳輸完成
* **通常使用 port 25**

![image](https://hackmd.io/_uploads/B1Ld-dLAp.png =80%x)

#### SMTP 標準規範
![image](https://hackmd.io/_uploads/r13mymKA6.png =50%x)
* 首先，初始化 TCP connection (消耗一個 RTT)
* 接著執行 SMTP handshaking
	* client 發送 SMTP 連接請求
	* server 回傳資訊，表示已準備好接收 greeting 請求
	* client 發送一個 greeting
	* erver 回傳資訊，表示已準備好正常通訊

#### 跟郵件傳輸相關的協議
SMTP: 負責定義如何將訊息傳到 receiver's server
IMAP: 負責定義 user agent 從伺服器存取郵件的方式
HTTP: 負責提供使用者網路介面

## DNS (Domain Name System)
* 用於 "IP address"和 "domain name" 之間進行對應
* DNS 是分散式資料庫，由許多 name servers 組成

### DNS database 架構
* 由多層資料庫架構組成，根據層級可以被分成三類
	* Root
		* DNSSEC 提供安全性
		* ICANN 管理 root DNS 域名
	* Top Level Domain
		* .com、.net 等等
	* Authoritative
		* yahoo.com 等等

ex: 查詢 www.amazon.com (iterated query)
![image](https://hackmd.io/_uploads/SJaK_XtRa.png)
1. 向 root DNS server 取得 .com DNS server
2. 向 .com DNS server 取得 amazon.com DNS server
3. 向 amazon.com DNS server 取得 www.amazon.com DNS server

補充:
本地端會將 query DNS 的結果存在 local DNS 中，下次遇到便不用重新查詢

### DNS name resolution
有了 DFS server 後，便可執行域名解析的動作，可以在依據架構進一步分成兩種解析方式:
1. iterated query: 本地分別向不同層級的 DNS server 進行 query
	![image](https://hackmd.io/_uploads/HyDOMj1yA.png =70%x)
2. recursive query: 本地只向最高層級的 DNS server 進行 query，剩下的交給 最高層級的 DNS server 負責
	* 缺點: 較高層級的 DFS server 負擔重
	![image](https://hackmd.io/_uploads/Hk2Yfskk0.png =70%x)
	
### **DNS 資料儲存方式**
* 每一筆資料由以下四個資料組成，根據 type 不同，name 跟 value 有著不同的定義；而 ttl 代表將會保留這筆資料多長
	(name, value, type, ttl)
* **type=A (一般)**
	* name: host name
	* value: IP Address
* **type=CNAME (存放別名與真名的對應關係)**
	* name: 別名 (ex: www.ibm.com)
	* value: 真名 (ex: servereast.backup2.ibm.com)
* **type=NS**
	* name: domain (ex: example.com)
	* value: authoritative name server 的 hostname (ex: ns1.example.com)
* **type=MX**
	* name: SMTP mail 的名稱
	* value: 跟該名稱相關的 server

### DNS protocol messages
![image](https://hackmd.io/_uploads/SJ_Ymlpg0.png =70%x)

### 針對 DNS 的攻擊
DDoS attacks: 透過發送大量請求癱瘓 server
Spoofing  attacks: 注入假 ip 與 網域的對應關係

## Peer-to-peer (P2P)
* P2P 架構是一種去中心化的系統設計，允許各端系統直接通信
* 不需要持續運行的中央伺服器
* 具有自我擴展性，隨著新使用者的加入，系統的負載提升，但同時也有更多人能處理請求

### **BitTorrent**
* **BitTorrent** 是一種基於 P2P 的檔案分享協議
* 檔案將會被切成多個大小為 256Kb chunks
* 參與這個資源共享網路的使用者稱為 torrent
* Tracker: 協調下載和上傳文件的對等節點的伺服器
![image](https://hackmd.io/_uploads/rJfq2oJJC.png)

策略:
* Requesting chunks:
	* 在任何給定的時間點，不同的 peer 擁有 chunks 的不同子集
	* Alice 定期向每個 peer 請求其擁有的片段表
	* * Alice 向 peer 請求其擁有的片段，優先請求最稀有的
* Sending chunks (tit-for-tat 原則):
	* Alice 將 chunks 發送給目前以最高速率向她發送 chunks 的四個 peer，並封鎖其他 peer
	* 每10秒重新評估前4個 peer
	* 每30秒隨機選擇另一個對等節點，開始發送 chunk (樂觀解除封鎖)
	* 這樣做能提升傳輸資料時的速度

## video streaming
* 串流播放時，網絡延遲是可變的，故需要客戶端緩衝區來滿足穩定持續播放的條件

### DASH (Dynamic, Adaptive Streaming over HTTP)
* server 端:
	* 將影片分成多個 chunk
	* 保存多個不同畫質的副本
	* 儲存於 CDN server中 (可以將不同畫質的副本複製多份，存於不同的 CDN server 中)
* client 端:
	* 決定何時請求 chunk
	* 請求什麼畫質的片段
	* 從哪裡請求片段 (如果有多個 CDN server 的話)

### Content distribution networks (CDNs)
* 由多個 CDN server 組成
* 能提供更低的延遲


## Socket programming
* socket 是應用程式端對端的通信方式
* socket 可以建立在以下兩個傳輸協定之上
	* UDP
		* 不需要事前建立 client 與 server 的連接
		* 將資料切成封包，發送時附帶目標的 IP 等資訊，並在封包中包含自己的 IP 等資訊 (receive from, send to)
		* 無法保證可靠性(封包可能丟失、非按照順序收到)，無連接性
		* 適合不需要建立持久連接、傳輸速度要求較高、對數據完整性要求較低的應用
		* **需要留意的 API:
			* bind: 綁定 IP address 跟 port
			* recvfrom: 接收 client 發送的資料
			* send: 送出回應資料**

	* TCP:
		* client 必須先**連接**至 server
		* server 必須先創建 socket，接著 client 再連接至 server 
		* 將資料切成封包，透過先前建立的連接發送跟接收資訊(receive, send)
		* 可以保證可靠性
		* 適合對數據完整性要求較高的應用
		* **需要留意的 API:
			* bind: 綁定 IP address 跟 port
			* listen: 使 server 開始監聽請求
			* accept: 負責接受 client 的連接請求
			* recv: 接收 client 發送的資料 (不需要指定 client 的 IP address，因為 accept 時做過了)
			* send: 送出回應資料 (不需要指定 client 的 IP address，因為 accept 時做過了)**

# Transport layer
* 目的是提供 "process" 間的溝通方式
* 相較於 Transport layer，network layer 則負責提供 hosts 間的溝通方式
* sender 負責 (segment 可視做 Transport layer 的封包)
	* 傳遞 application layer 的訊息
	* 決定 segment (可以視作 Transport layer 的封包)
	* 創建 segment
	* 將 segment 傳遞給 IP
* recever 負責
	* 從 IP 中接收 segment
	* 確認 header
	* 提取出 application 的訊息
* TCP 與 UDP 是作用於 Transport layer 的傳輸協定

## demultiplexing / multiplexing
application layer 可能會有許多 process 想要透過 transport layer 送出資料或接收資料，

* multiplexing: 是指將多個來自不同 process 的資料流合併到一個輸出流中的過程
	![image](https://hackmd.io/_uploads/SyUbtQaxA.png =40%x)

* demultiplexing: 是指將從單一資料流中提取出來的多筆資料分開的過程
	![image](https://hackmd.io/_uploads/r1RkYm6gA.png =40%x)
* 實現方式: 每個 segment 都包含 sourse port 以及 dest port
	* UDP: 傳輸所需附帶資訊 (sourse port number, dest port number)
	* TCP: 傳輸所需附帶資訊 (sourse IP, sourse port number, dest IP, dest port number)

## UDP (User Datagram Protocol)
* UDP segment 可能會丟失或是不按順序到達；不同的 UDP segment 互不干涉
* 傳輸雙方不需建立連接 (connectionless)
* 優點: 速度快、header 較小
* 缺點: 本身不具備 congestion control (壅塞控制)
* 使用場景:
	* streaming multimedia apps (允許一定程度的丟包、希望傳輸速度越快越好)
	* DNS
	* SNMP
	* HTTP/3 (在 application layer 增加可靠性及壅塞控制)

![image](https://hackmd.io/_uploads/B1CcBu6eA.png =30%x)
* source port
* dest port
* length: 這整個 UDP segment 的byte 數
* checksum: 用來 detect error


### detect error
* 使用 Internet checksum 的技術
* 發送方將某個封包中預傳輸的資料視為一系列 16 bits 整數，將其相加後的值寫進 header 中
* 發送方檢查 header 中的 checksum 是否與接收到的資料相符合，便可藉此檢測資料完整性 (但 checksum 相符合仍不代表資料一定是完整的)

![image](https://hackmd.io/_uploads/S1P-Xa4gC.png =70%x)

## Reliable data transfer protocol (rdt)
![image](https://hackmd.io/_uploads/r13bfYagC.png)
* 構建一套 rdt 系統，能夠在 unreliable channel 跟上層間，將 unreliable 事件變成 reliable 的

### pipelined protocols operation: Go-Back-N
為了提升傳輸速率，使用 pipelining 的技術
* 原本 sender 需收到 recever 的封包回應後，才寄出下一個封包
* 結合 pipelining 的技術後，sender 在收到 recever 的封包之前，便先偷寄出下一個封包
	![image](https://hackmd.io/_uploads/BJd8BIie0.png =70%x)
	
#### sender 處理邏輯
![image](https://hackmd.io/_uploads/SJeScLIjg0.png=70%x)
* 假設將 sender 要寄出的封包排成一列，將會分別有四種狀態
	* 已經 ACK 的封包
	* 寄出去，但還沒 ACK 的封包
	* 準備寄出的封包
	* 還沒準備好寄出的封包
* window size 是固定的大小
* 每個封包寄出後，都有一個 timeout 時間；若超過該時間後，該封包還沒 ACK，則會重寄該封包以及其後的所有封包 (這個機制保證封包發生 loss 時的處理方式)

#### recever 處理邏輯
![image](https://hackmd.io/_uploads/HJzbcIsl0.png =40%x)
* 永遠只回應 "最後一個正確接收的封包 ACK 編號" 給 sender
	* 收到錯誤的封包時，丟棄是一種常見策略
	* 這個機制可能會導致不斷回應同一個 ACK 編號

#### 實際演示
![image](https://hackmd.io/_uploads/ryCDqIjlR.png =80%x)
* 注意當 recever 接收第三個封包時
* 由於順序錯誤 (封包二還沒收到)
* 故回應給 sender 的 ACK 編號仍然是 1

### pipelined protocols operation: Selective repeat
#### sender 處理邏輯
#### recever 處理邏輯
#### 實際演示

## TCP
* 在一個 TCP 連接中
	* 只存在一個 sender、一個 recever
	* 訊息將會按順序到達
	* 傳輸過程是 reliable 的
	* 同一個連接中，資料可以雙向流動 (Full Duplex Data)
	* 使用 Cumulative ACKs 機制，使 receiver 能告訴 sender 最後一個以確認收到的封包
	* 使用 Pipelining 機制，在等待 ACK 的同時繼續發送封包
	* 在傳輸資料前，需要建立連接
	* 具有 Flow Controlled 機制，可以有效的確保 sender 送出的資料數量不會超出 receiver 能處理的範圍

### TCP segment 介紹
![image](https://hackmd.io/_uploads/H1hhbcVZC.png =80%x)
![image](https://hackmd.io/_uploads/HkXHDaabA.png =70%x)
* sequence number: TCP 將資料視為 byte stream，每個 byte 都有一個連續且獨一無二的編號，sequence number 用來紀錄該 segment 所包含的資料中，第一個 byte 的編號是多少；這有助於控制 "訊息將會按順序到達" 這件事
	![image](https://hackmd.io/_uploads/ByW0VqEWA.png =40%x)

* Acknowledgements number (ACK): 用來告訴 receiver，自己 "下一個預期收到的 byte 編號" 是多少；換句話說，對於 sender 來說，編號小於此值的位元組，皆已正確接收 (ex: Acknowledgements number = 101，代表已確認收到了 100 byte 的資料，期望下一個收到的資料是第 101 個 byte)
	![image](https://hackmd.io/_uploads/rJquv5EWR.png =80%x)
	
### TCP retransmission
* 設置一個 timeout 期限，當過了該期限後還沒有收到對應的 ACK 的話，重送
	![image](https://hackmd.io/_uploads/HyTkXEDZC.png =30%x)
* TimeoutInterval = EstimatedRTT + 4*DevRTT
	* EstimatedRTT: 估計的 RTT
	* 4*DevRTT: 4 倍標準差
* 但有個需注意的地方，即使某些 ACK 回傳過程出現 loss，只要能回傳更後面進度的 ACK，便不需重送，這是因為 ACK 的定義為 "編號小於此值的位元組，皆已正確接收"
	![image](https://hackmd.io/_uploads/rJVZ74PWR.png =30%x)
* TCP fast retransmit 機制: 當 sender 在 timeout 的時間之內，除了本來就會收到的 ACK 外，還收到額外的 3 個 (總計四個) 相同的 ACK，代表可能有封包發生 loss 了，於是這個機制在 timeout 前便重新寄送 "猜測丟失" 的那個封包
	![image](https://hackmd.io/_uploads/H1J0vEv-A.png =50%x)

### TCP flow control
* receiver 控制 sender，以防止發送端傳輸過多或過快的資料，從而溢出接收端的緩衝區。這是透過一個稱為流量控制（Flow Control）的機制來實現的。
	* 具體而言，receiver 透過封包中的 rwnd 欄位來告知發送方自身可用的緩衝空間

### TCP connection
* 在交換資料之前，serder 跟 receiver 會先進行 "handshake"，目的是確認雙方都願意連接
#### 建立連接: 3-way handshake
![image](https://hackmd.io/_uploads/r1ZLBTTWA.png)
* 第一步 (SYN1):
	* SYN bit =1 表明 client 想要跟 server 交換資料，詢問是否可以建立連接
	* Seq = x 為 client 隨機產生的一個數字
* 第二步 (SYN2, ACK1):
	* SYN bit =1 表明 sever 也想要跟 client 交換資料，詢問是否可以建立連接
	* Seq = y 為 server 隨機產生的一個數字
	* ACKbit = 1 表明確認收到 client 傳來的資料
	* ACKnum = x+1 (client 傳過來封包的 Seq +1, 算是 TCP 的規定)
* 第三步 (ACK2)
	* ACKbit = 1 表明確認收到 server 傳來的資料
	* ACKnum = y+1 (server 傳過來封包的 Seq +1, 算是 TCP 的規定)

#### 關閉連接
* 第一步:
	* client 發送一個 FIN bit = 1 的 segment，表示 client 已經沒有資料要發送
* 第二步:
	* server 回應一個帶有 ACK 的 segment，表示已確認收到 client 的 FIN segment；接著 server 便開始準備關閉 TCP 連接
* 第三步:
	* server 準備好關閉 TCP 連接時，也發送一個 FIN bit = 1 的 segment
* 第四步:
	* client 回應一個帶有 ACK 的 segment，表示已確認收到 server 的 FIN segment

### TCP congestion control
* Congestion: 太多人送了太多封包，使得網路難以負荷
* 出現 Congestion 時:
	* 延遲變高
	* packet loss
#### AIMD 機制
* TCP 使用 AIMD 機制來避免 congestion
	* 每一輪 RTT 都提升一點 TCP sending rate，直到發生 loss
	* 發生 loss 時，將 TCP sending rate 砍半
	![image](https://hackmd.io/_uploads/H1KV0wefR.png =50%x)
* 實務上，是透過控制 cwnd 的大小，來實現控制 TCP sending rate
	![image](https://hackmd.io/_uploads/B1T9xuxG0.png =40%x)
* 除此之外，為了避免 slow start 的問題，TCP 在連接初期，會指數性的提升傳輸速率，直到第一個 loss 發生或是 TCP sending rate 達到閾值

#### CUBIC 機制
* 是另一種避免 congestion 的方法
* 使用立方函數的公式，略為提升傳輸效率

![image](https://hackmd.io/_uploads/Hk3x43xS0.png =50%x)
* 紅色線為 AIMD
* 藍色線為 CUBIC

#### Delay-based TCP congestion control
* 目標是 "保持傳輸通道剛好滿，但不過滿"
* 確保傳輸路徑中的 bottleneck 能不間斷的傳輸資料
* 例如 google 的 BBR (Bottleneck Bandwidth and Round-trip propagation time) 演算法

#### Explicit congestion notification (ECN)
* 是一種透過網路輔助的 congestion controll 方法
* 透過網路設備標記封包來指明目前的 congestion 情況

### QUIC: Quick UDP Internet Connections
* QUIC 是一個基於 UDP　的應用層協議
* 能提升　HTTP 的表現
* 包含了許多先前提過的技術，包括 congestion controll、建立連接、能確保可靠性跟安全性等等

# Network Layer
## overview
* sender 將 segments 封裝成 datagrams，傳給 link layer
* receiver 則將收到的 datagrams 拆開成 segments，傳給 transport layer
* routers 在此層中非常重要，負責實際傳輸 datagrams
	* forwarding: 將封包從一個 router 向前傳遞到另一個 router 的過程

	* routing: 決定封包傳遞路徑
		* routing algorithms 是用來決定封包傳遞路徑的演算法
* Data plane: 屬於 local，是每個 router 都有的邏輯，負責決定抵達 input port 的資料如何傳遞至 output port
* Control plane: 屬於 network-wide，負責控制資料如何在 router 間順利傳遞
	* Per-router control plane: 每個 router 都自己維護自己的 routing table，同時透過跟其他 router 溝通，更新自己的 routing table
		![image](https://hackmd.io/_uploads/Syaul2FfC.png)
	* Software-Defined Networking (SDN) control plane: 由一個 Remote controller 來全局計算，並安裝 forwarding table 至其控制的各個 router 中
		![image](https://hackmd.io/_uploads/SJMql2tfC.png)

## router
* router 可以分成三個部分
	* input ports: 負責接收 datagram
	* switching fabric: 負責將 datagram 從 input ports 轉發到正確的 output port
	* output port: 負責發送 datagram

### Switching fabrics
* 透過 datagram header 的資訊，搭配 Forwarding Table 將 datagram 轉發
	* destination-based forwarding: 只根據目的地的 IP 位址進行 forwarding，採用 Longest prefix matching 的方式進行匹配
	![image](https://hackmd.io/_uploads/B1OW6iWS0.png =50%x)
	* generalized forwarding: 根據 header 中的 field values 來進行 forwarding (較有彈性)
* 可以透過以下三種方式實作 Switching
	* memory
	* bus
	* interconnection network
		* Crossbar
		* Clos networks
		* Cisco CRS router

### Input port queuing
* 當 switching 的速度低於輸入速度時，便會出現 queueing 的情況
![image](https://hackmd.io/_uploads/SkhPlkMH0.png)

Head-of-the-Line (HOL) blocking: 一列的第一個 datagram 受阻而導致整列 datagram 受阻

### Output port queuing
* 當 switching 的速度快於輸出速度時，便需要 Buffering 暫存待發送的封包；若無可用 Buffering，則會由 Drop policy 決定要丟棄哪些 datagram
* 透過 Scheduling discipline 決定要發送哪些正在 queueing 的封包
	* FCFS
	* priority
	* round robin
	* weighted fair queueing
* Buffer Management
	* tail drop: 丟棄最舊的封包
	* priority: 根據優先度丟棄
	* marking: 標記封包，用來指示 congestion


## Internet Protocol (IP)
### IP datagram 格式
![image](https://hackmd.io/_uploads/S1exgBgX0.png)
* network layer 封裝的封包，仍然有針對其 header 的 checksum
* 每個封包都包含 sourse IP address、destination IP address

### IP addressing
![image](https://hackmd.io/_uploads/B1PB7Sl7A.png =60%x)
* IP address 是一個 32-bit 的變數，用來唯一標示網絡中的主機或 router 的接口 (router interface)
* interface 指的是主機或路由器對外的物理連接。主機或路由器通過這些 interface 與網絡中的其他設備進行通訊
* 同一個藍色底線的區域處於同一個 Subnets 中，具有相同的 IP address 前綴
	* 在這種架構下，IP address 被分成 subnet part 以及 host part
    * Classless InterDomain Routing (CIDR):  格式如 "200.23.16.0/23"，代表這個 IP address 的前 23 位是 subnet part，其餘為 host part

### DHCP
* 目標: 當 host 加入網路時，動態的從其 network server 獲取 IP address
* 共分成四步
	![image](https://hackmd.io/_uploads/BJsdEbzrC.png =80%x)
* 至於獲取 IP address 的方法，則是從網際網路服務供應商 (ISP)那邊獲得
* 而 ISP 獲取 IP address 的方法，則是交給 ICANN（網際網路名稱與數字地址分配機構） 分配
* IPv4 address 耗盡問題:
	* 使用 NAT（網絡地址轉換）技術
	* 改用 IPv6

### network address translation (NAT)
* NAT技術允許 local network 中的所有設備共享一個公共 IP address (由對外的 router 控制)
    * 節省了IP資源
    * 更改 local network 中設備的IP address，不需通知外界
    * local network 中的設備無法被外部世界直接看到
* NAT router 需要建表儲存對內 IP 以及對外 IP 的轉換關係

![image](https://hackmd.io/_uploads/r1jMBdt7C.png =70%x)

### IPv6
* 從 IPv4 轉成 IPv6 的原因
    * 為了能分配更多的 address space
    * 優化封包傳遞速度
* 相較於 IPv4
    * 為了加速，去除了 checksum 機制
    * 去除 fragmentation/reassembly (當封包過大時，將封包切成小段)，而是直接通知封包源頭解決問題
    * 去除 options 以簡化 header
* tunneling: 由於不一定每個 router 都支援 IPv6，故實務上採用 "IPv4封包 包住 IPv6 封包" 的方式，在 4G/5G 中廣泛使用

![image](https://hackmd.io/_uploads/rJ_xcdFXR.png =80%x)

回顧: IPv4
![image](https://hackmd.io/_uploads/S1exgBgX0.png =80%x)

## Generalized forwarding
* 在 Switching fabrics 的章節中提到，forwarding 的方式分成兩種，分別為 destination-based forwarding 以及 Generalized forwarding
* 在 generalized forwarding 中，有四個重要的規則
	* match: 匹配 datagram header 欄位中的值
	* actions: 匹配成功之後採取的動作
	* priority: 兩條規則有衝突時，priority 告訴我們應該遵循哪一條規則
	* counters: 紀錄 bytes 和 datagram 的數量

### OpenFlow
* OpenFlow 是一種網路通訊協定，屬於 link layer，能夠控制 switch 或 router 的轉發邏輯
* 舉例: 封鎖所有發往 TCP port 22 的 datagram
![image](https://hackmd.io/_uploads/SJGRXmMSC.png)
* 根據不同的設備，有著不同的 match+action 邏輯
	![image](https://hackmd.io/_uploads/By3E8XzBC.png)

### Middleboxes
* Middleboxes 指的是在 sourse 跟 destination 之間，除了基本的資料轉發外，還具備其他專門的功能的設備
        * NAT: 網絡地址轉換
        * Application-specific
        * Firewalls, IDS: 防火牆、入侵檢測系統
        * Load balancers: 負載均衡器
        * Caches: 用來儲存經常存取的資料副本，以減輕伺服器負擔
        * SDN: 
        * NFV: network functions virtualization (網絡功能虛擬化)，是一種將傳統上依賴於專有硬體的網絡服務，虛擬化後運行在商用現成的硬體設備上的技術

# Network Layer Control Plane
* 重要觀念: Network Layer 的重點分為兩個
	* forwarding: 將資料向前傳的的過程，屬於 data plane
	* routing: 決定資料從起點置中點的路徑，屬於 control plane (本章重點)
* control plane 又分成兩種:
	* Per-router control plane: 每個 router 自己控制資料要怎麼傳
		![image](https://hackmd.io/_uploads/HyelmKuSC.png =60%x)
	* Software-Defined Networking (SDN) control plane: 透過一個遠端的控制器計算最佳路徑，並將 forwarding table 安裝至 router 中
		![image](https://hackmd.io/_uploads/SkuXmFuBC.png =60%x)


### Routing algorithm classification
* 根據 router 得知的訊息分類
    * global (全域)
        * 所有 router 都擁有包含各節點的完整網路連接與成本訊息
        * Link State Algorithms: 例如 Dijkstra 等等
    * decentralized (分散式)
        * 每個 router 都只知道自己與其鄰居的網路連接與成本訊息
        * distance vector Algorithms: 使用類似 Bellmanford 的思路，透過每個路由器向其鄰居發送其所知的距離信息，從而逐漸更新並獲得整個網路的最短路徑信息
* 根據 router 變化速度分類
    * static: routing path 變化慢
    * dynamic: routing path 變化慢

## scalable routing 
* 現實中，封包可能的目的地過多，實務上無法讓每個 router 都儲存所有資訊
* 將一些 router 聚集成 autonomous systems (AS, 相當於 domain 的意思)
	* 在同一個 AS 內，使用之前學到的方式進行 routing (intra-AS)
	* 不同 AS 間，使用 gateway router (位於 AS 邊緣的 router) 與其他 AS 連接 (inter-AS)

### intra-AS routing
* 以下是幾種常見的 intra-AS routing protocols
	* RIP (Routing Information Protocol): 是一種基於 Distance Vector Algorithms 的 routing protocols，其規定每 30 秒交換一次 Distance Vector
	* EIGRP (Enhanced Interior Gateway Routing Protocol): 可以被視為增強版的 RIP
	* OSPF: Open Shortest Path First:
		* 是一種 link-state routing，每個 router 都會直接透過 IP 廣播 link-state
		* link 的成本透過多種衡量方式決定，例如透過 bandwidth、delay 等等
		* 每個 router 都能看到完整的網路連接情況，並使用 Dijkstra algorithm 記算自己的 forwarding table
		* 支援階級架構

## inter-AS routing
* BGP (Border Gateway Protocol): BGP 是一種傳輸協定，規範了如何透過不同 AS 間 gateway router 的溝通，來使 AS 內的 router 知道在進行跨 AS 的封包傳輸時，應該將封包往哪裡傳
* BGP 的功能與流程:
	* 每個 AS 可以通過 eBGP（External BGP)，從附近的 AS 獲得目的地網路的可達性資訊；相對的，每個 AS 也可以將自身的可達性資訊傳給附近的 AS 
	* 接著 AS 將會透過這些資訊，決定 routing 策略
	* 決定 routing 策略後，AS 便會透過 iBGP (internal BGP) 向內部的 router 廣播這個訊息。如此一來，內部 router 便能知道跨 AS 的封包傳輸時，應該將封包往哪裡傳
* hot potato routing: 如果有多條路徑可供選擇時，總是選擇最小 intra-domain cost 的那條

## Software defined networking (SDN)
沒講

## internet control message protocol (ICMP)
* 用於雙方溝通 "網路層級" 上的訊息
	* 例如用 ping 確認雙方是否連接
	* Traceroute (追蹤 sourse host 至 destination host 經過的所有路由器)
* ICMP 訊息將會被包在 IP datagram 中

## network management
* 當一個網路包含成千上萬個相互作用的硬體和軟體元件時，便需要 network management 的技術，以管理這些設備
* network management 包含:
	* Managing server: 負責監控、配置和管理網路中的各種設備，通常由網路管理員使用
	* Managed device: 被管理的設備
* 管理方式:
	* 直接透過 CLI (Command Line Interface) 存取個別的設備
	* 使用 SNMP 協定存取設備中的資料
	* NETCONF/YANG: 使用更為抽象，network-wide 的視角，強調多設備管理；YANG 是一種 data modeling language，而 NETCONF 則是一種與 YANG 相容的協定

### SNMP protocol
![image](https://hackmd.io/_uploads/HyymGMYH0.png =50%x)
* 透過 SNMP protocol，Managing server 可以有兩種方式與 Managed device 溝通
	* request/response: Managing server 主動向 Managed device 請求資料
	* Trap: Managed device 主動發送資料給 Managing server
* Management Information Base (MIB): SNMP 的核心部分，用於儲存和管理 network device 的 operational data 跟 configuration data；MIB 的結構由 Structure of Management Information (SMI) 定義

### NETCONF
* 能做到跨設備的 atomic-commit
* 基於 remote procedure call (RPC)，允許 Managing server 向 Managed device 發送具體的操作請求


# Link Layer
* 網路中的 hosts 以及 routers，在 Link Layer 中稱為 nodes
* 連接相鄰 node 的物理連接稱為 links
* 在 Link Layer 中傳輸的封包稱為 frame，是封裝後的 datagram
* 在 Link layer 中做的事
	* 加上 header, trailer 後，將 datagram 封裝成 frame
	* 使用 MAC address 來識別 sourse destination
	* recever 會負責偵測並修正因物理因素導致的錯誤
	* 控制 half-duplex 與 full-duplex

## Error detection
* 概念是利用 EDC(error detection and correction bits)，來檢查資料 D 是否出現錯誤
![image](https://hackmd.io/_uploads/By1ghMRHR.png)

### Parity checking
* 透過這種機制，可以在不重新傳輸封包的情況下更正 single bit error
	![image](https://hackmd.io/_uploads/SkG0qGRSA.png =50%x)

### Cyclic Redundancy Check (CRC)
* 比 Parity checking 更強大的 Error detection 技巧
	* 可以檢測多個 bit 都出現 error 的情況
	* 只能檢測，不能更正

## Multiple access protocols
* 當有多個 node 共用同一條 link 時，便可能會發生碰撞的情況
* 此時便需要 Multiple access protocols 進行協調，這類型的協議分成三大類型
	* channel partitioning: 將 channel 分割成更小的片段，分別給不同的 node 使用
	* random access: 允許碰撞的發生，但能從中恢復
	* taking turns: 不同 node 輪流使用 chennel

### time division multiple access (TDMA)
* 屬於 channel partitioning
* 透過時間進行分割，每個 node 都能拿到特定時間的 slot，可以再這段時間內進行傳輸
![image](https://hackmd.io/_uploads/S1HnEE0rC.png)

### frequency division multiple access (FDMA)
* 屬於 channel partitioning
* 與 TDMA 類似，但透過不同頻率來分割

### Slotted ALOHA
* 屬於 random access
* 將未來的傳輸時間切分成一個個 slot
* 每個 node 都會在 slot 的一開始傳輸資料，如此一來便能檢測到碰撞發生
* 當發生碰撞時，node 會以 p 的機率在接下來的每個 slot 內重發封包

### Pure ALOHA
* 屬於 random access
* 比 Slotted ALOHA 效率更爛，每個 node 一開始傳輸資料的時機，不受 slot 限制

### carrier sense multiple access (CSMA)
* 屬於 random access
* node 在傳輸之前，會先確認 chennel 是否空閒
* 若空閒，則會立即傳送封包
* 若不空閒，則會延遲傳輸封包
* 進階版的 CSMA/CD，還帶有檢測碰撞的功能，當發生碰撞時，同時傳輸的封包會被中止
	* 由於 propagation delay，有可能兩個 node 彼此都認為 chennel 空閒，而傳輸封包並導致碰撞

### polling
* 使用一台中央控制設備 "邀請" node 來傳輸資料
* Bluetooth 便使用此種方式
![image](https://hackmd.io/_uploads/B1kuYVRHR.png =40%x)

### token passing
* 透過 control token message，限制只有取得 token 的設備才能傳輸封包
![image](https://hackmd.io/_uploads/ByS4oECHC.png =30%x)

## MAC addresses
* MAC addresses 用於 LAN(區域網) 內傳輸 frame
* 大部分為 48-bit，例如 1A-2F-BB-76-09-AD
* 綁定設備，全球唯一

## address resolution protocol (ARP)


## Ethernet
* Ethernet 的架構分成兩種:
	* bus (匯流排): 所有設備都透過一條共同的 link 連接起來
		![image](https://hackmd.io/_uploads/SkQC_XSrA.png =30%x)
	* switch: 近代較常見，中心包含了一個 switch
		![image](https://hackmd.io/_uploads/ryrtO7BBR.png =50%x)
		
### Ethernet frame 架構
* 將來自 network layer 的封包進一步封裝後，便形成了 Ethernet frame

![image](https://hackmd.io/_uploads/ry7xcQSHC.png)
* preamble: 用於同步 receiver 以及 sender 的 clock rate
* address: 包含了 source 以及 destination 的 MAC addresses (48 bits)
* type: 用於在 receiver demultiplex
* CRC: 用於循環冗余檢查，使一種錯誤偵測技術

### Ethernet switch
* Switch 是一種 link layer 的設備，會儲存並轉發 Ethernet frame
* Switch 會根據 frame 的 MAC address，來選擇性地將 frame 轉發至特定 connection 中
	* CSMA（Carrier Sense Multiple Access）: Switch 在發送 frame 之前會先檢查是否有其他設備在使用網絡
	* CD（Collision Detection）: 如果檢測到碰撞（即兩個設備同時發送資資料），Switch 會停止發送並等待隨機時間後再試
* Switch 隨插隨用，不需要 routing table 等需要事前計算的資料
* Switch 轉發邏輯:
	* 若 frame 的 destination 與 frame 的 sourse 都來自同一條連結，代表這個 frame 不需要轉發
	*  若 frame 的 destination 與 frame 的 sourse 都來自不同連結，則轉發至對應的連結
	*  若 switch 找不到 destination address 的紀錄，則會進行 flood 的動作: Switch 會將 frame 轉發到除了 sourse link 以外的所有 link 中

### Switches vs. routers
* routers
	* 為 network layer devices
	* 透過 routing algorithms 建立 forearding table
	* 使用 IP address
* Switches
	* 為 link layer device
	* 透過自我學習建立 forearding table
	* 使用 MAC address

## VLANS
* 當 LAN (區域網路) 過大的時候不好管理
* VLANS 進一步將 LAN 區分成小區域 (透過 port 實現)
	* 每個小區域間的流量被隔離，無法直接互通
	* 不同小區域之間，需透過 routing 來轉發流量
* EVPN: 是一種跟 Eternet 以及 VLANS 有關的技術

## Multiprotocol label switching (MPLS)
* 目標: MPLS 是透過 label 快速 routing 的技術
* 透過辨識封包中固定長度的 label 實現 (一般的 forwarding 使用 "匹配最長前綴 IP address 的方式)，該封包仍帶有一般的 sourse 跟 destination IP address，供離開 MPLS router 後的 forwarding 之用
* 支援 MPLS 的 router 多了一個專屬的 forwarding table，紀錄跟 label 有關的轉發規則；轉發規則跟 source 以及 destination address 有關


## Datacenter networks
* Datacenter 所需要的網路較為特別，需要具備可靠性、負載平衡等等特性

![image](https://hackmd.io/_uploads/HJsqdt18A.png =60%x)
* Border routers: 負責對外的 router
* switches: 全聯街的 switch 結構
* TOR switch: 每台機櫃都會分配的一台 switch
* Server racks: 機櫃



# Wireless and Mobile Networks
* 本章欲探討的兩個重點
	* Wireless: 不使用物理電纜連接設備，而是通過無線電波進行通信。跟信號範圍、頻寬、干擾、延遲等等有關
	* mobility: 確保設備在移動時能夠無縫的使用網路
* wireless network 的元素:
	* wireless hosts: 可以連接到無線網路的設備
	* base station: 提供無線網路的覆蓋
	* wireless link: 將 mobile 與 base station 連接起來的無線線路
* Wireless Networks 的模式
	* infrastructure mode: 包含 base station 的網路，設備間直接通信依賴 base station
	* ad hoc mode: 設備間直接通信

## Wireless link 特性
### fading
* 無線網路的訊號強度，會隨著傳播逐漸衰減
	* Free space path loss ~ $(fd)^2$

### multipath
* 訊號從 base station 傳輸至 mobile 時，可能會透過多種反射路徑，有時間差的傳達 (multipath propagation)；這導致了互相干擾的情況

### noise
* signal-to-noise ratio (SNR) 指的是信噪比，越大代表越容易從雜訊中提取信號
* BER 指的是位元錯誤率，增加功率可以提高 SNR，且降低 BER

### Hidden terminal problem
* 當 A, C 兩個 sender 同時送資料給 B recever 時，會發生碰撞
* 但 A, C 彼此卻不知道


## Code Division Multiple Access (CDMA)
* 為一種無線通信技術，能讓多個 sender 在同一頻率範圍內同時傳送訊息給 receiver
* 實現方式: 為不同的使用者分配不同的辨識碼，透過某種互不干擾的方式結合在一起後，便能傳輸給 receiver (encode)；receiver 接收到後，再進行解碼，分出不同 sender 的訊息 (decode)
![image](https://hackmd.io/_uploads/rJ2WUw0SA.png =80%x)

## WiFi: 802.11 wireless LANs
* 常見的 WiFi 是基於 IEEE 802.11 標準的無線區域網路技術
* 在 infrastructure mode 下的基本服務集（Basic Service Set, BSS） 包含了下列元素
	* wireless hosts: 連接至無線網路的設備，例如手機等等
		* 每個新來的 host 都需要與一個 AP 相關聯
			* passive scanning: 新來的 host 會被動的收到來自 AP 的 beacon frames，讓 host 知道有哪些 AP 可供連接
			* active scanning: 新來的 host 會主動的發送 Probe Request Frames，通知附近的 AP 此設備的存在，接著等待來自 AP 的回應
	* access point (AP): 代表 base station，也就是基地台
* 使用 CSMA/CA 技術偵測跟處理碰撞
	* 若 sender 發現 link 是空的，且等待長達 "DIFS" 的時間後還是空的，則發送 frame
	* receiver 收到 frame 後，等待長達 "SIFS" 的時間後，回傳 ACK 通知 sender 已收到 frame



















	











