# TCP/IP 講義 [TOC] ## 1. 引言 ### 1.1 什麼是通訊? > 我在搜尋的時候按下 Enter 之後發生了什麼? > 我在網路上下訂單之後發生了什麼?  1. 我今天想買一個大型的桌子,所以我到傢具行(台北)的官網下訂單,要送到府(台南)並且要有專人安裝 2. 傢俱行收到我的訂單,把訂單交給員工 ,但因為我要買的桌子太大了所以員工就把桌子拆分成很多個箱子裝,並附上安裝說明書,打包完再聯繫台北快遞公司來取箱子 3. 快遞員到家具行後看到每個箱子上都有收件人姓名、地址、電話,就把這些箱子拿給台北物流公司 4. 台北物流公司的物流士把這些包裹送到台南物流公司 5. 包裹在轉運站之間傳送 6. 台南物流公司的物流士拿到這些包裹之後送回台南的物流中心 7. 台南物流中心請台南快遞公司快遞員來領箱子,再送到我家 8. 一名專業的安裝師傅到我們家看著說明書把桌子安裝好 9. 我拿到一個安裝好的桌子了 | 步驟 | 內容 | 對應到的 TCP/IP 模型 | |:----:|:----------------:|:--------------------:| | 1 | 官網下單 | 應用層 | | 2 | 分割包裹 | 傳輸層 | | 3 | 設定地址 | 網路層 | | 4 | 包裹配送 | 資料連結層 | | 5 | 在轉運站間傳送 | 實體層 | | 6 | 包裹配送 | 資料連結層 | | 7 | 送貨到府 | 網路層 | | 8 | 到府組裝 | 傳輸層 | | 9 | 拿到桌子 | 應用層 | ### 1.2 什麼是通訊協定? * 網路設備的溝通語言 > 講中文、講英文... * 網路設備彼此溝通時的約定,都算是通訊協定 > 我們從現在開始都講英文喔 * 必須採用相同的通訊協定,網路設備才能夠互相交換資訊 > OK! * 如果將這些約定具體化轉成文字便能成為規格,再透過具有公信力的國際性機構的認定,就變成了國際標準 ### 1.3 什麼是通訊模型? * 一個適當的模型能將複雜的事情具體化、簡單化 * 層對層分工合作,且獨立運作 > 如果我住在不同地區,訂單配送的流程仍然不變 > 換了快遞公司、物流公司對我沒有影響 * 常見模型:OSI 模型、DoD 模型 ## 2. 通訊模型 ### 2.1 OSI 模型 * **O**pen **S**ystem **I**nterconnection Model * ISO(國際標準化組織) 於 1984 年發表了 OSI 模型,將整個網路系統分成七層,每層負責特定的工作 * 越高層越偏向軟體,越低層越偏向硬體 * OSI 模型沒有具體的協定,而是抽象的參考模型 :arrow_right: 不是一個標準,而是一個在制定標準時所使用的概念性框架  > Q: 分越多層就越好嗎? > A: 雖然 OSI 模型劃分了七層,但在實際應用上,很少有產品可以符合 OSI 模型的定義,有些層數在實務上是可以合併的 ### 2.2 DoD 模型 * TCP/IP 協定套件的開發早於 DoD 模型和 OSI 模型的理論提出 <!--* DoD 模型比 OSI 模型的出現更早--> #### 2.2.1 DoD 模型的歷史與組織 * DoD 模型是在美國國防部的領導下為 ARPANET (互聯網的前身)項目開發的 * DoD 模型成為了 TCP/IP 模型的前身,並在 TCP/IP 協定組合的基礎上進行發展 #### 2.2.2 TCP/IP 模型 * 由於網際網路最早起源於軍事用途,因此這個模型便以美國國防部(Department of Defense)來命名,但有些直接稱為 TCP/IP 模型 * 除了代表 TCP/IP 這兩種通訊協定外,更包含了與 TCP/IP 相關的數十種通訊協定,例如: SMTP、DNS、ICMP、POP、FTP、Telnet...等 * 雖然兩種模型各有自己的架構,但基本上能互相對照 ### 2.3 OSI 模型 vs. TCP/IP 模型  | 模型 | 主要組織 | 層數 | 用途 | 使用領域 | | ----------------- | ------ | -------------------------- | -------- | ---------------------- | | OSI 模型 | 國際標準化組織 (ISO) | 七層 | 理論性的分層模型 | 做 network device 的人比較常用的規範 | | DoD 模型(TCP/IP 模型) | 美國國防部(Department of Defense) | 四層 | 現實世界中的網絡通訊的參考模型 | 做 OS 的人比較常用的規範 | > 一個 row 講完, 再挑出重點陳述 ## 3. Link Layer  :::info * 處理電腦之間的物理連接和數據傳輸,使用幀(frame)當作傳輸的單位 > Link: 連接相鄰的節點 * 使用 Ethernet 和 Wi-Fi,以有線和無線方式連接相鄰節點 * 只能在同一區域網路(LAN)內傳輸 ::: ### 3.1 Ethernet / Wifi 介紹 | 網路 | 標準 | 功能 | 傳輸媒介 | 碰撞處理 | |:-----------------:|:------:|:--------------------------:|:----------------------:|:--------:| | Ethernet 乙太網路 | 802.3 | 區域網路連線上的通訊協定 | 雙絞線 | CSMA/CD | | Wi-Fi 無線網路 | 802.11 | 無線區域網路的電腦通訊標準 | 5GHz / 2.4GHz 無線電波 | CSMA/CA | * Ethernet * 有線連接,安裝需要佈線 * 安全性相對較高,因為訊號受到物理線路限制,不容易被竊聽 * 穩定性高,使用雙絞線 > 兩條電纜線纏繞在一起的結構,有助於減少干擾 > 絕緣層,防止電磁干擾 * Wifi * 無線連接,有靈活性,適用於移動設備 * 訊號易受干擾、衰減,影響連接品質 > 受到其他無線設備和物理障礙的影響,造成訊號溢出 * 半雙工通訊,分時多工,所有節點一起收送 :::info ### 單工 / 半雙工 / 全雙工 #### 單工(Simplex): * 在同一時間訊號單向流動,只能由一方發送,另一方只能接收 * 例子:傳統的廣播電台,電台發送節目內容,收聽者只能接收而不能回傳 #### 半雙工(Half Duplex): * 允許雙方進行雙向通訊,但不能同時進行發送和接收 * 例子:對講機通訊,每當一方按下通話按鈕時,另一方就只能聽取而不能發言 #### 全雙工(Full Duplex): * 在同一時間允許雙方都可以同時發送和接收數據 * 例子:傳統的電話通訊,雙方可以同時說話和聽取對方的聲音 ::: | | Ethernet | Wifi | | -------- | -------- | -------------------------------------------- | | 穩定性 | 高 :+1: | 低 | | 干擾風險 | 低 :+1: | 高| | 竊聽風險 | 低 :+1: | 高 | | 移動性 | 低 | 高:+1: | | 部署 | 需要佈線 | 不需要佈線:+1: | | 適用情境 | 靜態設備或需要高穩定性的應用 | 移動設備或不便佈線的場景 | ### 3.2 Ethernet 乙太網路:實體層 > 常見設備:網路線、集線器 (Hub) * 10 Base5 乙太網路 :arrow_right: 10 Base2 乙太網路 :arrow_right: 10 BaseT 乙太網路 * 10 Base5 乙太網路、10 Base2 乙太網路 的缺點 ==匯流排拓樸==: * 任網路的任何一處斷線,都會導致整個網路停擺,而且追查斷線點較為困難 * 若有電腦要移動位置,佈線路徑可能要大幅修正 * 管理維護不方便,促使了 10 BaseT 乙太網路的誕生 * 10 BaseT 乙太網路: * 採用無遮蔽雙絞線(Unshielded twisted-pair cables, UTP)作為傳輸介質,所有的電腦都透過集線器(Hub)互相連接 * 電腦到集線器的最大長度為 100 公尺 * ==星狀拓樸==優點: * 每部電腦都獨立連接到集線器,如果電腦或線路發生問題,只會影響本身的這一段線路,不會影響到其他電腦的運作 * 從集線器的燈號即可判斷是哪段線路故障,比較容易維護 * 移動電腦時只需要局部佈線路徑,整段佈線路徑不必更動 * 現今常用乙太網路規格:10BASE-T、1000BASE-LX、10GBASE-T #### Connecting Device  * 集線器(Hub) * 半雙工 (half-duplex):同一時間只能發送(接收)資料 * 以廣播(Broadcast)方式進行傳輸,看接收端要接收封包還是丟掉 > 不安全,還會有碰撞的問題 * 當 HUB 連接非常多電腦時,網路就會變慢 * 交換器(Switch) * 全雙工:在同一時間允許雙方都可以同時發送和接收數據 * 不會都是廣播,Switch 會記錄封包中的 MAC 位址,必要時才會廣播 > 判斷決定要送往哪一台電腦,所以會有一些延遲 :::info #### IEEE 對各種類型的乙太網路的命名方法 * 以 10 Base5 為例 * 10: 頻寬為10 Mbps * B: 表示訊號類型為「基頻 Baseband」 * 5: 表示介質的最大傳輸距離為 500公尺,後來這部分改成以介質的代碼表示,例如:T(雙絞線)、F(光纖) ::: :::info ## 區域網路內拓墣 > 常用:星狀拓樸、樹狀拓樸 #### 匯流排拓樸  * 特色: 各工作站連接在同一傳輸媒介上,形成匯流排結構 * 優點: 簡單佈線,適合小型網路 * 缺點: 傳輸媒介斷線導致整個網路停擺,故障定位困難,不適用於大型網路 #### 環狀拓樸  * 特色: 以環狀連結,任一節點均可成為網路控制中心,資料透過相鄰節點轉送 * 優點: 權限平等,適用於高負載網路 * 缺點: 任一節點故障可能使整個網路停擺,佈線困難 #### 星狀拓樸 :+1:  * 特色: 由中央主機(Switches)控制,與周圍的工作站點對點連接 * 優點: 資料傳輸品質高、資料安全強、網路維護較容易 * 缺點: 中央主機故障會使整個網路癱瘓,佈線成本較高 #### 樹狀拓樸 :+1:  * 特色: 多部主機作為中心控制,以點對點方式連接,形成樹狀結構 * 優點: 具星狀優點,故障影響較小,且擴充性較好 * 缺點: 部署和維護相對複雜,如果主節點失效,會影響整個分支 >[ref1](https://www.tsnien.idv.tw/Network_WebBook/chap7/7-1%20%e5%8d%80%e5%9f%9f%e7%b6%b2%e8%b7%af%e6%a8%a1%e5%9e%8b.html) >[ref2](https://www.atcnet.com.hk/newsContent_233.html) ::: ### 3.3 Ethernet 乙太網路:資料連結層 > 常見例子:網路卡地址 (MAC Address)、Switch * 由於乙太網路上的所有電腦,都共用同一個傳輸介質(網路線),所以就會面臨「誰先用、誰後用」的問題,因此訂定了一套傳輸介質使用管理辦法,MAC Method(Media Access Control Method) * 乙太網路採用的 MAC Method 稱為 CSMA/CD #### 3.3.1 CSMA/CD (Carrier Sense Multiple Access / Collision Detection) 工作原理 > 要提到 802.1 的 CSMA/CA * 碰撞偵測處理 * 適用在多個裝置共享同一傳輸媒介(例如共用的網路電纜)的情況下,ex.乙太網路 * CSMA/CD 並未指派每台電腦的傳輸優先順序,而是開放給大家公平競爭。在電腦數量不多時,是一種高效率的方法,但 ==隨著電腦數量遞增,發生碰撞的機率也越來越高,效率也隨之下降== * 假設會議室每個座位都有一支麥克風:microphone:,大家都比需透過麥克風發出聲音,但為了避免同時發言,所以一次只有一支麥克風能發出聲音,大家必須公平競爭 *  1. 要傳送資料前,先偵測媒介上是否有訊號傳輸,如果有訊號,就等到訊號結束;如果沒有就開始傳輸訊號 2. 同時也要監聽是不是有其他訊號同時傳送而導致訊號碰撞 3. 如果設備在傳送過程中偵測到其他設備的訊號(發生碰撞),會立即停止傳送,並發送一個特定的「擾亂訊號(Jamming signal)」,來通知其他設備知道碰撞已經發生,並停止傳送。 4. 在碰撞發生後,所有參與碰撞的設備都會停止傳送並等待一段隨機的時間,然後重新嘗試傳送 5. 而每碰撞一次,代表資料沒有成功傳送,就會裝置內的計數器就會加一,直到嘗試失敗 16 次後就不再傳送,代表此次傳送失敗。 > [ref](https://vocus.cc/article/5edd062efd8978000114b5e2) #### 3.3.2 Ethernet Frame  * 乙太網路的原始規格是由 DIX 聯盟主導,以 EV2 版本 * 後來則使用 IEEE 的 802.3標準 :::info ### Ethernet Frame 格式  > [ref](https://www.geeksforgeeks.org/ethernet-frame-format/) * Preamble 同步 * 8 bytes * 前七個欄位是為了讓接收端的時脈能與封包的時脈同步 * 第八個欄位為 SFD 欄位,代表 Preamble 與封包內容的分界 * 獨立 SFD 欄位 * Start Frame Delimiter 封包起始分界 * Destination Address 目的位址 * 6 bytes * 前 3 bytes 為廠商代號,後 3 bytes 為流水號 * 廣播位址: 全部 bits 都是 1,代表所有的接收端都必須接收此封包 * > Q: 但乙太網路不都是以廣播方式傳送封包嗎? 那每個封包都算是廣播封包? * > A: 每個封包都是以「廣播方式」送出,但取決於「哪個接收端」要處理這個封包 * Source Address * 6 bytes * 前 3 bytes 為廠商代號,後 3 bytes 為流水號 * 記錄此封包的來源 MAC 位址 * Length * Payload 的長度(46-1500) * Payload 的前三個 byte 定義了上層協定的方法 * Data(Payload) 資料 * 46-1500 bytes * CRC 封包檢查結果 * 4 bytes * 網卡會自動產生 CRC 值,接收端收到封包時也會產生一個 CRC 值,藉由比對兩個 CRC 值,判斷封包是否完整無毀損 --- ### 最大傳輸單元 (MTU,Maximum Transmission Unit) * 乙太網路 (Ethernet) 的 MTU 為 1500 個位元組 * Ethernet Frame 中,最大的長度為 1518 位元組 (octet),最短為 64 位元組 (octet),不足的話就用填充位元 (padding) 填滿至 64 為止 * 不同的 資料鏈結層,有不同的 MTU  ### 巨型封包 (Jumbograms) * 超過 Ethernet Frame 的 MTU,最高可到 9000 位元組 (octet) * 高效傳輸,但要整個通訊路徑都支援 Jumbo Frame ### 最大區段大小 (MSS,TCP Maximum Segment Size) * TCP封包在網路上,每個封包可以傳輸的最大的 data 大小 * TCP協議在建立連接的時候要協商雙方的 MSS 值 * `MSS = MTU - 20 octet (TCP 固定表頭) - 20 octet (IP 固定表頭)` >[ref](https://notfalse.net/23/mtu) >[ref](https://www.tp1rc.edu.tw/tpnet2021/2021meeting1_6.pdf) ::: #### 3.3.4 MAC Address  * 乙太網路採用「廣播」方式傳送封包,封包送出後,網路上的所有電腦都會收到封包,但為了知道該不該接受封包,以及封包要傳送的對象,所以每張 Ethernet 網路卡都邊有一個獨一無二的位址,稱為 Media Access Control Address * MAC 層的每個封包都會記載「從哪裡送出」(來源 MAC Address),「到哪裡去」(目的 MAC Address),比對過後就可以得知自己是否為傳送的對象,看是要丟棄此封包,還是要繼續處理此封包 > 舉例: XXX 電話!如果不關我的事就假裝沒聽到 * 在每一張 Ethernet 網卡出廠之前就已經將 MAC Address 寫在網路卡的 ROM 裡面,一張網卡就有一個 MAC Address * 可以虛擬、重設定 > 也有人將MAC Address 稱為硬體位址、Physical address、Layer 2 Address * 所有想生產網卡的廠商需要向 IEEE 註冊,取得合法的廠商代號,稱為 OUI,目的是為了確保全球唯一性,避免 MAC Address 重複。 * 一張網卡,一個 MAC Address,用來標示同一個區域網路內唯一標識設備 * 同一區域網路內的 MAC Address 不能重複,但在不同區域網路內可以重複(因為不同IP) > 在不同地方,同一個號碼是獨立的。 > > 例如:在一棟大型公寓(區域網路)裡,每個住戶的門牌號碼(MAC Address)是唯一的,但在其他棟公寓,可能會有相同的門牌號碼 > Q: 但 MAC Address 有可能重複(ex. 複製虛擬機),重複的話會發生什麼事? > A: 導致封包遺失 * MAC 位址是以 6 Bytes(48 bits) 表示 * 第 1 bit 為單播位址 Unicast (0) / 群播位址 Multicast (1) * 第 2 bit 為廣域位址(0) / 區域位址(1) * 前 3~24 bits 為廠商代號 * 後 24 bits 為產品流水號 * 例外:MAC 地址中所有 bit 都為 1(FF:FF:FF:FF:FF:FF),代表是廣播位址 > 所有公寓的住戶都在一起慶祝特殊活動,使用喇叭廣播音樂,這樣每個人都能聽到   >[ref](https://hackmd.io/@ncnu-opensource/book/https%3A%2F%2Fhackmd.io%2F%40qtNgFtaqR4Or_CLAuotXjw%2FrkY9fXB0o#Network) :::info ### 第 1 bit (I/G bit) #### 單播位址 (Unicast,第 1 位為 0) * 一對一的傳遞模式(傳送給一個指定的人) > 今天看到一個好笑的影片,我傳給住在我隔壁的鄰居 #### 群播位址 (Multicast,第 1 位為 1) * 一對多的傳遞模式(傳送給指定的人) * 封包可以經過路由器傳到其他區域網路 > 把好笑的影片放在 ig,可以分享到全球的不同地方,有追蹤我的人都可以看得到 #### 廣播位址 (Broadcast,第 1 位為 1 且其餘位也都為 1) * 一對多的傳遞模式 * 在區域網路內所有的人都會收到 * 主機都會檢查這個信息是否是發給它的,如果不是,它會忽略它 > 到公寓大廳廣播,讓大家都知道這個好笑的影片,但只有那些有興趣的人會真正去看 ### 第 2 bit(U/L bit) #### 廣域位址 (Wide Area Address,第 2 位為 0) * 在全域具有唯一性 > 像是國際電話號碼,在世界各地都具有唯一性 #### 區域位址 (Local Address,第 2 位為 1) * 這種 MAC Address 只在特定的區域網路中是唯一的,而在其他地方可能有相同的 > 像是管理學院 237 教室,只在「管理學院」這個區域內有意義 [ref](http://hanteye01.blog.fc2.com/blog-entry-1.html) ::: :::success ### 練習 * AC:C5:12:45:67:89 * C9:00:5E:10:00:0A * FF:FF:FF:FF:FF:FF 以上 MAC Address何為 multicast, unicast, broadcast? ::: ### 3.4 802.11 無線區域網路: 資料連結層 > Review: 在有線網路中,因為只有與網路線相連的電腦才能存取網路,因此雙方可以透過網路線上電壓的變化進行碰撞偵測 * 因為無線電波在空氣中行進時,訊號的強度會隨著距離增加而衰減,再加上發送訊號時所用的強度和接收訊號時所感知的強度差異大,因此在發送強訊號的同時,不易偵測其他較弱的訊號 * 無線網路有隱藏節點的問題,沒辦法察覺對方傳送的訊號 * 無線網路不易偵測碰撞,採用的 MAC Method 稱為 CSMA/CA #### 3.4.1 CSMA/CA (Carrier Sense Multiple Access / Collision Avoidance) 工作原理  > [ref](https://hackmd.io/@ncnu-opensource/book/https%3A%2F%2Fhackmd.io%2F%40qtNgFtaqR4Or_CLAuotXjw%2FrkY9fXB0o#Network) 1. 傳送端在傳送資料之前,要先偵測他所用的頻道是否有別人正在使用 2. 先經過一段時間後(DIFS),再加上一個亂數時間 3. 若這段時間有人使用,就重新開始下一次的偵測。若無人使用,傳送端送出 RTS(Request to send) 封包給接收端,通知對方要傳送資料 4. 接收端收到 RTS 封包後,會在時間內回應 CTS(Clear to send) 封包給接收端 5. 傳送端收到 CTS 封包後,就會開始傳送資料封包。若傳送端沒有收到 CTS 封包,就假設發生了碰撞,表示傳送失敗,會回到第一步重新嘗試 6. 接收端收到資料後會回應 ACK (Acknowledge)封包進行確認。若傳送端沒有收到 ACK 封包,表示傳送失敗,會回到第一步重新嘗試 > Q: 在進行廣播或多點傳送時(Multicast),每個收到廣播封包的接收端都要回應 CTS/ACK 封包嗎? > > A: 不需使用 RTS/CTS/ACK 封包,假設傳送端沒有收到某幾個接收端的 ACK,不可能再全部廣播一次,所以在進行廣播或 Multicast 時,不會用到 RTS/CTS/ACK 封包 --- ## 4. Internet Layer  :::info Q: 為什麼需要 IP? A: 達到全球範圍的通訊,MAC Address 只在區域網路中中具有唯一性,無法實現跨網路的通訊 * 相同網域:直接透過 CSMA/CD 使用 MAC 地址直接傳遞資料 * 不同網域:需要透過 Router 連接不同網域,代為傳送 * 協議數據單元(Protocol Data Unit,PDU)為 Packet 或 Datagram ::: ### 4.1 Internet Protocol (IP) <!--* 對上可傳送 Transport 層各種協定的資訊,例如:TCP、UDP,對下可以將 IP 封包放到 Data Link 層--> * IP 是網際網路通用的傳輸協定,IP 負責將 IP 封包從來源裝置傳送到目的裝置(例如:你的電腦->學校的www伺服器),要透過 IP 位址、IP 路由(IP Routing) * IP Routing * 除了要確保網路上每個裝置都有一個==公開且經正規管道分配的 IP==,還必須要有轉送的機制,才能將封包透過一個一個的網路,送到目的地 * 目的是要為封包選擇傳送的路徑 #### Router * 連結多個網路,轉送 ip 封包 * 使用路由表(Routing Table)判斷要將封包送往哪一個網路 *  * 若 PC01 要傳資料給 PC11 時: * 看封包目標 IP 位置 * 查看自己主機的 Net_ID 是否與封包的相同(屬於同區網),若相同可以直接傳給目的主機 * 若不同,查詢 default gateway( 此為 Server A ) 並傳給它 * 不理會封包流向,default gateway 會執行上述動作繼續往目的地傳送 >[ref](https://hackmd.io/@ncnu-opensource/book/https%3A%2F%2Fhackmd.io%2F%40Alanjy-Huang%2FryARVogrj) :::success ### routing table * `route -n` : 以主機 IP 顯示 *  ::: ### 4.2 IP address * Internet Protocol 中的 IP Address (簡稱 IP) * IP 必須負責將封包由來源裝置傳送到目的裝置為了能夠標識出裝置的正確位置,所有使用 IP 的裝置,至少都必須有一個獨一無二的 IP 位址可以辨識,才能傳送 IP 封包 > 郵差要送信必須要有地址(標示出建築物的位置) * IP 分配 > IP 由 IANA 全球樹狀分配,MAC 由廠商分配 * IANA(Internet Assigned Numbers Authority) * TWNIC(Taiwan Network Information Center) *  >[ref](https://www.iplocation.net/what-is-iana) #### 4.2.1 IP address 表示法 * 目前主要有兩個 IP 版本,IPv4 與 IPv6。IPv4 使用 32 位元表示,總共約有 42 億個 IP 位址;而 IPv6 則使用 128 位元,擁有龐大的 2^128(約 3.4 x 10^38)個 IP 位址,解決了 IPv4 位址不足的問題。 | | IPv4 | IPv6 | | -------- | ------- | -------- | | 位址數量 | 2^32 個(42 億左右) | 2^128 個 | | 表示方法 | 192.168.64.23(使用`.`)| 2001:0db8:85a3:0000:0000:8a2e:0370:7334(使用`:`)| > 以下以 IPv4 舉例講解 * IP 位址本質是一個 32 bits 的二進位數值,但為了方便記憶,以 8 bits 為單位,將 IP 位址分成四段,再轉成十進位,用`.`隔開 > 路由器必須要從 IP 位址來判斷封包要如何傳送到哪個網路 * IP 位址是由兩個部分組成,合起來為 32 bits * 網路位址(Network ID) * 位於 IP 的前端部分,用來辨識所屬的網路 * 企業或組織申請 IP 位址時,所得到的會是一個獨一無二、可以被辨識的 Network ID * 同一網路上的所有裝置,都會有相同的 Network ID,因此 Router 可以判斷要將封包送至哪個網路 * 主機位址(Host ID) * 位於 IP 的後端部分,用來辨識網路上的各個裝置 ### 4.3 IP address 的等級(Class) > `FIXME`: 在網路沒人用的時候的規劃, 講講歷史, 網路環境變化 * 為了方便管理與識別,IP 可分為五種等級(Class),但一般會使用到的是 Class A、B、C 三種等級,以 Network ID 長度區分,分別使用在大、中、小型網路 * Network ID 和 Host ID 的長度分配 * 大型的網路應該使用較短的 Network ID ,才有比較多的 Host ID,小型的網路應該使用較長的 Network ID * **同一個網域**:在同一個物理網段內,主機的 IP 具有相同的 NetWork ID ,並且具有獨特的 Host ID * Class A * 政府機關、國家級研究單位 * Class B * 大型企業、電信業者、學術單位 * Class C * 一般企業、家庭 * Class D * Multicast * Class E * 保留用途  * Network ID | | Network ID 長度 | 前導位元 | Network ID 個數 | Network ID 範圍 | 預設NetMask | | ------- | --------------- | -------- | --------------- | ------------------------- | --- | | Class A | 8 Bits | 0 開頭 | 2^7 = 128 | 0.xx.xx.xx ~ 127.xx.xx.xx | 255.0.0.0 | | Class B | 16 Bits | 10 開頭 | 2^14 = 16384 | 128.xx.xx.xx ~ 191.xx.xx.xx | 255.255.0.0 | | Class C | 24 Bits | 110 開頭 | 2^21 = 2097152 | 192.xx.xx.xx ~ 223.xx.xx.xx | 255.255.255.0 | * Host ID | | Host ID 長度 | Host ID 個數 | | ------- | ------------ | --------------- | | Class A | 24 Bits | 2^24 = 16777216 | | Class B | 16 Bits | 2^16 = 65536 | | Class C | 8 Bits | 2^8 = 256 | :::success ### :pencil2: 計算 Net ID and Host ID * Net ID: `IP` AND `Net mask` * Host ID: `IP` AND `~ Net mask` #### Q: 有一 IP Address: 3.4.5.6 為 Class A ,請問 Net ID、Host ID 為何? * Net ID: `3.0.0.0` | IP Address | 3.4.5.6 | | ---------- | ----------------------------------- | | Binary | `00000011.00000100.00000101.00000110` | | Netmask | `11111111.00000000.00000000.00000000` | | AND | ---------------------------------------- | | Net ID | `00000011.00000000.00000000.00000000` | * Host ID: `0.4.5.6` | IP Address | 3.4.5.6 | | ---------- | ----------------------------------- | | Binary | `00000011.00000100.00000101.00000110` | | ~Netmask | `00000000.11111111.11111111.11111111` | | AND | ---------------------------------------- | | Host ID | `00000000.00000100.00000101.00000110` | #### :pencil: 練習:有一 IP Address: 192.168.38.26 為 Class C ,請問 Net ID、Host ID 為何? #### :pencil: 練習:有一 IP Address: 130.48.93.73 為 Class B ,請問 Net ID、Host ID 為何? ::: * Public ip / Private ip * 在 ClassA、B、C 中都保留了一些 Private IP,不能直接連上 Internet 的 IP * Class A: 10.0.0.0 ~ 10.255.255.255 * Class B: 172.16.0.0 ~ 172.31.255.255 * Class C:192.168.0.0 - 192.168.255.255 > 保留 IP 地址: 169.254.0.0 到 169.254.255.255 > 沒有辦法取得有效的 ip 時,自動分配 ### 4.4 Subnet 子網路 * 解決彈性不足的問題,可以自行在內部網路切割 Subnet > 假設企業被分配到 Class B 的 ip 位址,六萬多部電腦連接在同一個網路中會導致效率低落,若只連接十幾部電腦,會造成浪費 * 將分配到的網路切割成規模比較小的子網路,再分配給多個實體網路 #### 4.4.1 切割的原理 * 讓每個子網路擁有一個獨一無二的 Subnet ID ,使 router 能夠辨識切割出來的子網路 * 使用 Host ID 的前面幾個 bits 當作 SubNet id * 用 Network ID + SubNet ID 作為新的 Network ID * n 個 bit 可以切割出 2**n 個 subnet * Network ID: 此段網路第一個 IP,代表此區段網路 * Broadcast ID: 此段網路最後一個 IP,廣播用途 #### 4.4.2 NetMask(子網路遮罩) * 路由器不確定 Network id、host id 各自的位元數 * NetMask 長度為 32 bits,與 ip 位址的長度相同 * 由一串連續的`1`,加上一段連續的 `0` > 例如:11111111 11111111 11111111 00000000 > 通常寫作: 255.255.255.0 * 與 ip 位置組合可寫作:168.95.192.1/21 > 21代表 subnet Mask 中`1`的數目 :::success ### 求一網段之至多分配主機數 * 以 Class C 為例 255.255.255.0(11111111.11111111.111111111.00000000) * Host ID 共 8 Bits * 2 ** 8 - 3 = 253 * 共 253 台,扣 3 為廣播位址、網段位址及 Gateway #### Q: 有一 IP Address: 192.168.64.23/20 ,請問他的 Net ID、Broadcast IP 以及此網段可分配之主機數? * Net ID: `192.168.64.0` | IP Address | 192.168.64.23 | | ---------- | ----------------------------------- | | Binary | `11000000.10101000.01000000.00010111` | | Netmask | `11111111.11111111.11110000.00000000` | | AND | ---------------------------------------- | | Net ID | `11000000.10101000.010000000.00000000` | * Broadcast ID: `192.168.79.255` | IP Address | 192.168.64.23 | | ---------- | ----------------------------------- | | Binary | `11000000.10101000.01000000.00010111` | | Netmask | `00000000.00000000.00001111.11111111` | | OR | ---------------------------------------- | | Broadcast ID |`11000000.10101000.010001111.11111111` | * 子網路內 ip 數量:2**(32-20) = 4096 * 可分配之主機數: 2**(32-20)-3 = 4093 * range: 192.168.64.1 - 192.168.79.254 ### 練習 Q: 有一 IP Address: 19.21.68.100/21 ,請問他的 Network ID、Broadcast IP、子網路內 ip 數量 、此網段可分配之主機數、Range? Q: 有一 IP Address: 94.21.138.72/18 ,請問他的 Network ID、Broadcast IP、子網路內 ip 數量 、此網段可分配之主機數、Range? :::spoiler ANS * Network ID: `19.21.64.0` * Broadcast ID: `19.21.71.255` * 子網路內 ip 數量:2**(21-20) = 2048 * 可分配之主機數: 2**(21-20)-3 = 2045 * range: `19.21.64.1 - 19.21.71.254` ::: ::: ### 4.5 ICMP (lnternet Control Message Protocol) > 是 IP 的輔助協議,屬於 TCP/IP 的 2.5 層 * IP 傳輸 * **保障** 封包的定址和路由功能 * **不保障** 封包在傳送過程中發生的問題,例如:中間的網路可能因故障或其他原因而導致封包的損壞或丟失。 > 寫地址但不保證郵差把信送到 * ICMP 是 IP 的輔助協定,確保設備是否在線上、報告錯誤以及進行網路診斷 * 在 IP routing 的過程中發生錯誤,例如:router 找不到適合的路徑、無法成功送出封包 * > IP 負責郵寄信件,ICMP 則是郵差的通知服務 * 常見 ICMP 工具 * Ping * Traceroute :::success ### Ping * 發現網路連線異常,可以發送 Echo Request 給特定主機或 router,由近而遠逐步鎖定問題 * `ping <參數> <網址 或 ip>` * `ping 127.0.0.1`:測試 tcp/ip 協定 ### Traceroute * 找出至目的 IP 所經過的所有 router * `traceroute <參數> <網址 或 ip>` ::: ### 4.6 ARP / RARP **ARP(Address Resolution Protocol)** * 只能在區域網路內解析網路裝置的 MAC Address * 知道裝置的 IP 時,查詢對應的 MAC Address * A 電腦要傳送封包給 C 電腦,A 電腦知道 C 電腦的 IP 位址,但不知道 MAC 位址 * A 電腦發送 ARP request 給區網上的所有裝置(廣播封包) * 用這個 IP 的裝置會回應 ARP reply (C 電腦會產生回應) * A 把 C 電腦的 MAC 位址回傳 * Cache: A 將該筆 IP/MAC 寫入 ARP Table 中,保持 20 分鐘 > 使用 ip 舉例 | 電腦 | MAC | IP | |:----:|:-----------------:|:----------:| | PC A | AA:AA:AA:AA:AA:AA | 10.10.10.1 | | PC B | ? | 10.10.10.2 |  > [ref](https://ithelp.ithome.com.tw/articles/10246385) :::success #### 查看 ARP Table * `arp -n`: 以 IP Address 查看 Table * `arp -d <ip 位址>`: 刪除特定紀錄 * `arp -s <ip 位址> <Mac 位址>`:新增一筆**靜態**紀錄 > 過了兩分鐘不會被刪除,但重新開機後就會被清除 ::: :::info ### ARP spoofing * 偽造惡意的 ARP reply,覆蓋原本的 ARP Table * 讓後續的 IP 封包傳送到攻擊者電腦上 * 如果攻擊者也對通訊的另一端發送惡意 ARP reply,即能監聽雙向流量(被動式封包嗅探,passive sniffing) * 篡改後再轉送封包(中間人攻擊,man-in-the-middle attack) | 電腦 | MAC | IP | |:--------:|:-----------------:|:----------:| | PC A | AA:AA:AA:AA:AA:AA | 10.10.10.1 | | PC B | BB:BB:BB:BB:BB:BB | 10.10.10.2 | | Attacker | CC:CC:CC:CC:CC:CC | 10.10.10.3 | *  > [ref](https://ithelp.ithome.com.tw/articles/10246385) ::: **RARP (Reverse Address Resolution Protocol)** > 大部分現代作業系統已經不再支援 RARP,被 DHCP 取代 * 從 MAC address 反查出 IP * 主機每次啟動時需要使用 RARP 向網路上的伺服器(如 DHCP Server)請求分配一個 IP 位址 ## 5. Transport Layer   >[ref](https://hackmd.io/@ncnu-opensource/book/https%3A%2F%2Fhackmd.io%2F%40Alanjy-Huang%2FryARVogrj#Application-layer) :::info * 傳輸層多了 port 的概念,讓同一台電腦擁有多個對外的出口,區分不同服務(UDP) * TCP 更提供可靠的傳輸機制,保證封包準確送達、順序正確 * 協議數據單元(Protocol Data Unit,PDU)為 Segment ::: :::info ### Port > Review: SSH * 如果只有 ip 位址,若有不同的軟體要同時進行傳輸,所有的資料就會從同一個出口一起通過,會產生碰撞 * 連接埠:讓同一台電腦擁有多個對外的出口,讓網路傳輸有多工的能力 * 每個 port 對應到不同的服務 #### port 相關指令 * `cat /etc/ services`: 查看 port 的使用情況 *  * `grep -w 80 /etc/services`: 查詢指定 port *  #### 常見服務對應的 port | Port number | 服務 | | ----------- | ---- | | 21 | FTP(File Transfer Protocol,檔案傳輸協定) | | 22 | SSH(Secure Shell Protocol,加密式連線) | | 23 | Telnet (遠端連線伺服器軟體)| | 25 | SMTP (簡單郵件傳輸協議)| | 53 | DNS (Domain Name Server,功能變數名稱伺服器) | | 80 | HTTP (HyperText Transport Protocol,超文本傳輸協定),用在 www | | 443 | HTTPS (超文字安全傳輸通訊協定是 HTTP 的安全版本)| ::: ### 5.1 UDP(User Datagram Protocol) * 僅提供傳輸層基本功能,負責處理封包要送到哪個 port * Connectionless: 不可靠的傳輸方式 * 接收端在收到資料後不會回傳確認訊息給發送端 * 少了確認機制、表頭資料較少:arrow_right: 傳輸有效率 * 適合應用的場景 * 追求即時性且能容忍一些封包丟失的情況(盡力傳遞) * 串流服務、視訊、音訊 * UDP 表頭:  > [ref](https://www.tsnien.idv.tw/Internet_WebBook/chap7/7-5%20UDP%20%E9%80%9A%E8%A8%8A%E5%8D%94%E5%AE%9A.html) * Source Port(16 bits):來源 port 號 * Destination Port(16 bits):目的 port 號 * Length(16 bits):紀錄 UDP 封包的總長度 * Check Sum(16 bits):用於執行錯誤檢查(不一定要執行) ### 5.2 TCP(Transmission Control Protocol) > 網路層協定使用使用不可靠的傳送機制,怎麼確保封包順利送達? > 使用可靠的傳輸方式(ex. TCP) * 可靠的傳輸方式 :arrow_right: ==保障資料完整性== * 連線導向(Connection-Oriented):傳輸資料前先建立連線,協調參數(用於資料確認與重送、流量控制) > 利用三項交握建立連線 * 資料確認與重送:確認目的端使否收到已送出的資料 * 流量控制:視情況調整資料傳輸的狀況,盡量減少資料的流失 > 利用滑動視窗(Sliding Window) * TCP 表頭 > FIXME: 重要的在圖上做標記或粗體  >[ref](https://www.tsnien.idv.tw/Internet_WebBook/chap7/7-5%20UDP%20%E9%80%9A%E8%A8%8A%E5%8D%94%E5%AE%9A.html) * SourcePort(來源埠號): * 長度為 16 bits,用來記錄來源主機的 port * DestinationPort(目的埠號): * 長度為 16 bits,用來紀錄目的主機的 port * SequenceNumber(序列號): * 長度為 32 bits,用來記錄每個封包的序號。當 TCP 資料太大時(大於 IP 封包的容許程度)就必須進行分段,利用 Sequence Number 讓接收端組合資料 * AcknowledgmentNumber(確認號): * 長度為 32 bits,接收端確定之前傳遞的封包已被正確收下 * Code (Control Flag, 控制標誌碼): * 長度 6 bits,用來控制訊息的傳遞。此欄位共 6 bits 分別代表 6 種不同功能的控制碼,只要該位元被設定為 1,表示此封包內有包括該訊息。 * `URG(Urgent,緊急)`:若為1表示該封包為緊急資料,接收端應該要緊急處理,並使 Urgent Point 欄位被啟用。 * `ACK(Acknowledge,確認回應)`:若為1表示該封包為回應封包,具回應確認功能,確認 Acknowledge Number 欄位中所指定的順序號碼。 * `PSH(Push,推送)`:若為1表示要求對方立即傳送緩衝區內的其他對應封包,無須等待緩衝區滿了才送。 * `RST(Reset,重設)`:若為1表示連線被立即結束(強迫性),無需等待終止確認手續,且發送端已斷線。 * `SYN(Synchronous,同步)`:若為1表示發送端通知對方要求建立連線。 * `FIN(Finish,完成)`:若為1表示傳送結束,通知對方資料傳輸完畢,是否同意斷線。發送者還在連線中等待對方回應。 * Window(視窗大小): * 代表「接受視窗」(receive window) 的大小,用來控制封包流量,告訴對方目前本身還有多少緩衝器(Receive Buffer)可以接收封包。 * Checksum(檢查碼): * 確定所收封包是否在傳輸過程中出現錯誤 * UrgentPoint(緊急資料指標): * 指出緊急資料在 TCP 資料的哪裡 * ex. Urgent Pointer = 3 :arrow_right: TCP 資料的 0~3 個 bytes 是緊急資料 * 三項交握建立連線  > [ref](https://www.explainthis.io/zh-hant/swe/tcp-udp) 1. A 送出 `SYN` 封包給 B  2. B 回覆一個 `SYN-ACK` 封包給 A * ACK num 是前一個 Sequence num +1  3. A 發送 `ACK` 封包給 B * ACK num 是前一個 Sequence num +1  * 資料確認與重送 * A 傳送 packet1 給 B * B 回應 ACK 封包 給 A * 如果 A 在時間內有沒有收到 B 的 ACK 封包, A 就會重新傳送給 B (主動傳) > A:誒我跟你說 > (B 沒聽到) > A:(第二次)誒我跟你說 > B:嘿你要說什麼(聽到了) ### 5.3 TCP vs. UDP | | TCP | UDP | | -------------- | ---- | ---- | | 可靠性 | 可靠 :heavy_check_mark: | 不可靠 :x: | | 速度 | 慢 :x: | 快 :heavy_check_mark: | | 傳輸速度 | 封包按順序傳輸 | 封包以串流方式傳輸 | | 錯誤檢查與修正 | 有 :heavy_check_mark: | 無 :x: | | 壅塞控制 | 有 :heavy_check_mark: | 無 :x: | | 確認 | 有 :heavy_check_mark: | 只有檢查碼 :x: | | 適用服務 | 要求可靠傳輸的服務,例如電子郵件、網頁瀏覽、檔案傳輸 | 即時服務,例如串流媒體、網路電話、網路遊戲 | ## 6. Application Layer   >[ref](https://hackmd.io/@ncnu-opensource/book/https%3A%2F%2Fhackmd.io%2F%40Alanjy-Huang%2FryARVogrj#Application-layer) :::info * 應用程式間溝通的協定 * 協議數據單元(Protocol Data Unit,PDU)為 Data ::: ### 6.1 HTTP(HyperText Transfer Protocol,超文本傳輸協定) * 全球資訊網(www)的資料通訊的基礎 * 用於網頁前後端溝通,瀏覽器向伺服器發送請求,伺服器回傳相應的資料 *  :::info ### HTTP Request Method * Get: * 較 Post 不安全 * 把要傳送的訊息都寫在 head,body 內不傳資料 * 傳遞的參數會在 URL 上顯示 * ex. `https://moodle.ncnu.edu.tw/course/view.php?id=57351` * 流程: * 瀏覽器發送Get請求,只產生一個TCP封包 * 伺服器回應200,表示請求成功,同時返回資料 * Post: * 較 Get 安全 * 將參數放至 body 中再發送 request * 不會在 URL 看到參數,適合用於隱密性較高的資料,EX: 登入的帳號、密碼等 * 流程: * 瀏覽器首先發送headers,可能收到伺服器的100 Continue回應 * 瀏覽器再發送data,產生兩個TCP封包 * 伺服器回應200,表示請求成功,同時返回資料 * Put:新增一項資料,如果存在就覆蓋過去(維持一筆資料) * Patch:附加新的資料在已經存在的資料後面(資料必須已存在) * Delete:刪除資料 * Head:只會取的 HTTP header 的資料 * Option:可以了解 server 提供哪些溝通方法 > [ref](https://note.artchiu.org/2017/09/30/%E5%B8%B8%E8%A6%8B%E7%9A%84http-method%E7%9A%84%E4%B8%8D%E5%90%8C%E6%80%A7%E8%B3%AA%E5%88%86%E6%9E%90%EF%BC%9Agetpost%E5%92%8C%E5%85%B6%E4%BB%964%E7%A8%AEmethod%E7%9A%84%E5%B7%AE%E5%88%A5/) ::: ### 6.2 DNS(Domain Name System,網域名稱系統) * 將 Domain Name 轉換成 IP address * Domain Name: moodle.ncnu.edu.tw * IP address: 163.22.5.234 * > 暨大(Domain Name) :arrow_right: google map 查詢地址(DNS Server):arrow_right: 南投縣埔里鎮大學路 1 號(IP address) * `nslookup <Domain Name>` *  :::info #### 樹狀階層式(hierarchy)架構   >[ref1](http://dns-learning.twnic.net.tw/dns/02ArchDNS.html) >[ref2](https://linux.vbird.org/linux_server/centos4/0350dns-centos4.php) #### 如何查找 DNS * FQDN(Fully Qualified Domain Main,完整網域名稱) = Host Name + Domain Name * ex. www.google.com 、www.youtube.com * `/etc/nsswitch.conf` * 定義了解析的依序優先順序,==決定==先要使用 /etc/hosts 還是 /etc/resolv.conf 的設定 * files(本機檔案):ex. /etc/hosts、/etc/passwd * `/etc/hosts` * ==hostname 對應到 IP== 的檔案 * >`/etc/hosts` 加上 `1.2.3.4 google.com`後,輸入 `google.com` 會連到 IP 位置為`1.2.3.4`的電腦上 * `/etc/resolv.conf` * 解析時使用的 DNS Server 的 IP * > `nameserver 8.8.8.8` DNS 查詢發送到 Google 的 DNS 伺服器   >[ref](https://www.tsnien.idv.tw/Manager_WebBook/chap5/5-3%20%E7%B6%B2%E5%9F%9F%E5%90%8D%E7%A8%B1%E7%B3%BB%E7%B5%B1%E5%88%86%E6%9E%90.html) ::: ### 6.3 FTP(File Transfer Protocol,檔案傳輸協定) * 用於檔案傳輸,將共享檔案存放在 FTP Server,讓一般使用者可以透過網路來下載或上傳。它的重點是在異質性電腦之間、以及遠距離的檔案共享使用 * Client-Server 模型 * FTP Server: 提供檔案的 Server 端。 * FTP Client: 透過 FTP 連接到 Server,執行上傳或下載操作的 Client 裝置 * 20 port: 傳遞資料 * 用於實際的檔案資料傳輸(下載或上傳檔案) * 21 port: 傳輸流程控制 * 進行身份驗證,輸入帳號、密碼等指令 :::info ### Active Mode 主動模式 * PORT 模式 * 由 Server ==主動==向 Client 發起傳送資料請求 *  * Client 透過 Command Port(1026) 向 Server 的 Command Port (通常是 21)發送連線請求,同時告知 Server 自己的 Data Port 是 1027(N+1) * Server 回一個 ACK 到 Client 的 Command Port(1026) * Server 從自己的 Data Port (20)向 Client 在 Step 1指定的 Data Port (1027)建立連線 * 當連線建立成功後, Client 會向 Server 的Data Port (20)發送一個確認(ACK) ::: :::warning ### 發生的問題 * FTP 的主動模式可能受到防火牆的阻擋,因為它需要在外部網路和內部網路之間建立一個由 Client 指定的隨機 port (1026)的連線。 ::: :::info ### Passive Mode 被動模式 * PASV 模式 * Server ==被動==等 Client 來連線(Client 主動連線) * 讓 Server 開啟一個 port,Client 主動連線至Server >在 active mode 下,Client 會告訴 Server :「我用port N 當作 data port」 >在 passive mode 下,Client 會告訴 Server :「我是使用passive mode哦」  * Client 主動跟 Server 連線後,告訴 Server 使用 passive mode * Server 回 ACK 並告訴 Client 自己開了一個 data port(2024) * Client 主動跟剛才 Server 指定的 data port 連線 * 最後 Server 回一個 ACK 給 Client 的 data port ::: ### 6.4 DHCP(Dynamic Host Configuration Protocol,動態主機組態協定) * DHCP 使裝置能夠在連接到網路時自動獲取相關配置(IP Address、子網路遮罩、DNS server address等),而不需要手動設定 > DHCP Server(餐廳服務生): 主動詢問裝置需要多少個 IP 地址,然後提供相應的網路配置 > 要連線的裝置(客人): 進入網路的設備,ex.電腦、手機等 > 客人到餐廳之後,餐廳服務生會根據人數安排座位,並提供餐具、菜單... * 運作步驟 * **DHCP Discover**:Client 發送一個 DHCP Discover 封包(廣播訊息),通知網路上的 DHCP Server:「我需要一個 IP 地址」 * **DHCP Offer**:DHCP Server 收到 Discover 封包後,回應一個 DHCP Offer 封包,其中包含一個可用的 IP 地址、子網路遮罩、網關、DNS 伺服器等 * **DHCP Request**:Client 收到 DHCP Offer 後,發送一個 DHCP Request 封包,確認要使用的 IP 地址 * **DHCP Ack**:同意 Client 可以使用這個 IP Address  >[ref](https://gist.github.com/ChenBlue/d3a6abdda1317f2d535290bf26ba9c96) :::success ## Demo ### 以 netplan 設定網路靜態 IP * 更改 `/etc/netplan`裡面的 `00-installer-config.yaml` * 注意縮排  * `sudo netplan try` * 如果設定正確,需要在 120 秒之內按 enter 確認 * `sudo netplan apply` * 完成  >[ref](https://blog.tigernaxo.com/posts/linux/ubuntu204-static-ip/) ::: --- ## 7. HTTP 協定版本 ### 7.1 HTTP 1.0 * 簡單的文本協定 * ==無==連線持久性(keep-alive) * 單一請求-回應模型,每個請求都需要建立新的連線,完成後即斷開 * 浪費頻寬、時間延遲 * 單路徑傳輸,一次只能處理一個請求 * 狀態碼 * HTTP 1.0 主要使用標頭中的 If-Modified-Since 和 Expires 來做為緩存的判斷標準 ### 7.2 HTTP 1.1 * 連線持久性(keep-alive) * 可以使用同一個 TCP 連接來重複多個 HTTP 請求,預設 keep-alive,避免重新建立連線 * 管道化 * 允許在同一連接上並行發送多個請求,但回應還是按照請求的順序返回 * 狀態碼 100 (Continue) * 引入了狀態碼 100,改進了對應 client 端發送正文的機制,避免不必要的頻寬浪費 * 更多請求方法 * 新增了 PUT、PATCH、DELETE、CONNECT、TRACE 和 OPTIONS 等請求方法 * Host 標頭 * 支援多虛擬主機,使用Host標頭字段指定伺服器的域名 * >現在在一台伺服器上可以存在多個虛擬主機,並且會共享同一個 IP。所以加上 host 字段之後,就可以將請求發往同一台伺服器上的不同網站。 * >後面會有 demo * 快取機制 * 引入了更多的緩存策略,例如Etag、If-Unmodified-Since、If-Match、If-None-Match,透過這些可以更優化緩存的實現。 ### 7.3 HTTP2/SPDY **SP**ee**DY** * 提高網頁載入速度,減少延遲  >[ref](https://www.linkedin.com/pulse/what-difference-between-http-12-20-versions-why-should-anand-bhagwat) > * 二進制協定 * HTTP/2 將資料轉換為二進制格式,而不再使用像 HTTP/1 那樣的文本格式,使得資料傳輸更加高效 * Request multiplexing * 允許在同一個連接上並行交換多個請求和回應,避免了在 HTTP/1 中的「頭部阻塞 (head-of-line blocking, HOL) 」的問題 * > 如果有任一個請求要操作很久或封包流失,那就會阻塞整個 pipeline 的工作 * Header 壓縮 * 使用 HPACK 壓縮標頭,減少了傳輸的大小 * 優先請求順序 * 每個請求都有唯一的編號,並可以指定優先級,伺服器可以根據優先級進行回應,提高效能 * Server Push * server 可以在 client 端需要之前主動推送資源,加快網頁載入速度 ### 7.4 HTTP3/QUIC :::info ### QUIC * **Q**uick **U**DP **I**nternet **C**onnection * **連線建立 (Connection Establishment)** * 基於 UDP,而非 TCP,有更低的連接建立時間,降低了傳輸的延遲 * 提供 0-RTT(零往返時間)的概念,可以快速的建立連接 *  * **多路複用 (Multiplexing)** > TCP Head of Line Blocking (HOL Blocking) 問題: 在 TCP 連線中,一個封包的遺失會導致整個連線的傳輸被卡住,直到封包被重新傳送。 * 允許在同一連線上進行多個 Stream 的資料傳輸。當某一個 Stream 中的封包遺失時,僅影響該 Stream 的傳輸,其他 Stream 不受影響,有效避免 HOL Blocking 的問題 * **封包遺失恢復 (Loss Recovery)** * 在 TCP 中,封包遺失恢復策略使用序列號標記封包,接收端回傳帶有相應序列號的ACK * TCP 重傳歧異問題:難以區分是接收初始封包還是重傳封包的 ACK,可能影響RTT和壅塞控制演算法 * QUIC 解決方案:使用唯一的封包編號(unique packet number),每次傳送都有新的編號,解決了 ACK 的歧異問題,提高了 RTT 準確度,降低封包重傳反應時間 * **流量控制 (Flow Control)** * 流量控制限制 client 端傳輸資料量,接收端只保留相對應大小的接收 buffer * QUIC 使用連線層和 Stream 層流量控制,避免單一 Stream 佔用過多buffer,防止 HOL Blocking * **Connection Migration** * QUIC 使用 64 位獨立 Connection ID 來識別連線,由 client 端在建立連線時隨機產生。 * Connection ID 允許在 client 端 IP 變動時,仍能平順處理Connection Migration 問題。 * client 端可以使用舊的 Connection ID 在新 IP 位址上傳送封包,接收端透過 Connection ID 識別連線,確保封包正確接收。 :::  > [ref](https://medium.com/@chester.yw.chu/http-3-%E5%82%B3%E8%BC%B8%E5%8D%94%E8%AD%B0-quic-%E7%B0%A1%E4%BB%8B-5f8806d6c8cd) * 建立在 QUIC 上 * 內建 TLS 1.3 ## Demo :::success ### 使用 Telnet 上網 > Review: Name-based Virtual Host > 在同一 server 上架有多個不同網站,不同網站間依據名稱判定 * 沒有指定 host :arrow_right: 預設頁面 ```= telnet ammon.bluet.org 80 GET / HTTP/1.0 ``` ```= <head><title>BlueT.org Studio</title></head> ... ```  * 更改 host ```= telnet ammon.bluet.org 80 GET / HTTP/1.0 Host: bluet.org ``` ```= Moved Permanently Location: https://Studio.BlueT.org ```  * 更改 host ```= telnet ammon.bluet.org 80 GET / HTTP/1.0 Host: studio.bluet.org ``` ```= 很多東西 ```  ### Wireshark 封包 > 開源的網路數據封包分析軟體 * 三項交握、四次揮手 *  ### TCP Dump > 封包監控工具,類似wireshark  >[ref](https://www.cnblogs.com/dwtfukgv/p/15355589.html) * 選項(Options): * `-i`:指定網卡 * `-w <file>`:將封包輸出到指定文件 * `-r <file>`:從指定文件讀取封包內容 * `-e`:顯示每個封包的詳細資訊 * `-tttt`:以可讀的日期和時間格式打印每個封包的時間戳 * 協議過濾(Protocol Filters): * `tcp`:只顯示 TCP 封包 * `udp`:只顯示 UDP 封包 * `icmp`:只顯示 ICMP 封包 * 方向過濾(Direction Filters): * `src host <source>`:指定來源主機的 ip * `dst host <destination>`:指定目的主機的 ip * `src net <source>`:指定來源網路的封包 * `dst net <destination>`:指定目的網路的封包 * 類型過濾(Type Filters): * `ether`:顯示與以太網有關的封包 * `ip`:只顯示 IP 封包 * `sudo tcpdump -i any -n -vvv -A -w output.pcap 'tcp'`  ::: > `FIXME`: 缺少 HTTP DEMO 用 termianl telnet 上網 > `FIXME`: host 給不一樣會有不一樣的東西 > `FIXME`: show wireshark > `FIXME`: 在瀏覽器 enter 之後會發生什麼是 => nsSwitch DNS...blabla (好多東西) 看什麼檔案 順序 > `FIXME`: 缺少 FTP > `FIXME`: contract
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up