# 網路基礎 TCP/IP [TOC] ## 引言 ### 什麼是通訊? 我在搜尋的時候按下 Enter 之後發生了什麼?我在網路上下訂單之後發生了什麼? ![通訊流程圖](https://hackmd.io/_uploads/H1tt75tfp.png) 1. 我今天想買一個大型的桌子,所以我到傢具行(台北)的官網下訂單,要送到府(台南)並且要有專人安裝。 2. 傢俱行收到我的訂單,把訂單交給員工,但因為我要買的桌子太大了所以員工就把桌子拆分成很多個箱子裝,並附上安裝說明書,打包完再聯繫台北快遞公司來取箱子。 3. 快遞員到家具行後看到每個箱子上都有收件人姓名、地址、電話,就把這些箱子拿給台北物流公司。 4. 台北物流公司的物流士把這些包裹送到台南物流公司。 5. 包裹在轉運站之間傳送。 6. 台南物流公司的物流士拿到這些包裹之後送回台南的物流中心。 7. 台南物流中心請台南快遞公司快遞員來領箱子,再送到我家。 8. 一名專業的安裝師傅到我們家看著說明書把桌子安裝好。 9. 我拿到一個安裝好的桌子了。 | 步驟 | 內容 | 對應到的 TCP/IP 模型 | |:----:|:----------------:|:--------------------:| | 1 | 官網下單 | 應用層 | | 2 | 分割包裹 | 傳輸層 | | 3 | 設定地址 | 網路層 | | 4 | 包裹配送 | 資料連結層 | | 5 | 在轉運站間傳送 | 實體層 | | 6 | 包裹配送 | 資料連結層 | | 7 | 送貨到府 | 網路層 | | 8 | 到府組裝 | 傳輸層 | | 9 | 拿到桌子 | 應用層 | ### 什麼是通訊協定? * 網路設備的溝通語言,例如講中文或講英文。 * 網路設備彼此溝通時的約定。 * 必須採用相同的通訊協定,網路設備才能夠互相交換資訊。 * 將這些約定具體化轉成文字便能成為規格,再透過具有公信力的國際性機構的認定,就變成了國際標準。 * 人類具有智慧、理解力,即使脫離原則,還是可以與對方溝通,但電腦沒有這樣的理解力,電腦之間的通訊,無論是實體層還是應用程式層面,都需要明確規範並遵守這個約定。 ### 什麼是通訊模型? * 一個適當的模型能將複雜的事情具體化、簡單化。 * 層對層分工合作,且獨立運作。例如,訂單配送流程不變,換快遞公司對我沒有影響。 * 常見模型:OSI 模型、DoD 模型。 ## OSI 模型 ### OSI 模型簡介 * OSI (Open System Interconnection) 模型由 ISO(國際標準化組織)於 1984 年發表。 * 它將整個網路系統分成七層,每層負責特定的工作。 * 越高層越偏向軟體,越低層越偏向硬體。 * OSI 模型沒有具體的協定,而是抽象的參考模型,不是一個標準,而是一個在制定標準時所使用的概念性框架。 * 雖然 OSI 模型劃分了七層,但在實際應用上,很少有產品可以符合 OSI 模型的定義,有些層數在實務上是可以合併的。 ### OSI 七層架構 | 層 | 設備種類 | 負責功能 | 常見協定 | 範例 (HackMD) | |---|---|---|---|---| | 7. 應用層 (Application Layer) | WAF (Web application firewall) | 定義介面給應用程式 | HTTP, FTP, DNS, SMTP, SSH | 電子郵件、檔案傳輸、遠端連線 | | 6. 表現層 (Presentation Layer) | WAF | 負責資料的加密和解密,確保不同格式之間的轉換和壓縮 | SSH, Telnet, JPEG, GIF | HTTPS 使用的 TLS/SSL 加密 | | 5. 會議層 (Session Layer) | WAF (與傳統 firewall 不同) | 決定通訊會話的建立、連接時間和切斷 | NFS會話控制、SIP會話發起協定 | 建立、維護和終止加密的 HTTPS 會話 (如 TLS 會話) | | 4. 傳輸層 (Transport Layer) | firewall | 提供值得信賴的資料傳輸,可以進行流量控制、錯誤檢測和重傳 | TCP, UDP, RTP, SCTP | HTTPS 使用 TCP 傳輸 | | 3. 網路層 (Network Layer) | router | 確保封包在不同網路間的路由路徑選擇和轉發 | IP, ICMP | HTTPS 傳送資料包從客戶端到伺服器 | | 2. 資料連結層 (Data Link Layer) | switch | 負責網路對硬體的溝通;負責 Message 與 bytes 之間的轉換 | Ethernet (802.3), Wi-Fi (802.11), PPP | MAC address;光纖、Wi-Fi 等介質的物理傳輸 | | 1. 實體層 (Physical Layer) | hub, repeater (擴大訊號的設備) | 負責網路硬體的傳輸方式,包括訊號的生成、電壓控制、訊號傳輸速率等 | - | 以太網路纜線、Wi-Fi、藍牙 | ## TCP/IP 模型 (DoD 模型) ### TCP/IP 模型簡介 * TCP/IP 協定套件的開發早於 DoD 模型和 OSI 模型的理論提出。 * TCP/IP 模型是在美國國防部的領導下為 ARPANET(互聯網的前身)項目開發的。 * 這個模型便以美國國防部(Department of Defense,DoD)命名,也常被直接稱為 TCP/IP 模型。 * 除了代表 TCP/IP 這兩種核心通訊協定外,更包含了與 TCP/IP 相關的數十種通訊協定,例如 SMTP、DNS、ICMP、POP、FTP、Telnet 等。 * TCP/IP 模型明確規範了網路上傳送封包的格式。 ### TCP/IP 四層架構 ![TCP/IP 四層架構圖](https://hackmd.io/_uploads/HyM5QStlJg.png) | 層級 | 資料型態 | 負責事項 | 常見協定 | 傳送依據 | |---|---|---|---|---| | Application (應用層) | message | 定義應用程式如何提供服務。 | HTTP, FTP, DNS, SMTP, SSH | - | | Transport (傳輸層) | segment | 負責傳輸過程的流量控制、錯誤處理、資料重送等工作。 | TCP, UDP, RTP, SCTP | port | | Internet (網路層) | packet | 決定資料如何傳送到目的地。 | IP, ICMP | IP Address | | Link (資料連結層) | frame | 負責網路對硬體的溝通。 | Ethernet, Wi-Fi | MAC Address | ### OSI 模型 vs. TCP/IP 模型 | 模型 | 主要組織 | 層數 | 用途 | 使用領域 | |---|---|---|---|---| | OSI 模型 | 國際標準化組織 (ISO) | 七層 | 理論性的分層模型 | 做 network device 的人比較常用的規範 | | DoD 模型(TCP/IP 模型) | 美國國防部(Department of Defense) | 四層 | 現實世界中的網絡通訊的參考模型 | 做 OS 的人比較常用的規範 | ## Link Layer (連結層/資料連結層) ### 連結層簡介 * 處理電腦之間的物理連接和數據傳輸,使用幀(frame)當作傳輸的單位。 * 連接 Internet 上相鄰的節點 (`link` 連接)。 * 使用 Ethernet 和 Wi-Fi,以有線和無線方式連接相鄰節點。 * 只能在同一區域網路(LAN)內傳輸。 ### Ethernet (乙太網路) vs. Wi-Fi (無線網路) | 網路 | 標準 | 功能 | 傳輸媒介 | 碰撞處理 | |:-----------------:|:------:|:--------------------------:|:----------------------:|:--------:| | Ethernet 乙太網路 | 802.3 | 區域網路連線上的通訊協定 | 雙絞線 | CSMA/CD | | Wi-Fi 無線網路 | 802.11 | 無線區域網路的電腦通訊標準 | 5GHz / 2.4GHz 無線電波 | CSMA/CA | | | Ethernet (有線) | Wi-Fi (無線) | |---|---|---| | 穩定性 | 高 :+1: | 低 | | 干擾風險 | 低 :+1: | 高 | | 竊聽風險 | 低 :+1: | 高 | | 移動性 | 低 | 高 :+1: | | 部署 | 需要佈線 | 不需要佈線 :+1: | | 適用情境 | 靜態設備或需要高穩定性的應用 | 移動設備或不便佈線的場景 | * **單工(Simplex)**:訊號單向流動,只能由一方發送,另一方只能接收。例如:傳統廣播電台。 * **半雙工(Half Duplex)**:允許雙方雙向通訊,但不能同時進行發送和接收。例如:對講機。 * **全雙工(Full Duplex)**:允許雙方同時發送和接收數據。例如:傳統電話。 ### Connecting Device (連線設備) * **集線器 (Hub)** * 半雙工。 * 收到資料就無差別地從每個 port 送出去,以廣播(Broadcast)方式進行傳輸。 * 不安全,在連同一個 hub 的情況下,資料會互通且會有碰撞問題。 * 當 HUB 連接非常多電腦時,網路就會變慢。 * 示意圖:![image](https://hackmd.io/_uploads/H13Ll2-Ngx.png) * **交換器 (Switch)** * 全雙工,允許每一台主機隨時都可以傳送/接收。 * 可以建立 MAC address table,並判斷決定要送往哪一台電腦。 * 每個 port 會紀錄 client 的 Mac address,檢查 Mac address 後會指定一個 port 傳輸,解決資料互通的隱憂。 * 不同種類、規格儲存不同數量的 Mac address。 * 找不到目的地 MAC address 時會廣播。 * 每個 port 都是獨立的 collision domain,因此不會有碰撞問題,相對於 hub switch 比較不用 CSMA/CD. * 示意圖:![image](https://hackmd.io/_uploads/Sk2dl2WVxe.png) ### MAC Address (媒體存取控制位址) * MAC Address 也稱為硬體位址、Physical address、Layer 2 Address、區域網路位址 (LAN Address)、Ethernet Address。 * 每張 Ethernet 網路卡出廠之前就已經將 MAC Address 寫在網路卡的 ROM 裡面。 * 一張網卡,一個 MAC Address。 * 用來標示同一個區域網路內唯一標識設備。 * 同一區域網路內的 MAC Address 不能重複,但在不同區域網路內可以重複(因為不同 IP)。 * 可以虛擬、重設定。 * MAC 地址是以 6 Bytes (48 bits) 表示。 * **第 1 bit (I/G bit)** * **單播位址 (Unicast)**:第 1 位為 0,一對一的傳遞模式。 * **群播位址 (Multicast)**:第 1 位為 1,一對多的傳遞模式,封包可以經過路由器傳到其他區域網路。 * **廣播位址 (Broadcast)**:第 1 位為 1 且其餘位也都為 1 (FF:FF:FF:FF:FF:FF),在區域網路內所有的人都會收到。 * **第 2 bit (U/L bit)** * **廣域位址 (Wide Area Address)**:第 2 位為 0,在全域具有唯一性。 * **區域位址 (Local Address)**:第 2 位為 1,這種 MAC Address 只在特定的區域網路中是唯一的。 * 前 3~24 bits 由 IEEE 決定如何分配給每一家製造商,且不重複 (廠商代號 OUI)。 * 後 24 bits 由實際生產該網路裝置的廠商自行指定且不重複 (產品流水號)。 * 範例截圖 (ifconfig): ![image](https://hackmd.io/_uploads/Bk9Ax2Z4ex.png) * 練習:判斷 MAC Address 類型 (unicast, multicast, broadcast) * AC:C5:12:45:67:89 * C9:00:5E:10:00:0A * FF:FF:FF:FF:FF:FF ### CSMA/CD (Carrier Sense Multiple Access / Collision Detection) * 用於有線網路 (例如 Ethernet),因為碰撞容易被偵測和處理。 * **被動偵測**碰撞。 * 工作原理: 1. 要傳送資料前,先偵測媒介上是否有訊號傳輸 (Carrier Sense),如果沒有就開始傳輸訊號。 2. 同時監聽是否發生碰撞 (Collision Detection)。 3. 如果偵測到碰撞,立即停止傳送,並發送「擾亂訊號 (Jamming signal)」通知其他設備停止傳送。 4. 所有參與碰撞的設備都會停止傳送並等待一段隨機的時間,然後重新嘗試傳送。 5. 嘗試 16 次失敗後就不再傳送。 ### CSMA/CA (Carrier Sense Multiple Access / Collision Avoidance) * 更常用於無線網路 (Wi-Fi),因為無線網路不易偵測碰撞。 * **主動避免**碰撞。 * 工作原理: 1. 傳送端在傳送資料之前,先偵測頻道是否有別人正在使用。 2. 若頻道空閒,等待一段時間 (IFS),並加上一個亂數時間,再次確認頻道是否空閒。 3. 若頻道仍空閒,傳送端送出 RTS (Request to send) 封包給接收端。 4. 接收端收到 RTS 封包後,回應 CTS (Clear to send) 封包。 5. 傳送端收到 CTS 封包後,開始傳送資料封包。 6. 接收端收到資料後回應 ACK (Acknowledge) 封包確認。 7. 若傳送端沒有收到 ACK,表示傳送失敗,會重新嘗試傳送。 * 在進行廣播或多點傳送 (Multicast) 時,不需使用 RTS/CTS/ACK 封包。 * 流程圖:![image](https://hackmd.io/_uploads/r1MWbhWElx.png) ### Ethernet Frame (乙太網路幀) * 乙太網路的原始規格是由 DIX 聯盟主導,後使用 IEEE 的 802.3 標準。 * 幀格式: * **Preamble (同步前導碼)**:8 bytes,用於接收端時脈同步和標識幀的開始。 * **Destination Address (目的位址)**:6 bytes,接收方的 MAC 位址。 * **Source Address (來源位址)**:6 bytes,發送方的 MAC 位址。 * **Length (長度)**:Payload 的長度 (46-1500 bytes),前三個 byte 定義了上層協定的方法。 * **Data (Payload) (資料)**:46-1500 bytes。 * **CRC (循環冗餘校驗)**:4 bytes,用於檢查封包是否完整無毀損。 ### 最大傳輸單元 (MTU, Maximum Transmission Unit) * 乙太網路 (Ethernet) 的 MTU 為 1500 個位元組。 * Ethernet Frame 中,最大的長度為 1518 位元組,最短為 64 位元組 (不足會用填充位元 padding 填滿)。 * 不同的資料連結層有不同的 MTU。 ### 巨型封包 (Jumbograms) * 指超過 Ethernet Frame 的 MTU 的封包,最高可到 9000 位元組。 * 可實現高效傳輸,但要求整個通訊路徑都支援 Jumbo Frame。 ### 最大區段大小 (MSS, TCP Maximum Segment Size) * TCP 封包在網路上可以傳輸的最大資料大小。 * TCP 協定在建立連接時會協商雙方的 MSS 值。 * `MSS = MTU - 20 octet (TCP 固定表頭) - 20 octet (IP 固定表頭)`。 ### 網路拓撲 (Network Topology) * 網路拓樸是網路中電腦彼此連接的方式。 * **匯流排拓樸 (Bus Topology)**: 各工作站連接在同一傳輸媒介上。 * 優點:佈線簡單,適合小型網路。 * 缺點:傳輸媒介斷線導致整個網路停擺,故障定位困難。 * **環狀拓樸 (Ring Topology)**: 以環狀連結,資料透過相鄰節點轉送。 * 優點:權限平等,適用於高負載網路。 * 缺點:任一節點故障可能使整個網路停擺,佈線困難。 * **星狀拓樸 (Star Topology)**: 由中央主機(Switches/Hub)控制,與周圍的工作站點對點連接。 * 優點:資料傳輸品質高、資料安全強、網路維護較容易。 * 缺點:中央主機故障會使整個網路癱瘓,佈線成本較高。 * **樹狀拓樸 (Tree Topology)**: 多部主機作為中心控制,以點對點方式連接,形成樹狀結構。 * 優點:具星狀優點,故障影響較小,且擴充性較好。 * 缺點:部署和維護相對複雜,如果主節點失效,會影響整個分支。 * 圖示:![image](https://hackmd.io/_uploads/Bky2-2Z4xl.png) ### LAN (區域網路) * 連接住宅、學校或辦公大樓等有限區域內電腦的網路。 * Ethernet (乙太網路) 是 LAN 中最常使用的一種技術,相關規範由 IEEE 訂定,收錄於 IEEE 802.3 標準中。 * 半雙工 (half-duplex) 允許雙向傳輸資料,但不能同時進行,有碰撞偵測。 * 同一網域透過 switch 用 MAC address 溝通。 ## Internet Layer (網路層) ### 網路層簡介 * 協定數據單元(Protocol Data Unit,PDU)為 Packet 或 Datagram。 * IP 負責將 IP 封包從來源裝置傳送到目的裝置。 * **為什麼需要 IP?** MAC Address 只在區域網路中具有唯一性,無法實現跨網路的通訊,因此需要 IP 達到全球範圍的通訊。 ### Router (路由器) * 連結多個網路,轉送 IP 封包。 * 以 IP address 為基礎的 routing table。 * 可以跨 subnet 一定要用 router。 * 運作方式: 1. PC01 要傳資料給 PC11 時,首先查看封包目標 IP 位置。 2. 查看自己主機的 Net_ID 是否與封包的相同(屬於同區網),若相同可以直接傳給目的主機。 3. 若不同,查詢 default gateway 並傳給它。 4. default gateway 會繼續往目的地傳送。 * 圖示:![image](https://hackmd.io/_uploads/rJS1Gn-4eg.png) [圖片來源](https://www.totolink.tw/upload/tw/common/PIC_2021060318_64bef9047.png) ### Routing Table (路由表) * 放置、新增、刪除從內核的 TCP/IP 的 routing table 去下指令。 * 查看自己的 routing table: `route -n`。 * 範例截圖:![image](https://hackmd.io/_uploads/rkXbzhZNel.png) ### IP (Internet Protocol) * IP 必須負責將封包由來源裝置傳送到目的裝置,所有使用 IP 的裝置,至少都必須有一個獨一無二的 IP 位址可以辨識。 * **IP 分配**:IP 由 IANA 全球樹狀分配,MAC 由廠商分配。 * IANA (Internet Assigned Numbers Authority)。 * TWNIC (Taiwan Network Information Center)。 ### IP Address (IP 位址) 表示法 * IP 位址本質是一個 32 bits 的二進位數值,但為了方便記憶,以 8 bits 為單位,將 IP 位址分成四段,再轉成十進位,用 `.` 隔開。 * 路由器必須要從 IP 位址來判斷封包要如何傳送到哪個網路。 * IP 位址是由兩個部分組成,合起來為 32 bits。 * **網路位址 (Network ID)**:位於 IP 的前端部分,用來辨識所屬的網路。同一網路上的所有裝置,都會有相同的 Network ID。 * **主機位址 (Host ID)**:位於 IP 的後端部分,用來辨識網路上的各個裝置。Host ID 不可全 0 (表示網段位置) 或全 1 (表示廣播位置)。 * **IPv4**: IP address 以 32 bits 表示,目前主流,總數約 42.9 億個 IP 位址。 * **IPv6**: IP address 以 128 bits 表示,未來趨勢,解決 IPv4 位址不足的問題。 ### IP Address Class (IP 位址等級) * IP 可分為五種等級 (Class),但一般會使用到的是 Class A、B、C 三種等級,以 Network ID 長度區分,分別使用在大、中、小型網路。 * **Class A**: 0 開頭,Network ID 8 bits,Host ID 24 bits。適合大型網路 (政府機關、國家級研究單位)。預設 Net Mask 是 255.0.0.0. * **Class B**: 10 開頭,Network ID 16 bits,Host ID 16 bits。適合中型企業、電信業者、學術單位。預設 Net Mask 是 255.255.0.0. * **Class C**: 110 開頭,Network ID 24 bits,Host ID 8 bits。適合一般企業、家庭。預設 Net Mask 是 255.255.255.0. * **Class D**: 1110 開頭,群播用途. * **Class E**: 11110 開頭,保留用途. * 圖示:![image](https://hackmd.io/_uploads/BydUz3W4gg.png) [圖片來源](https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.tsnien.idv.tw%2FManager_WebBook%2Fchap4%2F4-3%2520IP%2520%25E5%258D%2594%25E5%25AE%259A%25E6%25A6%2582%25E8%25BF%25B0.html&psig=AOvVaw2KFAx_x9stTir1xt_Dj9A8&ust=1750434752895000&source=images&cd=vfe&opi=89978449&ved=0CBQQjRxqFwoTCJCXnt_r_Y0DFQAAAAAdAAAAABAE) ### 計算 Net ID 與 Host ID * **Net ID**: `IP` AND `Netmask`. * **Host ID**: `IP` AND `~Netmask` (先將 Net Mask 做 NOT 運算,然後再和 IP 做一次 AND 運算). * **範例**: IP Address: 3.4.5.6 為 Class A * Netmask 是 11111111.00000000.00000000.00000000 (255.0.0.0). * Net ID: `3.0.0.0`. * Host ID: `0.4.5.6`. * 練習:計算 Class B 和 Class C 的 Net ID 和 Host ID. ### Public IP (公共 IP) / Private IP (私有 IP) * **Public IP**: 由 INTERNIC (或 IANA) 統一規劃分配,有這種 IP 才可以連上 Internet. * **Private IP**: 當初設計 IPv4 時,預設保留給內部網路設定用的 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 連上 Internet,可以利用 NAT (Network Address Translation) 將 IP 進行轉換 (偽裝). ### Subnet (子網路) 與 CIDR (無類別域間路由) * **子網路**:將分配到的網路切割成規模比較小的子網路,再分配給多個實體網路,方便管理並避免浪費沒有用到的 Host ID. * 使用 Host ID 的前面幾個 bits 當作 SubNet ID. * n 個 bit 可以切割出 2^n 個 subnet. * **NetMask (子網路遮罩)**:由一串連續的 1,加上一段連續的 0 組成,長度為 32 bits,與 IP 位址的長度相同. * 範例:255.255.255.0 (11111111.11111111.11111111.00000000). * 與 IP 位置組合可寫作:168.95.192.1/21 (21 代表 subnet Mask 中 1 的數目). * 如果遮罩相同代表在同一個網域下. * **Network ID (網段位址)**: 此段網路第一個 IP,代表此區段網路. * **Broadcast ID (廣播位址)**: 此段網路最後一個 IP,用於廣播. * **可分配之主機數**: (2^n) - 3 (n 為 Host ID 位數,扣除網段位址、廣播位址及 Gateway). * 例如 Class C 255.255.255.0 (8 bits Host ID) 有 2^8 - 3 = 253 台主機. * **Classless Inter-Domain Routing (CIDR)**:解決 Class A, B, C 分類彈性不足的問題. * 基於可變子網路遮罩來達到任意分配 Net ID 與 Host ID 位元數,來分配最適當的 IP 位置配置,避免浪費 IP 位置. ### LAN (Local Area Network) vs. WAN (Wide Area Network) * **LAN**: 連接住宅、學校等有線區域內電腦的網路. * **WAN**: 由多個 LAN 組成的集合,連接外部 IP 地址用. * 同一網域透過 switch 用 MAC address 溝通;不同網域透過 Router 用 IP address 溝通. ### ICMP (Internet Control Message Protocol) * 是 IP 的輔助協定,屬於 TCP/IP 的 2.5 層. * IP 傳輸只保障封包的定址和路由功能,不保障封包在傳送過程中發生的問題. * ICMP 確保設備是否在線上、報告錯誤以及進行網路診斷. * 常見 ICMP 工具: * **Ping**: 發送 Echo Request 給特定主機或 router,由近而遠逐步鎖定問題。`ping <網址或IP>`. * **Traceroute**: 找出至目的 IP 所經過的所有 router。`traceroute <網址或IP>`. ### ARP (Address Resolution Protocol) / RARP (Reverse Address Resolution Protocol) * **ARP**: * 只能在區域網路內解析網路裝置的 MAC Address. * 知道裝置的 IP 時,查詢對應的 MAC Address. * ARP Cache / ARP Table: 儲存相對應的 IP 與 MAC 位址. * 運作步驟: 1. A 電腦發送 ARP request 給區網上的所有裝置(廣播封包). 2. 用這個 IP 的裝置 (B 電腦) 會回應 ARP reply (unicast). 3. A 把 B 的 MAC 位址回傳. 4. A 將該筆 IP/MAC 寫入 ARP Table 中,保持 20 分鐘 (Cache). * **ARP Spoofing (ARP 欺騙)**: 偽造惡意的 ARP reply,覆蓋原本的 ARP Table,使流量被送到攻擊者所取代的地方. * 可導致被動監聽 (passive sniffing) 或中間人攻擊 (man-in-the-middle attack). * 也可將封包引導到不存在的 MAC 地址,阻斷服務. * 查看 ARP Table 指令:`arp -n` (以 IP Address 查看)、`arp -d <ip 位址>` (刪除特定紀錄)、`arp -s <ip 位址> <Mac 位址>` (新增靜態紀錄). * **RARP**: * 從 MAC address 反查出 IP. * 大部現代作業系統已不再支援 RARP,被 DHCP 取代. ### DHCP (Dynamic Host Configuration Protocol) * DHCP 使裝置能夠在連接到網路時自動獲取相關配置 (IP Address、子網路遮罩、DNS server address 等),而不需要手動設定. * 運作步驟 (DHCP DORA): 1. **DHCP Discover**: Client 發送廣播訊息,通知網路上的 DHCP Server 需要一個 IP 地址. 2. **DHCP Offer**: DHCP Server 回應,包含一個可用的 IP 地址、子網路遮罩、網關、DNS 伺服器等. 3. **DHCP Request**: Client 發送 DHCP Request 封包,確認要使用的 IP 地址. 4. **DHCP Ack**: DHCP Server 同意 Client 可以使用這個 IP Address. * 流程圖: ![image](https://hackmd.io/_uploads/rkqNBIuIp.png) * Demo:使用 netplan 設定網路靜態 IP. ## Transport Layer (傳輸層) ### 傳輸層簡介 * 協定數據單元(Protocol Data Unit,PDU)為 Segment. * 傳輸層多了 Port 的概念,讓同一台電腦擁有多個對外的出口,區分不同服務. * 負責將訊息拆成好幾個封包,並確保封包有沒有傳到目的地. ### Port (通訊埠口) * 如果只有 IP 位址,若有不同的軟體要同時進行傳輸,所有的資料就會從同一個出口一起通過,會產生碰撞. * 連接埠:讓同一台電腦擁有多個對外的出口,讓網路傳輸有多工的能力. * 每個 Port 對應到不同的服務,例如 IP 是門牌號碼,Port 是哪個窗口. * **常見服務對應 Port**: * HTTP: 80 * HTTPS: 443 * FTP (資料傳輸): 20 * FTP (控制連線): 21 * SSH: 22 * Telnet: 23 * SMTP: 25 * DNS: 53 * POP3: 110 * **查詢 Port 服務方式**: `/etc/services`. * `cat /etc/services`:查看 Port 的使用狀況. * `grep -w <Port號> /etc/services`:查詢指定 Port. ### UDP (User Datagram Protocol) * **不可靠的**傳輸方式. * **Connectionless (無連線導向)**: 僅提供傳輸基本功能,負責處理封包要傳送到哪個 Port. * 沒有像 TCP 一樣的握手建立連線流程,socket 創建後就直接將封包發往指定 IP 地址上的指定端口號應用程式. * 不需要 ACK 響應來確認對方是否收到消息,這可能造成封包的亂序到達以及丟失問題. * 缺乏壅塞控制. * 可以依照想要的速率發送封包 (受限於網路核心中的帶寬限制). * **優點**: 比較快、資料大小較小. * **適用場景**: 追求即時性且能容忍一些封包丟失的情況 (盡力傳遞),例如串流媒體、視訊、音訊、網路電話、網路遊戲. * **UDP Header 格式**: * Source Port (16 bits): 來源 Port 號. * Destination Port (16 bits): 目的 Port 號. * UDP Length (16 bits): 紀錄 UDP 封包的總長度. * UDP Checksum (16 bits): 用於執行錯誤檢查 (不一定要執行). * 圖示:![image](https://hackmd.io/_uploads/S1xxVhWNgg.png) [圖片來源](https://www.tsnien.idv.tw/Internet_WebBook/%E6%8F%92%E5%9C%96/chap7/7-20.png) ### TCP (Transmission Control Protocol) * **可靠的**傳輸方式,保障資料完整性. * **Connection-Oriented (連線導向)**: 傳輸資料前先建立連線,協調參數 (用於資料確認與重送、流量控制). * **優點**: 因為有三向交握故相較可靠. * **缺點**: 較慢. #### TCP Header 格式 * Source Port (來源埠號): 16 bits,記錄來源主機的 port. * Destination Port (目的埠號): 16 bits,記錄目的主機的 port. * Sequence Number (序列號): 32 bits,記錄每個封包的序號。當 TCP 資料太大時需分段,利用 Sequence Number 讓接收端組合資料. * Acknowledgement Number (確認號): 32 bits,接收端確定之前傳遞的封包已被正確收下. * Control Flags (控制標誌碼): 6 bits,用來控制訊息的傳遞. * **URG (Urgent)**: 為 1 表示該封包為緊急資料,接收端應緊急處理,並啟用 Urgent Pointer 欄位. * **ACK (Acknowledge)**: 為 1 表示該封包為回應封包,具回應確認功能,確認 Acknowledge Number 欄位中所指定的順序號碼. * **PSH (Push)**: 為 1 表示要求對方立即傳送緩衝區內的其他對應封包. * **RST (Reset)**: 為 1 表示連線被立即結束 (強迫性),無需等待終止確認手續,且發送端已斷線. * **SYN (Synchronous)**: 為 1 表示發送端通知對方要求建立連線. * **FIN (Finish)**: 為 1 表示傳送結束,通知對方資料傳輸完畢,是否同意斷線. * Window Size (視窗大小): 代表「接受視窗」的大小,用來控制封包流量,告訴對方目前本身還有多少緩衝器可以接收封包. * Checksum (檢查碼): 確定所收封包是否在傳輸過程中出現錯誤. * Urgent Pointer (緊急資料指標): 指出緊急資料在 TCP 資料的哪裡. * 圖示: ![image.png](https://hackmd.io/_uploads/SJ5p9T4XT.png) #### Three-way Open Handshake (三向交握建立連線) * TCP 十分可靠,因為有三向交握 (在做行為前都會先向對方做確認). 1. **SYN**: 發送方 (Client) 發送一個帶有 `SYN=1` 的封包,並發送一個 Sequence Number (例如 10001) 給接收方 (Server). 2. **SYN-ACK**: 接收方確認後,回覆一個 `ACK=1` 和 `ack=10001+1` (前一個 Sequence Number + 1),同時也發送 `SYN=1` 和自己的 Sequence Number (例如 20001) 回傳給發送方. 3. **ACK**: 發送方回傳 `ACK=1` 和 `ack=20001+1` (接收方 Sequence Number + 1). 4. 連線確定,開始傳送資料. * 流程圖: ![](https://hackmd.io/_uploads/HkjqoX77p.png =600x180) #### Data Confirmation & Retransmission (資料確認與重送) * 發送端為每一個封包標記一個編號 (sequence number),接收端在收到封包時,就會回傳一個帶有對應編號的 ACK 封包給發送端. * 如果發送端在超過一定時間 (Retransmitting Timeout, RTO) 後還沒有收到回傳的 ACK,就會認為封包已經丟失,啟動重新傳送的機制. * Sequence Number & ACK 讓對方回應時可以針對這個 Sequence 發送對應 ACK,確認封包是否已被接收和確認對方收到多少. * 圖示:![image](https://hackmd.io/_uploads/HkGUBnZ4ge.png) #### Four-way Handshake (四次揮手結束連線) 1. **FIN**: 發送方 (Client) 通知對方結束連線. 2. **ACK**: 接收方 (Server) 確認收到結束連線請求. 3. **FIN**: 接收方通知發送方自己也沒有東西要傳了,要求終止連線. 4. **ACK**: 發送方確認收到結束連線請求,連線正式結束. * 流程圖:![image](https://hackmd.io/_uploads/B1KhSn-Neg.png) [圖片來源](https://live.staticflickr.com/65535/52676617649_2711bbb224_o.png) ### TCP vs. UDP 比較 | | TCP | UDP | |---|---|---| | 可靠性 | 可靠 | 不可靠 | | 封包確認 | ACK | - | | 速度 | 慢 | 快 | | 傳輸方式 | 封包按順序傳輸 | 封包以串流方式傳輸 (可能亂序) | | 錯誤檢查與修正 | 有 | 無 (只有檢查碼) | | 逾時處理 | 逾時重傳、高速重傳 (指定封包) | 逾時重傳 (全部封包) | | 壅塞控制 | 有 | 無 | | 適用服務 | 要求可靠運輸的服務 (e.g., SSH、文字聊天、電子郵件、檔案傳輸) | 講求速度的即時服務 (e.g., 串流媒體、網路電話、網路遊戲) | ## Application Layer (應用層) ### 應用層簡介 * 傳送單位為 message 或 data. * 應用程式間溝通的協定. ### HTTP (HyperText Transfer Protocol) * 全球資訊網 (www) 的網路通訊基礎. * 用於網頁前後端溝通,瀏覽器向伺服器發送請求,伺服器回傳相應的資料. * 流程: 1. DNS 解析:查詢 Domain name 對應的 IP. 2. 建立 TCP/IP 連線:包括尋找 IP/MAC address 和 TCP 三向交握. 3. 決定要送出 Get 還是 Post. * **HTTP Request Method**: * **GET**: 較 POST 不安全,訊息會顯示在 head,body 不傳資料,參數會在 URL 上顯示. * 流程:瀏覽器發出 Get 請求,只產生一個 TCP 封包,伺服器回應 200 並返回資料. * **POST**: 較 GET 安全,將參數放至 body 中再發送 request,不在 URL 看到參數,適合用於隱密性較高的資料 (e.g., 登入帳號、密碼). * 流程:瀏覽器先送 headers,可能收到 100 Continue,再傳送 data (產生 2 個 TCP 封包),最後伺服器回應 200 並返回資料. * **PUT**: 新增一項資料,如果存在就覆蓋過去 (維持一筆資料). * **PATCH**: 附加新的資料在已經存在的資料後面 (資料必須已存在). * **DELETE**: 刪除資料. * **HEAD**: 只會取得 HTTP header 的資料. * **OPTION**: 可以了解 server 提供哪些溝通方法. * **狀態碼**: * 1XX: 參考資訊 (e.g., 100 Continue, 101 切換通訊協定). * 2XX: 成功 (e.g., 200 客戶端要求成功). * 3XX: 重新導向 (e.g., 301 永久導向, 302 暫時導向, 304 未修改). * 4XX: 用戶端錯誤 (e.g., 401 拒絕存取, 403 禁止使用, 404 找不到). * 5XX: 伺服器錯誤 (e.g., 500 伺服器錯誤). ### DNS (Domain Name System) * 將 Domain Name 轉換成 IP Address. * Domain Name: `moodle.ncnu.edu.tw` -> IP address: `163.22.5.234`. * `nslookup <Domain Name>` 指令可查詢. * **樹狀階層式架構**: ![image](https://hackmd.io/_uploads/S1CUewvUa.png) * **DNS 查找流程**: ![image](https://hackmd.io/_uploads/r1eOJPP8p.png) * **設定檔**: * `/etc/nsswitch.conf`: 定義解析的依序優先順序,決定先要使用 `/etc/hosts` 還是 `/etc/resolv.conf` 的設定. * `/etc/hosts`: hostname 對應到 IP 的檔案. * `/etc/resolv.conf`: 解析時使用的 DNS Server 的 IP. * **DNS 使用 TCP 或 UDP**: * **UDP 協議**: 大部分時候使用 UDP,因為 DNS 查詢的資料包較小、機制簡單,額外開銷小,有著更好的性能表現,查找網址時較講求速度,就算掉包了再重送就好. * **TCP 協議**: * 當封包過大時 (資料大小超過 512 位元組的限制時會被截斷,如果使用者沒有從 DNS 得到回應,3~5 秒後會使用 TCP 重送). * DNSSEC 和 IPv6 的引入導致 DNS 回應膨脹,需要依靠更可靠的 TCP 協定完成資料傳輸. * DNS 區域轉送 (Zone Transfer): 當主 DNS 與副 DNS 要確保資料庫資料相同,有變動時,會用區域轉送來保持資料一致,此時會用 TCP 傳送. * **Anycast**: 尋找最短路徑的策略. * **AS (Autonomous System)**: Internet 是由不同網絡組成的網路,自治系統是組成 Internet 的大型網路,具有統一路由方式的巨型網絡或網絡群組. * **BGP (Border Gateway Protocol)**: AS 通過 BGP 通知其到其他 AS 和路由器的路由策略,BGP 是在 AS 之間路由數據包的協議,BGP 路由器不斷更新路由表以確定從 AS 到 AS 的最快路徑. ### FTP (File Transfer Protocol) * 應用於檔案傳輸、檔案共享使用,將共享檔案存放於 FTP 伺服器,讓一般使用者可以透過網路來下載或上傳. * 其重點是在異質性電腦之間、以及遠距離的檔案共享. * **Client-Server 模型**: FTP Server 提供檔案,FTP Client 連接到 Server 執行上傳或下載操作. * **Port 21 (控制連線)**: 進行身份驗證,輸入帳號、密碼等指令. * **Port 20 (資料連線)**: 用於實際的檔案資料傳輸 (下載或上傳檔案). #### FTP Active Mode (主動模式) * 由 Server 主動向 Client 發起傳送資料請求. * 流程:Client 透過 Command Port (例如 1026) 向 Server 的 Command Port (21) 發送連線請求,同時告知 Server 自己的 Data Port (例如 1027)。Server 從自己的 Data Port (20) 向 Client 指定的 Data Port 建立連線. * **問題**: FTP 的主動模式可能受到防火牆的阻擋,因為它需要在外部網路和內部網路之間建立一個由 Client 指定的隨機 port 的連線. * 圖示:![image](https://hackmd.io/_uploads/rkLs-8uI6.png) #### FTP Passive Mode (被動模式) * Server 被動等 Client 來連線 (Client 主動連線). * 流程:Client 主動跟 Server 連線後,告訴 Server 使用 passive mode。Server 回 ACK 並告訴 Client 自己開啟了一個 Data Port (例如 2024)。Client 主動跟剛才 Server 指定的 Data Port 連線. * 圖示:![image](https://hackmd.io/_uploads/Sy1AYCwUp.png) ### HTTP Protocol Version (HTTP 協定版本) #### HTTP 1.0 * 簡單的文本協定. * **無連線持續性 (keep-alive)**: 單一請求-回應模型,每個請求都需要建立新的連線,完成後即斷開,造成浪費頻寬、時間延遲. * 單路徑傳輸,一次只能處理一個請求. * 主要使用標頭中的 `If-Modified-Since` 和 `Expires` 來做為緩存的判斷標準. #### HTTP 1.1 * **連線持續性 (keep-alive)**: 可以使用同一個 TCP 連接來重複多個 HTTP 請求,預設 keep-alive,避免重新建立連線. * **管道化**: 允許在同一連接上並行發送多個請求,但回應還是按照請求的順序返回. * 引入了狀態碼 **100 (Continue)**,改進了對應 client 端發送正文的機制,避免不必要的頻寬浪費. * 新增了 PUT, PATCH, DELETE, CONNECT, TRACE, OPTIONS 等請求方法. * **Host 標頭**: 支援多虛擬主機,使用 Host 標頭字段指定伺服器的域名. * 引入了更多的緩存策略 (e.g., Etag, If-Modified-Since). #### HTTP/2 (基於 SPDY) * SPDY (SPeeDY) 改善網頁的 Page Load Time,Server 可以主動傳訊息,可以連續發 request. * **二進制協定**: 將資料轉換為二進制格式,傳輸更高效. * **Request Multiplexing (多路複用)**: 允許在同一個連接上並行交換多個請求和回應,避免了 HTTP/1 中的「頭部阻塞 (head-of-line blocking, HOL)」問題. * **Header 壓縮**: 使用 HPACK 壓縮標頭,減少傳輸大小. * **優先請求順序**: 每個請求有唯一的編號和優先級,伺服器可根據優先級回應. * **Server Push (伺服器推送)**: Server 可以在 Client 端需要之前主動推送資源到瀏覽器的快取中,加快網頁載入速度. * Always Over TLS (總是透過 TLS). * 圖示:![image](https://hackmd.io/_uploads/Bkar_2WVgl.png) #### HTTP/3 (基於 QUIC) * QUIC (Quick UDP Internet Connection). * **基於 UDP** 而非 TCP,有更低的連接建立時間. * 提供 **0-RTT (零往返時間)** 的概念,可以快速建立連接. * 初始交握 (Initial Handshake) 流程: Client Hello (CHLO), REJ 封包 (包含 Server Config, Certificate Chain, Signature, Source-Address Token), Complete CHLO, Server Hello (SHLO). * 圖示:![](https://i.imgur.com/d5CFgVk.png) * **多路複用 (Multiplexing)**: 允許在同一連線上進行多個 Stream 的資料傳輸。當某個 Stream 的封包遺失時,僅影響該 Stream,其他 Stream 不受影響,有效避免 TCP 的 HOL Blocking 問題. * **封包遺失恢復 (Loss Recovery)**: * TCP 重傳使用同一個 sequence number,難以區分是接收初始封包還是重傳封包的 ACK. * QUIC 解決方案:使用唯一的封包編號 (unique packet number),每次傳送都有新的編號,解決了 ACK 的歧異問題,提高了 RTT 準確度,降低封包重傳反應時間. * **流量控制 (Flow Control)**: 限制 client 端傳輸資料量,接收端只保留相對應大小的接收 buffer。QUIC 使用連線層和 Stream 層流量控制,避免單一 Stream 佔用過多 buffer. * **Connection Migration (連線遷移)**: * TCP 連線所需條件包含 source port, destination port, source ip, destination ip,更換 IP 就需要重新連線. * QUIC 使用 64 bits 的獨立 Connection ID 來識別連線,由 client 端在建立連線時隨機產生. * Connection ID 允許在 client 端 IP 變動時,仍能平順處理 Connection Migration 問題,例如從 Wi-Fi 轉移到 4G 網路連線. * 內建 TLS 1.3. ### 網路工具 * **Wireshark**: 開源的網路數據封包分析軟體. * 安裝: `sudo apt install wireshark`. * 使用: `sudo wireshark`,選擇介面 (e.g., ens33), 指定過濾條件 (e.g., `ip.addr==44.211.137.141 && ssh`). * 可觀察 TCP 三向交握、四次揮手等封包內容. * 範例截圖: ![image](https://hackmd.io/_uploads/ryu5gaZbJx.png)![image](https://hackmd.io/_uploads/HyJLWTWWyx.png) * **TCP Dump**: 封包監控工具,類似 wireshark. * 選項: `-i` (指定網卡), `-w <file>` (輸出到文件), `-r <file>` (從文件讀取), `-e` (顯示詳細資訊), `-tttt` (可讀日期時間戳). * 過濾: `tcp`, `udp`, `icmp` (協議), `src host <source>`, `dst host <destination>` (方向), `ether`, `ip` (類型). * 範例:`sudo tcpdump -i any -n -vvv -A -w output.pcap 'tcp'`. * 範例截圖: ![image](https://hackmd.io/_uploads/S1bHoPPIp.png)