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

* : **device**,連接網路的各種設備
* : **Packet switch**,負責傳輸 (**forward**) 資料,包含
* router: 負責在不同網路間傳遞資料
* switch: 負責在同一個網路間傳遞資料
* : **Communication links**,代表連接設備的線路 (有線或無線皆可)
* : 每個這樣的區域便是一個 **network**
## internet 簡介
* **Internet**: 連接各個 network 的 network
* **protocols**: 描述了 device 間互相溝通的規則
* **Internet standards**:
* RFC: 各種 protocols 的書面標準
* IETF: 修訂 protocols 的協會
### internet 結構
* **network edge** (網絡邊緣): 接入網路的末端設備,包含
* client: 使用服務的終端
* server: 提供服務的終端

* **access network**: 介於 network edge 以及 network core 的溝通橋梁,負責連接兩者 (可以為有線或無線)

* frequency division multiplexing (FDM): 是一種不同的頻道在不同的頻段傳輸的技術
* hybrid fiber coax (HFC): 一種同時使用了光纖和同軸電纜,來連接家庭和互聯網服務提供商(ISP)路由器的技術
* digital subscriber line (DSL): 在保留電話原有功能的同時,利用電話線來傳輸數據的技術
* **network core**: 由介於 client 跟 server 間的 routers 組成,負責各個網路之間的通信
* edge router: 最接近終端的那個 router

### access netowrks
#### Wireless access networks (無線電存取網路)
* 分成兩種
* **Wireless local area networks** (無線局域網): 又稱 WLANS
* 覆蓋範圍小
* 較慢

* **Wide-area cellular access networks** (廣域蜂窩接入網路): 由網路服務供應商提供
* 覆蓋範圍大
* 較快
* 4G / 5G

#### enterprise networks (企業網路)
* 包含有線、無線網路技術

#### data center networks (資料中心網路)
* 要求 high-bandwidth 傳輸
* 速度非常快

### physical media (傳輸資料的物理媒介)
又稱為 guided media,訊息在固體媒介中傳播
#### **Twisted pair (TP)**
* 由兩條銅線扭轉而成的線材
* **最常見**

#### **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

傳遞方式:
1. 首先透過 routing 的技術,建立 "forwarding table",以決定封包傳遞的路徑
* routing 是 global action
2. 接著透過 forwarding 的技術,查詢 "forwarding table",實際將封包向前傳遞;封包完整的到達 router 時,才會往下一個 router 傳送
* forwarding 是 local action
* 適用於 "bursty" data (不總是有資料流的情況)
* on-demand allocation (資源只在需要時才被分配和使用)
#### host sending function

* host: 送出 package 的主機
* package (封包): 資料包
* 公式: 假設封包長 L bits、transmission rate 為 R
* 則 packet transmission delay (傳遞一個封包所需的時間) = $\frac{L}{R}$
### **circuit switching**
在 host 跟 distination 間建立一個持續存在的專屬通道,專門保留用來給兩者通信用 (無論是否真的有在使用)

當有多個使用者想要使用網路時,實作方式又分成兩種
* FDM: 用不同頻率為使用者切分出各自使用的頻域空間

* TDM: 用不同時間為使用者切分出各自使用的時間空間

* 使用於須持續連接的情境中,例如實時影像通訊
* reserved resources (無論資源是否使用,都會被分配出去)
* **過去被實作於的電話線路中**
## Internet 宏觀結構
Internet 可以被視作 "network of networks",負責將各個 network 連接起來


* 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

* 由於 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 = 距離 / 傳輸速度)**

* Packet queueing delay: $\frac{L*a}{R}$
* a: 平均的封包到達速率
* L: 封包大小
* R: 每單位時間能處理的 bit 大小
* 可以使用 traceroute 程式,來測量封包傳輸路徑上遇到的每一個路由器的延遲
## Throughput
* 每單位時間從 server 至 receiver 能傳送的 bits 數量,有兩種衡量方式
* instantaneous: 瞬時
* average: 平均
* 整體的 Throughput 受到該路徑中 Throughput 最小的路段限制 (bottlenet)


* 如果有多個 connection 共用某條網路,這些 connection 將會公平地分享這條網路的流量

## 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 (協定層)
將通信協定分解為不同層次的結構,方便管理與更改

* 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: 負責處理實際在 "線路" 中傳輸的資料

* 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 不適用,因為在傳輸過程中加密了

補充:
另一種加速方法是透過 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**

#### SMTP 標準規範

* 首先,初始化 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)

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

2. recursive query: 本地只向最高層級的 DNS server 進行 query,剩下的交給 最高層級的 DNS server 負責
* 缺點: 較高層級的 DFS server 負擔重

### **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

### 針對 DNS 的攻擊
DDoS attacks: 透過發送大量請求癱瘓 server
Spoofing attacks: 注入假 ip 與 網域的對應關係
## Peer-to-peer (P2P)
* P2P 架構是一種去中心化的系統設計,允許各端系統直接通信
* 不需要持續運行的中央伺服器
* 具有自我擴展性,隨著新使用者的加入,系統的負載提升,但同時也有更多人能處理請求
### **BitTorrent**
* **BitTorrent** 是一種基於 P2P 的檔案分享協議
* 檔案將會被切成多個大小為 256Kb chunks
* 參與這個資源共享網路的使用者稱為 torrent
* Tracker: 協調下載和上傳文件的對等節點的伺服器

策略:
* 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 的資料流合併到一個輸出流中的過程

* demultiplexing: 是指將從單一資料流中提取出來的多筆資料分開的過程

* 實現方式: 每個 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 增加可靠性及壅塞控制)

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

## Reliable data transfer protocol (rdt)

* 構建一套 rdt 系統,能夠在 unreliable channel 跟上層間,將 unreliable 事件變成 reliable 的
### pipelined protocols operation: Go-Back-N
為了提升傳輸速率,使用 pipelining 的技術
* 原本 sender 需收到 recever 的封包回應後,才寄出下一個封包
* 結合 pipelining 的技術後,sender 在收到 recever 的封包之前,便先偷寄出下一個封包

#### sender 處理邏輯

* 假設將 sender 要寄出的封包排成一列,將會分別有四種狀態
* 已經 ACK 的封包
* 寄出去,但還沒 ACK 的封包
* 準備寄出的封包
* 還沒準備好寄出的封包
* window size 是固定的大小
* 每個封包寄出後,都有一個 timeout 時間;若超過該時間後,該封包還沒 ACK,則會重寄該封包以及其後的所有封包 (這個機制保證封包發生 loss 時的處理方式)
#### recever 處理邏輯

* 永遠只回應 "最後一個正確接收的封包 ACK 編號" 給 sender
* 收到錯誤的封包時,丟棄是一種常見策略
* 這個機制可能會導致不斷回應同一個 ACK 編號
#### 實際演示

* 注意當 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 介紹


* sequence number: TCP 將資料視為 byte stream,每個 byte 都有一個連續且獨一無二的編號,sequence number 用來紀錄該 segment 所包含的資料中,第一個 byte 的編號是多少;這有助於控制 "訊息將會按順序到達" 這件事

* Acknowledgements number (ACK): 用來告訴 receiver,自己 "下一個預期收到的 byte 編號" 是多少;換句話說,對於 sender 來說,編號小於此值的位元組,皆已正確接收 (ex: Acknowledgements number = 101,代表已確認收到了 100 byte 的資料,期望下一個收到的資料是第 101 個 byte)

### TCP retransmission
* 設置一個 timeout 期限,當過了該期限後還沒有收到對應的 ACK 的話,重送

* TimeoutInterval = EstimatedRTT + 4*DevRTT
* EstimatedRTT: 估計的 RTT
* 4*DevRTT: 4 倍標準差
* 但有個需注意的地方,即使某些 ACK 回傳過程出現 loss,只要能回傳更後面進度的 ACK,便不需重送,這是因為 ACK 的定義為 "編號小於此值的位元組,皆已正確接收"

* TCP fast retransmit 機制: 當 sender 在 timeout 的時間之內,除了本來就會收到的 ACK 外,還收到額外的 3 個 (總計四個) 相同的 ACK,代表可能有封包發生 loss 了,於是這個機制在 timeout 前便重新寄送 "猜測丟失" 的那個封包

### TCP flow control
* receiver 控制 sender,以防止發送端傳輸過多或過快的資料,從而溢出接收端的緩衝區。這是透過一個稱為流量控制(Flow Control)的機制來實現的。
* 具體而言,receiver 透過封包中的 rwnd 欄位來告知發送方自身可用的緩衝空間
### TCP connection
* 在交換資料之前,serder 跟 receiver 會先進行 "handshake",目的是確認雙方都願意連接
#### 建立連接: 3-way handshake

* 第一步 (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 砍半

* 實務上,是透過控制 cwnd 的大小,來實現控制 TCP sending rate

* 除此之外,為了避免 slow start 的問題,TCP 在連接初期,會指數性的提升傳輸速率,直到第一個 loss 發生或是 TCP sending rate 達到閾值
#### CUBIC 機制
* 是另一種避免 congestion 的方法
* 使用立方函數的公式,略為提升傳輸效率

* 紅色線為 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

* Software-Defined Networking (SDN) control plane: 由一個 Remote controller 來全局計算,並安裝 forwarding table 至其控制的各個 router 中

## 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 的方式進行匹配

* generalized forwarding: 根據 header 中的 field values 來進行 forwarding (較有彈性)
* 可以透過以下三種方式實作 Switching
* memory
* bus
* interconnection network
* Crossbar
* Clos networks
* Cisco CRS router
### Input port queuing
* 當 switching 的速度低於輸入速度時,便會出現 queueing 的情況

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 格式

* network layer 封裝的封包,仍然有針對其 header 的 checksum
* 每個封包都包含 sourse IP address、destination IP address
### IP addressing

* 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
* 共分成四步

* 至於獲取 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 的轉換關係

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

回顧: IPv4

## 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

* 根據不同的設備,有著不同的 match+action 邏輯

### 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 自己控制資料要怎麼傳

* Software-Defined Networking (SDN) control plane: 透過一個遠端的控制器計算最佳路徑,並將 forwarding table 安裝至 router 中

### 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

* 透過 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 是否出現錯誤

### Parity checking
* 透過這種機制,可以在不重新傳輸封包的情況下更正 single bit error

### 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,可以再這段時間內進行傳輸

### 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 便使用此種方式

### token passing
* 透過 control token message,限制只有取得 token 的設備才能傳輸封包

## MAC addresses
* MAC addresses 用於 LAN(區域網) 內傳輸 frame
* 大部分為 48-bit,例如 1A-2F-BB-76-09-AD
* 綁定設備,全球唯一
## address resolution protocol (ARP)
## Ethernet
* Ethernet 的架構分成兩種:
* bus (匯流排): 所有設備都透過一條共同的 link 連接起來

* switch: 近代較常見,中心包含了一個 switch

### Ethernet frame 架構
* 將來自 network layer 的封包進一步封裝後,便形成了 Ethernet frame

* 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 所需要的網路較為特別,需要具備可靠性、負載平衡等等特性

* 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)

## 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