# 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