---
# System prepended metadata

title: Computer Networking

---

第一章
===
### TCP/IP五層架構
- 應用層 : 提供使用者多樣的網路服務 ex : HTTP、SMTP、FTP
- 傳輸層 : 決定資料的傳輸模式 ex : TCP -> 會確認封包是否遺失 UDP -> 只負責傳輸資料
- 網路層 : 決定packet傳輸的路徑，以及IP資訊
- 資料鏈結層 : 相鄰網路節點間傳輸資料的協定層，提供流量控制、錯誤檢測等功能
- 實體層 : 制定實體線路的規格、電壓、無線電波的頻率等

### Delay 種類
- processing delay : 確認封包的bit是否有誤、決定封包的output link
- queueing delay : packet在router中等待前面的packet傳送所花的時間
- transmission delay : router把packet放到link上所需的時間
- propagation delay : 實體線路傳輸封包所花的時間

### Packet Switching vs. Circuit Switching
| Packet Switching | Circuit Switching |
| -------- | -------- |
| 把資料切成一個個資料條(packet)做傳輸 | 建立一個專有通道，進行傳輸 |
| 使用共享的傳輸通道| 使用專有的傳輸通道 |
| 可同時使用人數多 |可同時使用人數少|
| 適合突發性的傳輸需求 | 適合不允許Loss的需求 |

### 專有名詞
- TDMA : 分時多工存取，使用不同的時間片讓多個使用者共用相同的頻率傳送封包
- FDMA : 分頻多重連接，使用不同的頻率讓多個使用者共用相同的時間傳送封包
- Statistical Multiplexing : 統計多工，跟TDM和FDM類似的多工方法之一，它根據使用者的需求分配頻寬
- NAT : 網路位址轉譯，改變封包傳送端或接收端的IP地址(私有IP轉真實IP)，減少真實IP的使用量
- LAN : 區域型網路 ex : WiFI
- wide-area : 廣域網路　ex : 行動網路基地台
- IXP : 提供ISP和CDN之間的資料傳輸
- routing : 利用routing table決定封包傳送路徑
- forwarding : 將封包從路由器的input移至指定的output(路徑)輸出
- traceroute : 提供source到destination之間，各個Router的delay測量

### 小知識
- 無線網路的難點：
    - 反射
    - 被阻擋
    - 相互干涉

第二章
===
### 通訊協定實際應用
- client-server : HTTP、DNS、FTP
- p2p : BitTorrent、VoIP(Skype)
- TCP : HTTP、FTP、SMTP
- UDP : DNS、VoIP

### 常用通訊協定Port
- HTTP：80
- FTP：20、21
- SMTP：25
- IMAP : 143
- POP3 : 110
- DHCP：client : 67、server : 68

### IMAP與POP3的差別
- IMAP : 會同步電腦和Server上的郵件
- POP3 : 會將Server上的郵件下載到本地，然後刪除Server裡的郵件

### DNS
- iterated query : DNS的所有查詢工作都交給Local DNS完成
![image](https://hackmd.io/_uploads/ryXXypa7p.png)
- recursive query : DNS Server會透過委託的方式請其他DNS Server幫忙查詢，並等待回傳結果
![image](https://hackmd.io/_uploads/Hys9ypaQ6.png)

### DNS resource records (RR)
- 格式 : (name, value, type, ttl)
- Type=A : name -> hostname，value -> IPv4 address ex : (office.newnet.com, 220.154.188.185, A)
- Type=AAAA : name -> hostname，value -> IPv6 address ex : (office.newnet.com, 6DAA:8B31:4DF5:D403:F972:7058:11C6:4BDA, AAAA)
- Type=CNAME : name -> alias name value -> canonical(the real) name ex : (www.ibm.com, servereast.backup2.ibm.com, CNAME)
- Type=MX : name -> hostname value -> mail server ex : (example.com, mail.example.com, MX)

### P2P
![image](https://hackmd.io/_uploads/Sygzl6p76.png)
![image](https://hackmd.io/_uploads/ByfXxpTmp.png)
- BitTorrent每30秒會隨機挑選1個人加進top-four uploader名單裡，讓沒有貢獻的使用者也能下載到檔案，這種機制稱為optimistically unchoked

### CDN
![image](https://hackmd.io/_uploads/S1e3vI6a76.png)
1. Client端先跟Server端索取manifest file，manifest file裡會有關於CDN的資料
2. Client端會選擇最適合的CDN(距離近、延遲低)來請求檔案

### 專有名詞
- User Agent : 讓User可以編輯、讀取郵件，以及幫助User將要寄的郵件送到Mail Server
- DNS : 負責將域名轉換成相對應的IP地址
- TLD : 頂級網域名稱 ex : .com .org
- socket : process和transport protocal之間的接口
- cookie : 透過在client端存放資料來達成stateful的效果

### 小知識
- SMTP使用persistent connection
- RTT 除了transmission delay外都有包含
- FTP使用2個port來進行通訊，分別是data port(20)以及control port(21)或稱command port

第三章
===
- Transport Layer主要是探討process和process之間的傳輸
- 我們將Transport Layer的封包稱為segment

### Multiplexing/Demultiplexing
- multiplexing : 把不同process的封包匯集到同一條線路輸出
- demultiplexing : 根據線路中封包的資訊分送給不同的process，host是根據IP address和port number來決定demultiplexing的位址
- UDP Server只需要開1個socket進行通訊即可
- TCP Server由於會先建立連線，所以需要1個socket負責建立連線(welcome socket)，以及根據使用者連線數量建立的connection socket

### Checksum
1. 先將所有的資料以16bit為一組累加幾來，如果有溢位就把溢位的bit加在最右邊
2. 對累加的結果sum做1補數，將結果保存在checksum欄位裡
3. receiver收到封包後先做累加，並比對累加後的結果是否跟checksum一致(比較bit值或判斷sum和checksum相加是否等於1)
![image](https://hackmd.io/_uploads/S1tojp67p.png)

### UDP header
![image](https://hackmd.io/_uploads/SJij46x8a.png)

### TCP header
![image](https://hackmd.io/_uploads/SkGJSaxIT.png)
- Data Offset：指出Data出現的位置，該位置前面就是header資訊
- URG：告訴系統此封包為緊急資料，要盡快接收
- ACK：Acknowledgment Number才有效
- PSH：host會把在buffer的資料直接往上送，不管buffer是否裝滿或順序正確
- RST：表示 TCP 連線中出現嚴重錯誤(對方的port不可用、socket提前關閉等)，必須關閉連線
- Urgent Pointer：封包中的緊急資料的最後一個位元組的序號。

### Reliable Data Transfer (rdt)
- rdt2.0 : 使用ACK和NAK告訴sender封包是否有誤
![image](https://hackmd.io/_uploads/SyyNTTpXT.png)
- rdt2.1 : 利用編號的方式預防ACK或NAK封包有錯的情形
![image](https://hackmd.io/_uploads/SJf_Apa7T.png)
![image](https://hackmd.io/_uploads/rklKCp67a.png)
- rdt2.2 : 只用ACK表示封包是否有誤
![image](https://hackmd.io/_uploads/H1IZy0pQT.png)
- rdt3.0 : 增加對封包loss的情形，使用計時的方式解決
![image](https://hackmd.io/_uploads/BJ341AT7p.png)

### Pipelined protocols
- Go-back-N：使用cumulative ack，只需維護一個timer
![image](https://hackmd.io/_uploads/S1_uF6gUT.png)
- Selective repeat：每個packet都有自己的計時器，並且需要buffer暫存未排序的封包。如果需要重傳資料只需傳沒有收到ACK的封包就好
![image](https://hackmd.io/_uploads/SkT8qagIa.png)
Selective repeat的sequence size需要>=2 * window size，否則會出現封包無法辨識的問題
![image](https://hackmd.io/_uploads/S19AqaxLa.png)
- TCP Pipelined：使用cumulative ack，但重傳只傳第一個遺失的封包

### TCP timer 計算方式
![image](https://hackmd.io/_uploads/r1eIsTlUT.png)
![image](https://hackmd.io/_uploads/SJs6haeU6.png)

### TCP 特別功能
- fast retransmit：如果收到3個重複的ACK(也就是4個一樣的封包)，就會直接重傳該封包
- flow control：receiver會告訴sender自己緩衝區的容量情況，以免sender把receiver的緩衝區灌爆!
![image](https://hackmd.io/_uploads/B1wm06x8p.png)
- congestion control：TCP會根據當前網路的運作情況，調整windows的大小，以免網路塞車
- sender的window size是由flow control和congestion control的最低值決定

### TCP congestion control 階段
- slow start：MSS從1開始，每收到1個ACK MSS就+1(指數成長)，直到到達threshold為止
- congestion avoidance：MSS以線性速度增加(收到全部的ACK才將MSS +1)
- 如果出現3 duplicate ACK，先將threshold設為cwnd / 2，然後分以下兩種版本
    - Tahoe：cwnd設為1，然後回到slow start階段
    - RENO：cwnd設為更新後的threshold + 3，然後回到congestion avoidance階段
- 如果出現超時，一律將threshold設為cwnd / 2、cwnd設為1，然後回到slow start階段

第四章
===
- network layer主要是探討router跟router之間的傳輸
- 我們將network layer的封包稱為datagram

### router兩大功能
- routing：利用一些演算法決定路徑，建立forwarding table (Data plane)
- forwarding：根據forwarding table將router的input移至對應的output (Control plane)

![image](https://hackmd.io/_uploads/rJoV4Ub8p.png)
![image](https://hackmd.io/_uploads/BJjpVI-UT.png)

### Switching fabrics 類型
- memory：使用記憶體複製封包的方式執行forwarding，透過CPU指令操作
- bus：使用共享的匯流排做forwarding，會有爭搶資源的情形
- crossbar：建立多個share bus，減少爭搶資源的情況
![image](https://hackmd.io/_uploads/HJBQ8UZU6.png)
![image](https://hackmd.io/_uploads/S1LqLI-Ip.png)

### Scheduling mechanisms
- discard policy
    - tail drop：最後來的先丟棄
    - priority：根據優先權丟棄封包
    - random：隨機丟棄封包
- priority scheduling
    - 一般類型：先將優先權高的封包送完，再送優先權低的封包
    ![image](https://hackmd.io/_uploads/ryHhwU-UT.png)
    - Round Robin (RR)：輪流送封包 ex：先讓紅色送再換綠色送
    ![image](https://hackmd.io/_uploads/B1L1OIbLT.png)
    - Weighted Fair Queuing (WFQ)：Round Robin的改良版，有權重優先權的輪流送封包
    ![image](https://hackmd.io/_uploads/S11__8bLT.png)

### IP header
![image](https://hackmd.io/_uploads/SJcmFIZLp.png)
- Flage
    - 第一位：保留位元，必須為0
    - 第二位：don’t fragment
    - 第三位：more fragment
- Fragment offset：每個fragment相對於原始封包開頭的偏移量，以8 Byte為單位。

### DHCP
![image](https://hackmd.io/_uploads/SymijUZLp.png)

### NAT
![image](https://hackmd.io/_uploads/rJ3xlwZL6.png)

### IPv6 header
![IPv6](https://hackmd.io/_uploads/rJQOxKZU6.png)
- next header：功能與IPv4的Protocol相同
- hop limit：功能與IPv4的TTL相同

### 專有名詞
- CIDR(Classless InterDomain Routing)：無類別區間路由，IP address前面一部分長度代表subnet，長度大小隨意

### 小知識
- 我們要自己設定host的Router IP地址，或是DHCP在分配IP時也會傳遞IP資訊
- Router的output interface是由人設定的，所以router知道output路徑的router ip地址

第五章
===

通靈問題
===
(F) ![image](https://hackmd.io/_uploads/Sk86ZdR7p.png)
(F) ![image](https://hackmd.io/_uploads/HyVgGu0m6.png)

