# 電腦網路概論 ###### tags: `NCKU` ## Chapter 1 Introduction ### 常見縮寫 * ISP:網路服務供應商 Internet Service Provider (e.g. 中華電信) * TCP:傳輸控制協定 Transmission Control Protocol * UDP:使用者資料包協定 User Datagram Protocol ### 常見設備 #### 數據機 (modem, modulator-demodulator) 是一個能將**數位訊號**調變到**類比訊號**進行傳輸,並解調收到的**類比訊號**為**數位訊號**的電子裝置。 #### 路由器 (router) 提供**路由**與**轉送**兩種重要機制: * 路由:決定**封包**於host到host之間的傳輸路徑的**過程** * 轉送:將路由器**輸入端**的**封包移送至**適當的路由器**輸出端** 路由的工作在**OSI網路模型**的**網路層** ### 何謂協定 (Protocol)? > **Protocol** defines the **format**, **order** of **messages sent and received** among network entities, and **actions taken** on message transmission, receipt. **協定**定義了網路實體之間**發送和接收**消息的**格式**、**順序**,以及對消息傳輸、接收所**採取的動作**。 **協定**是一種標準化的溝通規範,它描述了通訊系統中的**通訊規則、數據格式、錯誤檢測和糾錯機制**,以確保通訊雙方能正確地解讀和處理訊息。 ### TCP/IP Model 封裝名稱 * 傳輸層 * TCP表頭+資料:**TCP 區段 (TCP Segment)** * UDP表頭+資料:**UDP 資料包 (UDP Datagram)** * 網路層 * IP表頭+資料:**IP 資料包 (IP Datagram)** 或 **封包 (packet)** * 鏈結層 * 鏈結層表頭+資料+(表尾):**訊框 (Frame)** ### 封包傳輸 #### 封包延時 Packet delay $$ d_{nodal} = d_{proc} + d_{queue} + d_{trans} + d_{prop} $$ - $d_{nodal}$:節點總延時 - $d_{proc}$:節點處理延時 - 檢查錯誤 - 判斷輸出線路 - 通常時間 < microsecs - $d_{queue}$:排隊延時 - 等待傳輸 - $d_{trans}$:傳輸延時,將封包推向線路的時間 - $L$:封包長度 (bits) - $R$:傳輸速率(bits/sec) - $d_{trans} = L/R$ - $d_{prop}$:傳播延時,實體線路的傳播時間 - $d$:實體線路長度 - $r$:傳播速率 - $d_{prop} = d/r$ #### 封包排隊延時 Packet queueing delay - $a$:平均封包到達速率 - $L$:封包長度 (bits) - $R$:傳輸速度 (bit transmission rate) ==**traffic intensity**== $$ \frac{L \cdot a}{R}:\frac{\text{arrival rate of bits}}{\text{service rate of bits}} $$ 當值大於0.7 $\Rightarrow$ **high queueing delay** ![](https://i.imgur.com/pefFUVB.png) #### 封包丟失 Packet loss ## Chapter 2 Application Layer ### 常見縮寫 - TLD:Top-Level-Domain - RTT:Round-Trip Time - 資料從**發送端**到**接收端**再返回**發送端**的時長 ### HTTP (HyperText Transfer Protocol) - 使用**TCP** - Port:80 ``` 運作流程: 1. 客戶端初始化與伺服器的TCP連線 (80 port) 2. 伺服端接受客戶端的TCP連線 3. 兩端互相交換HTTP訊息 4. 關閉TCP連線 ``` #### 版本差異 |版本|差別| |-|-| |HTTP/1.0|1個物件、1個TCP連線,每個物件需要 2 RTT| |HTTP/1.1|多個物件、1個TCP連線| |HTTP/2.0|| |HTTP/3.0|| ### DNS (Domain Name System) - 使用兩者**TCP**或**UDP**傳輸 - Port:53 - 可同時發送多個請求 - 主機發送DNS請求時,會發送到 Local DNS server #### DNS資源紀錄 Resource Record (RR) ``` 格式:(name, value, type, ttl) name:域名 ttl: Time to Live ``` |Type| Description | |---|---| |A|將域名解析為 **IPv4**| |AAAA|將域名解析為 **IPv6**| |NS|指定該域名的DNS伺服器| |CNAME|將域名解析為另一個域名(別名)| |MX|指定郵件伺服器的地址| |PTR|反向DNS查詢,將IP解析為域名| ### SMTP (Simple Mail Transfer Protocol) - 使用**TCP** - Port:25 - 用於傳輸郵件 (push) ### IMAP (Internet Message Access Protocol) - Port:143 - 一種郵件伺服器和郵件客戶端之間的協定 ![](https://i.imgur.com/NidQsAA.png) ## Chapter 3 Transport Layer ### Principle of reliable data transfer (rdt) |version|assumption| |-|-| |rdt 1.0|**reliable channel:** no bits error, no loss of packets| |rdt 2.0|channel with **bit error**,include **ACKs、NAKs**| |rdt 2.1|handle corrupt on ACK/NAKs,include **sequence number(0, 1)**| |rdt 2.2|**NAK-free**,add seq# to ACK| |rdt 3.0|channel with **errors and loss**,include **timeout**| ### Principles of congestion control **Approaches** * **End-end congestion control** * 沒有明確的回應 * 從丟失和延遲來推斷壅塞 * TCP 使用的方法 * **Network-assisted congestion control** * 路由器會有明確的回應 * 回覆壅塞的程度或明確指示傳送速率 * TCP ENC, ATM, DECbit protocol ### Transmission Control Protocol (TCP) #### TCP round trip time (RTT), timeout * 如何決定 TCP timeout 的值? * **SampleRTT** * 測量將Segment送出到接收ACK的時間 * 每次測量的值可能會差很多,所以要將先前的預測納入考慮,才能讓結果更 Smooth * 使用 **Exponential Weighted Moving Average (EWMA)** * **EstimatedRTT** * **EstimatedRTT$_1$** = $(1-\alpha)$\***EstimatedRTT$_0$** + $\alpha$\***SampleRTT$_1$** * $\alpha$ 通常為 0.125 * 將結果再加上**安全邊界(safety margin)** * **TimeoutInterval$_1$** = **EstimatedRTT$_1$** + 4\***DevRTT$_1$** * **DevRTT** * Dev:Deviation 偏差 * **SampleRTT$_1$** 對 **EstimatedRTT$_0$** 偏差的 **EWMA** * **DevRTT$_1$** = $(1-\beta)$\***DevRTT$_0$** + $\beta$\*$|$**SampleRTT$_1$** - **EstimatedRTT$_0$**$|$ * $\beta$ 通常為 0.25 #### TCP Connection Management **建立連線** **TCP 3-way handshake** ```sequence Note left of Client: Init seq num x Client->Server: SYN, seq=x Note right of Server: Init seq num y Server->Client: ACK-SYN\nseq=y, ACK=x+1 Note left of Client: Receive SYN-ACK Note left of Client: Send ACK for SYN-ACK Client->Server: ACK=y+1 Note right of Server: Receive ACK Note right of Server: Done! ``` **關閉連線** ```sequence Client->Server: FIN Server->Client: ACK Server->Client: FIN Client->Server: ACK ``` #### TCP congestion control * AIMD * slow start * CUBIC * fairness ## Network Layer Introduction * **主要功能** * forwarding:將輸入的封包**導向至正確的輸出端** * routing:決定封包從來源端到目的端的**傳輸路徑** * Plane * Data plane * forwarding * local:per-router function * Control plane * routing * network-wide logic ## Chapter 4 Network Layer - Data plane * **Router architecture** * input ports * switching * output ports ![](https://hackmd.io/_uploads/rydVyT-P2.png) * **Internet Protocol (IP)** * IP address (32 bits) * **Dynamic Host Configuration Prorocol (DHCP)** * 取得IP位址 ### Input ports * **功能** * 使用 header fields value 和 forwarding table 找到 output port * **forwarding** * destination-based forwarding (traditional):僅透過目的IP來判斷 * generalized forwarding:透過 header field value 來判斷 #### Longest Prefix matching * 找相對應的前綴 (prefix) * 若有多個,找對應最多的 (longest) ### Swtiching fabrics * **三種主要的形式** * memory * bus * interconnecting network ![](https://hackmd.io/_uploads/rym5G6-D3.png) ### Output ports * Buffering * Scheduling discipline #### Packet scheduling * FCFS (first come, first served) * Priority queue * Round Robin * Weighted fair queueing (WFQ) ### Internet Protocol (IP) ## Chapter 5 Network Layer - Control plane ## Chapter 6 Link Layer ### Introduction * 用 **frame** 封裝 **datagram**,加入表頭、表尾 * 負責傳輸 **datagram** 從一個節點到另一個**物理上**鄰接的節點 * 從**發送端**到**目的端**中間的節點間,可透過不同的方式傳輸 * 例如:將 datagram 從 A 傳到 C * A 到 B 用 Ethernet 傳 * B 到 C 用 WiFi 傳 * 使用 **MAC位址** (Media Access Control Address) 來辨別**來源端**和**目的端** * Link Layer 提供的服務有 * **framing**:封裝資料包 * **節點間可靠的傳輸** * **流量控制** (flow control) * **錯誤偵測** (error detection)、**錯誤糾正** (error correction) * **半雙工** (half-duplex)、**全雙工** (full-duplex) * 差別在於兩端是否能**同時互相**傳輸資料 * Link Layer 被實作在**網路介面卡**(Network Interface Card, **NIC**)或**晶片**(chip)上 ### MAC address * **48-bit**, e.g. 1A-2F-BB-76-09-AD * **前三碼**:製造商、**後三碼**:流水號 * 印在網卡上 ### Error Detection, Correction #### Error Detection ==**不是100%可靠**== 在傳送資料(**D**)的時候,以 **bits** 的方式來看,用**演算法**對原始資料做計算產生**錯誤檢查碼**(Error Detection Code, **EDC**),再將**EDC**加在**D**的後面並送出。 **送出的資料** |---D---|EDC| |-|-| **接收到的資料** |---D'---|EDC'| |-|-| 將接收到的資料,用同樣的方式對 **D'** 生成EDC,再去檢查是否和 **EDC'** 相同。 :::info **資訊冗餘** (information redundancy) 像上面的例子,在資料後面加上一些資訊,可用來**檢測一致性**和**恢復損壞的資訊** ::: #### 奇偶校驗 (pairty checking) ![](https://hackmd.io/_uploads/HylI5YiL2.png) #### checksum 就和前面的一樣 #### 迴圈冗餘校驗 (Cyclic Redundancy Check, CRC) 可以把一組位元想像成是一個多項式 例如,$111_2$ 的多項式就是 $x^2+x+1$、$101_2$ 就是 $x^2+1$ 假設**原始資料**$M(x)$、**鑰匙**$K(x)$ ($n+1$階多項式) 計算 $$ M(x) \cdot x^n = Q(x) \cdot K(x) - R(x) $$ $M(x) \cdot x^n$ 相當於將 $M$ 左移 $n$ 位 ==實際傳送的資料是$M(x)\cdot x^n+R(x)$== 接收端只要檢查收到的資料是否能被$K(x)$整除,就能知道是否是正確的。 :::spoiler 簡報上的表示法 D:data bits G:bit pattern (key) (r+1 bits) R:D*$2^r$ / G 的餘數 (r bits) 傳送的資料:<D,R>=D*$2^r$+R 接收端知道 G 就可以檢查**接收到的資料**<D,R>是否能被G整除 如果算出來有餘數的話:Error Detected! ::: ### Multi Access Protocol **多重存取協定** * **channel partitioning MAC protocol** * TDMA (time division) * FDMA (frequency division) * CDMA (code division) * **random access MAC protocol** * ALOHA * Slotted ALOHA * CSMA * CSMA/CD * **"taking turns" protocol** * polling * token-passing * Bluetooth #### TDMA #### FDMA #### Pure ALOHA #### Slotted ALOHA ![](https://hackmd.io/_uploads/S1975HgPn.png) **假設** * 每個 frame 的大小都一樣 * 將時間分成好幾個 slot * node 之間是同步的 當 node 接收到新的 frame,會在下一個 slot 進行傳送 * **沒有碰撞**(沒有其他node用同一個slot): * 送出 * **碰撞發生**: * 在接下來的slot會有機率 $p$ 的機會選擇送出,直到成功送出為止 **效率** $N$ 個節點要送出多個 frame,機率 $p$ * 一個節點成功送出的機率:$p(1-p)^{N-1}$ * 任意一個節點成功送出的機率:$Np(1-p)^{N-1}$ * 最大效率:找出 $p^*$ 使 $Np(1-p)^{N-1}$ 最大 * 得到 $p^* = 1/e = 0.37 = 37\%$ #### Carrier Sense Multiple Access (CSMA) ==CSMA/CD:CSMA with collision detection== ==CSMA/CA:CSMA with collision avoidance== **Ethernet CSMD/CD algorithm** 1. NIC 從網路層接收 datagram 加上 frame 2. NIC 感測 channel * 若 **idle**:馬上送出 * 若 **busy**:等待直到 idle 再傳送 3. 若完整送出且沒有碰撞,**Done!** 4. 若在傳輸的過程中感測到碰撞:**終止傳輸** 5. 等待一段時間,回到第 2. 步 * **binary (exponential) backoff** * 在經過 $m$ 次碰撞後,NIC 會從 $\{0,1,\dots,2^m-1\}$ 裡面隨機選一個 $K$,等待 $K\cdot512$ bit times * bit time:NIC 彈出 1 bit 所需的時間 * Example:10 Mbit/s NIC * bit time = 1 / (10 * 10^6) s = 100 ns ### Address Resolution Protocol (ARP) ==位址解析協定== **ARP table**:存在於 **LAN** (Local Area Network) 的每一個節點中,用於 IP/MAC 之間的對照 `<IP address; MAC address; TTL>` ==用廣播的方式傳送== #### ARP query **Destination MAC address**:FF-FF-FF-FF-FF-FF Ethernet frame (sent to FF-FF-FF-FF-FF-FF) ``` Source MAC: 71-65-F7-2B-08-53 Source IP: 137.196.7.23 Destination IP: 137.196.7.14 ``` #### ARP response Ethernet frame (sent to 71-65-F7-2B-08-53) ``` Target IP address: 137.196.7.14 Target MAC address: 58-23-D7-FA-20-B0 ``` ### Ethernet * **Connectionless**:no handshaking * **Unreliable**:no ACK or NAK * **MAC protocol**:CSMA/CD with binary backoff #### Ethernet frame structure ... ### Switch * link-layer device * store, forward Ethernet frames #### Switch forwarding table `(MAC address of host, interface to reach host, time stamp)`