# Colde Garage - 網路概論 Lecturer/Author: Chun-You, Yang Date: Sep 28^th^, 2017 ## 開放式系統互連通訊參考模型(OSI) OSI 英文全稱叫做 Open System Interconnection Reference Model,是一個網路的分層概念。 若使用郵局寄送包裹的概念,來比喻為一條網路連線在傳遞資料封包[^封包]的過程,可以想像這樣的過程有許多不同層次的東西互相配合而成,如實體的道路、郵差、郵局、包裹收發中心、客戶本身等。OSI 的分層就是在對這些不同層次的傳輸進行概念定義。 [^封包]:封包:網路中傳輸的的格式化資料資料單位。 **OSI 總共有七個層級**,這七個層級可以整合為兩個大的分類,分別是「主機」與「媒介」,分別指在客戶端裝置上的處理層級,或是資料傳遞路徑上的處理層級。 ![](https://fthmb.tqn.com/T0bBBUrG66URhiEmuaoExvAnzcw=/768x0/filters:no_upscale()/about/Osi-model-jb.svg-57f7b9af3df78c690f6305e8.png) OSI 的七個層級分別如下: ### 媒介層 **1. 實體層 Physical Layer** 以位元(Bit)為資料傳遞單位。 定義機械、電氣等特性(Ex. 網路線裡面的電子訊號的 spec)。 Ex. 乙太網 **2. 資料連接層 Data Link Layer** 以資料框(Frame)為資料傳遞單位。 定義一串位元的正確程度檢查標準,確保資料「看起來」是一樣的。 在資料連接層中,裝置之間透過 MAC Address 進行識別。 Ex. 乙太網路, Wi-Fi **3. 網路層 Network Layer** 以封包為資料傳遞單位。 定義網路各個節點裝置間的位址分配、傳遞路徑與壅塞控制。 然而,此層不考慮丟包等可靠性問題。 在網路層中,裝置之間透過 IP Address 進行識別。 Ex. IP ### 主機層 **4. 傳輸層 Transport Layer** 以資料段(Segment)為資料傳遞單位。 定義節點之間能夠可靠傳遞的一套傳輸協定標準。(Ex. 沒收到資料包時何時要重新傳遞) Ex. TCP, UDP, SSL **5. 會議層 Session Layer** 這層次基本上被棄用,在此不討論。 **6. 表現層 Presentation Layer** 這層次基本上被棄用,在此不討論。 **7. 應用層 Application Layer** 以一連串的資料為資料傳遞與處理的單元。 定義終端收到一連串完整的資料後,要對該資料進行什麼應用的協定,如網頁瀏覽、檔案傳輸、影音串流等。 Ex. HTTP, HTTPS, FTP, DNS, DHCP 以下我們會開始針對各個層次中的協定稍做簡介。 ## 實體層 ### 常見的網路連接 #### ADSL ADSL 英文全稱為 Asymmetric Digital Subscriber Line,中文稱為非對稱數位用戶線路。非對稱意思是網路線路上行(用戶到電信商)和下行(電信商到用戶)頻寬不對等。 ADSL 的訊號通常由電信服務提供商附加在電話線路上,因此用戶端需要增加一個 ADSL 終端機,來將 ADSL 的網路訊號與普通電話訊號分離出來。 #### 光纖 光纖通訊就是利用光在介質(光纖)中全反射的原理進行資料傳遞。深入的原理這裡不多說明,我們這裡簡單說明一下光纖網路架構中常見的名詞:FTTx。 FTTx 英文全稱是 Fiber To The x,意思是光纖到x。亦即網路連線從電信商到客戶端的過程中,光纖線路的目的地長度。常見的有以下幾類: * FTTN:Fiber To The Neighborhood:光纖到鄰里 * FTTC:Fiber To The Curb:光纖到街角 * FTTB:Fiber To The Building:光纖到大樓 * FTTH:Fiber To The Home:光纖到府 ![](https://upload.wikimedia.org/wikipedia/commons/thumb/7/78/FTTX-zh.png/300px-FTTX-zh.png) ### 常見的網路裝置 #### Hub 集線器 Hub 裡面其實就是把所有網路線直接接在一起。只要插上電腦就可以直接使用。 Hub 使用 **Broadcast(廣播)** 來傳送資料。 Broadcast 的意思是,當 A 電腦要傳遞資料給 B 電腦的時候,A 傳遞出來的資料會被 Hub 上的所有電腦都通知到,但只有 B 電腦會收下。 Hub 屬於**半雙工**裝置。 半雙工的意思是對一個裝置來說,「傳」與「送」一次只能做一種。因此當連接到 Hub 上的裝置越來越多,網路速度就會變慢。 :::warning **[Q]** Hub 中應用到 OSI Layer 中最高哪一層的定義? **[A]** 實體層。因為 Hub 完全不管資料是什麼,他只把所有訊號接在一起,依照規定的電氣標準傳給所有人。因此屬於實體層。 ::: #### Switch 交換器 雖然跟 Hub 一樣,只要插電插線即可使用,但其運作與 Hub 十分不同。Switch **並不會持續的 Broadcast**,同時他屬於**全雙工**裝置。 對於 Switch 而言,裡面的每一個埠口(Port)都各自獨立,Port 會紀錄所連接的電腦的 MAC Address。因此 Switch 接收到一個封包時,會找到對應 MAC Address 的 Port 來傳遞,其他的 Port 並不會收到該封包。 也因為封包會由 Switch 進行交換,因此可以同時進行多個終端裝置的傳送,因此屬於全雙工運作。 #### Router 路由器 基本上 Router 的功能與 Switch 十分類似,但 Switch 採認的是 **MAC Address**,亦即是在同一個區域網路底下運作;而 Router 則採認 **IP Address**,進行跨網段[^網段]的連接。 [^網段]: 同一網段中的裝置共享同一個實體層的連接。詳細的定義可以參考[維基百科](https://zh.wikipedia.org/wiki/%E7%BD%91%E6%AE%B5)。 ## 網路層 承第一章的概述,網路層的作用主要就是「尋址」(分配 IP Address)與「路由」(把資料從來源地址傳輸到目的地址)。主要採用的通訊協定就是大家熟知的 IP(Internet Protocol)。 ### IPv4 IPv4 Address 由 32bit 的二進位數字組成。為了方便使用,通常大家會將每 8bit 轉為 0~255 的十進位整數,總共分為四段,使 IP Address 的格式寫為:`XXX.XXX.XXX.XXX`。例如,Colde Garage 的伺服器的 IP 位址是 `140.114.28.225`。 :::warning **[Q]** 以下兩個 IPv4 是否合法? (A) 123.456.789.0 (B)192.168.0.0 **[A]** (A)不合法 (B)合法 ::: IP 地址有數個特殊或保留的位址區段,以下舉幾個比較常見或重要的進行說明: #### 環回地址:`127.0.0.1` 此一地址代表本地主機的意思,也可以用 `localhost`代替。 #### 專用網路 專用網路區段的 IP 在網際網路上不會被直接配發。這些區段的 IP 會作為私有網路的 IP 位址,在獨立的區域網路內進行配發。 專用網路位址共分為三段: * `10.0.0.0 ~ 10.255.255.255`:Class A * 1 * `172.16.0.0 ~ 172.31.255.255`:Class B * 16 * `192.168.0.0 ~ 192.168.255.255`:Class C * 256 :::info **[補充資料]** 上面的 Class 是指分類網路的 Class。詳細的定義可以參考[維基百科的說明頁面](https://zh.wikipedia.org/wiki/%E5%88%86%E7%B1%BB%E7%BD%91%E7%BB%9C),這裡不做太多的討論。 ::: #### Subnet 子網路 :::info **[補充資料]** 這個小節單純是補充資料,可以看看就好,不會列入此次 System Block 的 Check List。如果看完想要深入了解,可以再自己 Google 或是問問 Mentor。 ::: 網路為了管理方便,會將一整塊網路區分為許多的子網路(Subnet)。簡單來說,區分的方式會將一個 IP 位址分段。同一個子網路中,IP 位址相同的區段,可以作為這個子網路的代表的位址稱為「網路位址」(這個子網路的位址),剩下的區段稱為「主機位址」。 用來標記「網路位址」長度有兩種方式。第一種是使用**子網路遮罩**,第二種是使用 **CIDR 表示法**標記。 **1. 子網路遮罩法** 要標示 Subnet 的第一種方式是設定宿網很常見的「子網路遮罩」。一個遮罩會是一個 32bit 的數字,例如: `255.255.255.0 = 11111111.11111111.11111111.00000000` 這個遮罩會與終端裝置擁有的 IP 進行 AND 運算,得出的結果就是網路位址。例如如果擁有的 IP 是 `140.114.28.225`: ``` 140.114. 28.225 = 10001100.01110010.00011100.11100001 255.255.255. 0 = 11111111.11111111.11111111.00000000 ----------------------------------------------------- AND 140.114. 28. 0 = 10001100.01110010.00011100.00000000 ``` 因此得出網路位址是 `140.114.28.0` **2. CIDR** CIDR 表示法意義上與子網路遮罩類似,只是我們直接將網路位址的長度直接附加在網址後面。承上例,CIDR 表示法就會是 ``` 140.114.28.225/24 ``` 最後的 24 表示前 24 bit 是網路位址,因此可以得出網路位址就是前 24 bit 直接抄,最後剩下的補 0,即為 `140.114.28.0`。 而每個子網路可以發配的 IP 數量,等於 $2^{n} - 2$ 個(n 為主機位址的 bit 數)。之所以要減 2 是因為 0 要作為網路位址使用,255 則要作為廣播位址使用。 因此上面的例子中,`140.114.28.225/24`所在的子網路可以發配 $2^{(32-24)}-2 = 256-2 = 254$ 個 IP。 想要練習 IP Subnet Mask 計算的話,可以使用 [IP Calculator](http://jodies.de/ipcalc) 這個網站試試看。 ### IPv6 因為 IP 地址具有唯一性,因此可以算出 IPv4 最多可以配發 $2^{32} = 4294967296$ 個位址。然而根據 UN 的報告指出,2015 年底全球上網總人數已經多達 32 億。若平均每人擁有 2 個上網裝置,IP 地址將會耗盡,因此 ICANN [^ICANN] 重新研發推出 IPv6。 [^ICANN]: ICANN 全名為「網際網路名稱與數字位址分配機構」,目的是接管包括管理域名和IP位址的分配等與網際網路相關的任務。 IPv6 為一個 128 bit 的二進位數。每 16bit 為一組,共 8 組,每組使用 16 進位表示,可能值為 0000~FFFF,以冒號分隔。例如:`2001:0DB8:02DE:0:0:0:0:0E13`。 其中,前導數字的 0 可以省略。可以用雙冒號「::」表示一組 0 或多組連續的 0,但只能出現一次。 另外,IPv4 也可以轉換為 IPv6。轉譯地址為 `::ffff:x.x.x.x`。例如:`135.75.43.52 = 0x874B2B34`,IPv6 位址就會是 `::ffff:874B:2B34`。 而在 IPv6 中的環回地址則是 `::1`,相當於 IPv4 的 `127.0.0.1`。 :::warning **[Q]** 以下兩個 IPv6 是否合法? (A)::FFGF:1234 (B)1F2B:55CC:2B34::10DC **[A]** (A)不合法 (B)合法 ::: ## 傳輸層 傳輸層主要規範連線資料劉的可靠性、流量控制、壅塞處理等協定。最主要的協定有兩個:TCP 與 UDP。 * TCP 全稱為 Transmission Control Protocol,當資料遺失時,TCP 會重新傳送。 * UDP 全稱是 User Datagram Protocol,當資料一旦傳出,就不理會資料是否成功傳送了。 :::info **[補充資料]** TCP 協定為了保證不發生封包在傳輸過程中丟失的問題,設計了兩個機制: 1. 每個封包在傳送端都會獲得一個流水序號,接收端可以透過該序號來確保資料順序正確。 2. 當接收端收到一個封包後,會根據收到的流水序號回傳確認訊息。原本的傳送端會依照回傳的確認訊息來確定該封包成功傳送。如果過了合理的往返時間後還沒有收到確認訊息,就認定該封包遺失,並將重新傳送。 而 UDP 的部份,只會針對傳送的內容進行校驗檢查,確定一個封包的內容是跟傳送當初一模一樣的,而不像 TCP 會檢查順序正確性或是丟包問題。 ::: ## 應用層:DNS 與 DHCP ### DHCP DHCP 英文全稱為 Dynamic Host Configuration Protocol,是一個用於區域網路中或是網路服務供應商(ISP)自動分配 IP 位址給終端用戶的一個協定。 例如要使用 Windows 設定 IP 地址時,選擇「自動取得 IP 位址」的選項,就是透過 DHCP 協定向網路服務供應的單位請求並配發 IP。 ![](https://rbgeek.files.wordpress.com/2012/04/116.jpg) 針對 DHCP 的協議內容這裡不多做討論,如果想要深入了解可以參考[維基百科頁面](https://zh.wikipedia.org/wiki/%E5%8A%A8%E6%80%81%E4%B8%BB%E6%9C%BA%E8%AE%BE%E7%BD%AE%E5%8D%8F%E8%AE%AE)。 ### DNS DNS 英文全稱為 Domain Name System,中文稱為網域名稱系統。DNS 是一套用來對應 IP 與域名(Domain Name,通俗來說就是網址)的一套資料庫。 資料庫中,主要的紀錄有兩種:A 與 CNAME。 1. A 紀錄:主機紀錄,用來解析網域名稱最重要的紀錄。一筆 A 紀錄會有一個域名與一筆 IP 地址。若是對應到 IPv6 位址,則稱為 AAAA 紀錄。 2. CNAME 紀錄:別名紀錄,用來幫 A 紀錄增加別名之用。 :::info **[補充資料]** DNS 查詢有兩種方式:遞迴和疊代。用戶端設定使用的 DNS 伺服器一般都是遞迴伺服器,全權處理用戶端的 DNS 查詢請求,直到返回最終結果。DNS 伺服器之間一般則採用疊代查詢。 以在清大校內查詢 `nthuee.org` 為範例,DNS 查詢的過程簡述如下: 1. 用戶端送出 `query nthuee.org` 的查詢指令至清大的 DNS 伺服器。若清大伺服器存有該筆紀錄的暫存,則將結果傳回並結束。 2. 清大伺服器向全世界的根伺服器傳送查詢指令,根伺服器回傳 .org 域名伺服器的位址。 3. 清大伺服器向 .org 域名伺服器傳送查詢指令,即可得到 nthuee.org 的 IP 位址。 4. 清大伺服器將該筆 A 紀錄存入自己的暫存,並將結果傳回用戶端。 ![](http://jinglingshu.b0.upaiyun.com/uploads/2014/05/dns.jpg) 根伺服器意思是全世界共通幾台用來當作 DNS 查詢起點的 DNS 伺服器。這些伺服器中存放著所有頂級域名(cTLDs)的 DNS 查詢伺服器位址。 全世界共有 504 台根伺服器,所有根伺服器存放的資料都是一樣的。例如這是一段根伺服器中的域名紀錄: ``` tw. 172800 IN NS a.dns.tw. a.dns.tw. 172800 IN A 203.73.24.25 a.dns.tw. 172800 IN AAAA 2001:45b1:0:5:0:0:0:25 ``` 這段紀錄意思是若要查詢任何結尾是 `.tw` 的網址時,應該向 `203.73.24.25` 這台伺服器進行查詢。可以看到,第二行就是一個 A 紀錄,第三行就是一個 AAAA 紀錄。 有興趣看看根伺服器的紀錄內容的話,[點選這個連結](https://www.internic.net/domain/root.zone)可以找到。 ::: ## 應用層:HTTP 與 HTTPS ### HTTP HTTP 英文全稱 Hyper Text Transfer Protocol,中文稱為超文本傳輸協定。是應用層中用來傳輸 HTML 頁面的一個協議。 瀏覽網頁時,用戶端會發出一個 HTTP 請求(HTTP Request)到伺服器,伺服器上儲存著用戶端想要存取的資源,接收到請求之後就會被動的將用戶想要瀏覽的資源或是錯誤訊息傳回。 ![](https://www.esds.co.in/kb/wp-content/uploads/2011/06/A-Little-About-HTTP-Protocol.jpg) 下圖是使用 Chrome 開啟 HTTP Request 原始資料之後的部份節錄。可以看到裡面有幾項資料: * Request URL:指用戶端要瀏覽的網頁。 * Request Method:請求方法(見下面說明) * Status Code:回應狀態碼(見下面說明) ![](https://i.imgur.com/MFZ88dB.png) :::warning **[Q]** Request URL 會透過什麼東西轉換成 IP 位址? **[A]** DNS 伺服器。 ::: #### HTTP Request Method HTTP 協定中,針對客戶端發出的請求定義了幾種不同的類型,稱之為 HTTP Request Method(請求方法)。常見的有以下幾種: * GET:向伺服器發出「顯示」請求,用於讀取資料。 * POST:向伺服器送出資料,請求伺服器進行處理。例如提交表單或上傳檔案等。 * PUT:向伺服器送出資料,請求更新。 * DELETE:請求伺服器刪除指定資料。 承上我們開啟 Wikipedia 的頁面時,因為請求維基百科的伺服器提供資料給我們顯示,因此 Method 屬於 GET。 #### HTTP Status Code 當 HTTP Request 送出後,伺服器會將回應傳回給客戶端,同時附帶一組 HTTP 狀態碼(Status Code),以表示回應的狀態模式。常見的 HTTP Status Code 有以下幾種: * 1XX:訊息 * 2XX:成功 * 200:OK,表示請求成功 * 3XX:重新導向 * 304:Not Modified,表示用戶端還有上次瀏覽的副本 * 4XX:用戶端錯誤 * 400:Bad Request,表示請求無效 * 401:Unauthorized,表示伺服器要求經過身份認證才能執行 * 403:Forbidden,表示伺服器拒絕該請求 * 404:Not Found,表示伺服器沒有找到對應的要求 * 5XX:伺服器錯誤 * 500:Internal Server Error,表示伺服器遇到不明錯誤 * 501:Not Implemented,表示請求的功能伺服器尚未支援 * 503:Service Unavailable,表示伺服器正在維護或過載 想要了解更多,可以參閱[維基百科的說明頁面](https://zh.wikipedia.org/wiki/HTTP状态码)。 ### HTTPS HTTPS 是 HTTP 後面多加了一個 Secure。大致上跟 HTTP 相同,不過傳送的封包會經過 SSL/TLS 加密,因此增加了安全性。 網路安全相關的觀念下學期會上,這裡先不多做討論。想要深入了解可以自己 Google。 ## 網路服務相關補充 :::info **[補充資料]** 這個章節單純是補充資料,可以看看就好,不會列入此次 System Block 的 Check List。如果看完想要深入了解,可以再自己 Google 或是問問 Mentor。 ::: ### API API 英文全稱為 Application Programming Interface,中文翻譯為應用程式界面。因為軟體程式越來越大,彼此之間的合作溝通也漸漸複雜化。因此個別的程式軟體會增加 API 的設計,使外部的程式透過界面與程式本身溝通,降低軟體之間互相依賴的耦合程度,並提高可維護性與擴充性。 可想像 API 是政府機關的服務窗口,民眾要對政府單位進行諮詢不會直接找上政務官,而是向各個行政機關的窗口進行詢問,這就是 API 的概念。 諸如 Windows, Linux, macOS 等作業系統均有作業系統 API,一般的程式語言也會有 API。在網頁中,用來給其他網頁進行溝通的 API 則稱為 Web API。 ### REST REST 是一個程式設計的概念,英文稱為 Representational State Transfer。符合 REST 概念設計的 Web API 稱為 RESTful API。 REST 概念有以下幾個重要的架構風格: 1. Client-Server:通訊只能由用戶端單方發起。 2. Stateless:通訊的對談狀態只能由用戶端處理,伺服器不處理對談階段狀態的資訊。 3. Cache:通訊內容設有快取。 4. Uniform Interface:元件之間有統一的界面進行通訊,基本上是 API 的體現。 5. Layered System:系統架構分成若干層級,元件不得跨層級進行存取。 以上這些特性將會有以下幾種優點: * 因為設有快取,所以回應速度會加快 * 因為通訊對談對於伺服器來說是無狀態性的,因此可以使用不同的伺服器來分散處理一系列的請求,提高擴充性 * REST 因為只是一個概念,本體可以使用 HTTP 協定實現,因此不需要額外的技術,在軟體演進中有良好的長期相容性 因此之後我們在設計給其他系統使用的 API 時,會盡可能去符合 REST 的設計模式。 ## Database 資料庫 資料庫簡單來說就是電子化的檔案櫃,使用者可以對資料進行新增、讀取、更新或刪除等操作。這四種動作合併起來簡稱為 CRUD。但除了單純儲存資料的功能之外,資料庫與一般檔案不同的地方在於:資料庫是以一定的方式儲存的,同時能提供多個使用者共同存取使用,並盡可能減少資料的冗餘(同一筆資料出現在兩個以上的地方)。 資料庫分為兩大類:關聯式資料庫(SQL)與非關聯式資料庫(NoSQL)。關聯式資料庫利用表格來儲存資料,並將一張表格視為一個集合。當操作資料時,是在資料庫中尋找指定的子集合進行操作運算,執行結果還是表格,而該表格同樣視為一張集合,可以繼續進行操作。 關聯式資料庫中,資料庫以資料表組成,每張資料表則由多筆紀錄組成。每筆紀錄則有多個欄位,每個欄位存放一筆資料。 非關聯式資料庫中,資料庫會用許多不同的方式儲存,簡圖如下所示。因為種類繁多,這裡不多做說明。 ![](https://blog.couchbase.com/wp-content/uploads/2017/04/nosql-vs-sql-overview-1.png) 這個學期我們會以關聯式資料庫為主,下學期遇到非關聯式資料庫的時候我們會再進行深入的探討。 ###### tags: `Colde Garage`