KaiWhat
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee
    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Engagement control
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Versions and GitHub Sync Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee
  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       owned this note    owned this note      
    Published Linked with GitHub
    Subscribed
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    Subscribe
    [TOC] - Book mode: https://hackmd.io/@ncnu-opensource/book # TCP/IP > 回到企資網,來當郵差:D ## 引言 - 中文與英文是「協定」 - 透過中文或英文溝通是「通訊」 - 講話的內容是「資料」 ![image](https://hackmd.io/_uploads/ryc8PVYl1g.png) - 使用的語言(協定)不同,理解不能 --- ![image](https://hackmd.io/_uploads/SkeWLNYgkx.png) - 使用的語言(協定)一樣,溝通無礙 --- 人類具有智慧、理解力,即使脫離原則,還是可以與對方溝通 ![image](https://hackmd.io/_uploads/ry0t_NFgJg.png) 但電腦沒有這樣的理解力,在電腦之間的通訊,無論是以太網路等實體層,還是應用程式的軟體層面,都需要明確規範並遵這個約定,這個約定就是「協定」 --- 約定是約定了,但要聽誰的...? ![image](https://hackmd.io/_uploads/SyEo6VFgyg.png) --- ![image](https://hackmd.io/_uploads/HJxNyHFeyg.png) --- ## OSI 模型 > OSI 模型沒有具體的協定,而是抽象的參考模型,不是一個標準,而是一個在制定標準時所使用的概念性框架 | | 層 | 功 能 | 範 例 | | - | --- | --- | --- | | 7 | 應用層 | 針對應用程式的協定 | 電子郵件、檔案傳輸、遠端連線 | | 6 | 表現層 | 負責資料的加密和解密,確保不同格式之間的轉換和壓縮 | JPEG、GIF | | 5 | 會議層 | 決定通訊會話的建立、連接時間和切斷 | NFS會話控制、SIP會話發起協定 | | 4 | 傳輸層 | 提供值得信賴的資料傳輸,可以進行流量控制、錯誤檢測和重傳 | TCP、UDP | | 3 | 網絡層 | 確保封包在不同網路間的路由路徑選擇和轉發 | IP、路由器、ICMP | | 2 | 資料鏈接層 | 負責 Message 與 bytes 之間的轉換 | MAC address、PPP | | 1 | 實體層 | 負責網路硬體的傳輸方式,包括訊號的生成、電壓控制、訊號傳輸速率等 | 以太網路纜線、Wi-Fi、藍牙 | --- 我們用 HTTPS 來解釋 OSI 模型 ### **應用層 Application Layer** - HTTPS 會在這一層發起請求和接收回應。在瀏覽器中輸入網址後,應用層負責和 Web 伺服器之間進行通訊,建立一個 HTTPS 連線,並將 HTTP 資料封裝進這個連線中傳送。 ### **表現層 Presentation Layer** - 這層主要處理數據的加密和解密。HTTPS 使用的 TLS/SSL 加密技術就在這一層,將應用層的資料進行加密處理,確保數據傳輸的安全性和隱私性。 ### **會議層 Session Layer** - 在 HTTPS 中,會議層管理伺服器和客戶端之間的會話。例如,建立、維護和終止加密的 HTTPS 會話(如 TLS 會話)就在這一層進行。 ### **傳輸層 Transport Layer** - 這一層負責資料的傳輸和連接的可靠性。HTTPS 使用 TCP 來進行數據傳輸。當你建立一個 HTTPS 連線時,傳輸層會先建立一個 TCP 連接,保證數據包按順序、無遺失地傳遞。 ### **網路層 Network Layer** - 網路層處理資料包的路由與轉發。當使用 HTTPS 時,網路層會將資料包從客戶端傳送到伺服器,確保每個封包找到正確的路徑傳送到目的地。 ### **資料連接層與實體層 Data Link & Physical Layer** - 負責實際的硬體傳輸,像是光纖、Wi-Fi 等介質,數據會以電子訊號形式在硬體設備間傳輸。當我們使用 HTTPS 瀏覽一個網站時,資料的物理傳輸就在這一層進行。 --- 雖然 OSI 模型劃分了七層,但在實際應用上,很少有產品可以符合 OSI 模型的定義,有些層數在實務上是可以合併的,這裡來談談 DoD 模型,別稱 TCP/IP 模型 --- ## TCP/IP 模型 雖然兩種模型各有自己的架構,但基本上能互相對照 ![image](https://hackmd.io/_uploads/HyM5QStlJg.png) |OSI 模型||DoD 模型(TCP/IP 模型)| |---|---|---| |國際標準化組織 (ISO) |主要組織| 美國國防部(Department of Defense) | |七層|層數|四層| |理論性的分層模型,不常用|用途|現實世界中網絡通訊常用的模型| 現在我們試著來抓幾個封包來讀看看,使用 Wireshark --- ## Wireshark ```bash= sudo apt install wireshark # 安裝完成會自動跳出 "Should non-superusers be able to capture packets?" # 選取 "yes" 即可 ``` 1. `sudo wireshark` ![image](https://hackmd.io/_uploads/ByV0nhbWJx.png) 2. 選擇 ens33、enp1s0、ens3...e 開頭的都可以 ![image](https://hackmd.io/_uploads/rJzAR2-W1g.png) 3. 指定ip.addr及Protocol,將不需要的資訊過濾掉 `ip.addr==44.211.137.141 && ssh` ![image](https://hackmd.io/_uploads/HJEBJ6WW1x.png) 4. ssh 到 lsa server ```bash= ssh lsa@lsalab.moli.rocks # Password 在群組 ``` ![image](https://hackmd.io/_uploads/Hyh7gp-Zkx.png) 5. 找到一個用 TCP Protocol 的封包,點開它 ![image](https://hackmd.io/_uploads/ryu5gaZbJx.png) ![image](https://hackmd.io/_uploads/HyJLWTWWyx.png) 現在開始解讀封包 --- # Link Layer ## MAC Address > 也有人將 MAC Address 稱為硬體位址、 Physical address 、 Layer 2 Address ![image](https://hackmd.io/_uploads/SyP6WaW-yx.png) 一張網卡,一個 MAC address > 同一區域網路 mac addr 絕對不能重複到,但不同區域可以接受 (因為不同 IP) - 乙太網路將封包送出後,最終目的地的所有電腦都會收到封包,但為了知道封包要傳送的對象,所以每張 Ethernet 網路卡都邊有一個獨一無二的位置,稱為 **Media Access Control Address** - 在每一張 Ethernet 網卡出廠之前就已經將 MAC Address 寫在網路卡的 ROM,一張網卡就有一個 MAC Address在裡面 - 可以虛擬、重設定 - MAC 層的每個封包都會記載「從哪裡送出」(Source MAC Address),「到哪裡去」(Destination MAC Address),比對過後就可以得知自己是否為傳送的對象,看是要丟棄此封包,還是要繼續處理此封包 > 舉例:XxX 電話!如果不關我的事就假裝沒聽到 :::info - MAC 地址是以6 Bytes(48bits)表示 - 第 1 bit 為單播位址 Unicast ( 0 )/群播位址 MuIticast ( 1 )。 - 第 2 bit 為廣域位址( 0 )/區域位址( 1 )。 - 前 3 ~ 24 bits 為廠商代號。 - 後 24 bits 為產品流水號。例外: MAC 地址中所有 bit 都為 1 (FF:FF:FF:FF:FF:FF),代表是廣播位址 > 所有公寓的住戶都在一起慶祝特殊活動,使用喇叭廣播音樂,這樣每個人都能聽到 ::: --- ## Connection device - 早期用 hub ![](https://upload.wikimedia.org/wikipedia/commons/d/d9/4_port_netgear_ethernet_hub.jpg) - broadcast 收到資料就全部傳出去 > 不安全,在連同一個 hub 的情況下,資料會互通 - 半雙工(half-duplex) - 收資料或送資料不能同時,一次只能作其中一種 ![](https://dahtrang.com.tw/images/2023/04/06/rj45colorcode.jpg) - 現在 switch 最常見 ![](https://upload.wikimedia.org/wikipedia/commons/b/b9/2550T-PWR-Front.jpg) - 可以建立 MAC address table > 不同種類、規格儲存不同數量的 Mac address - 每個 port 會紀錄 client 的 Mac address > 檢查 Mac address 後會指定一個 port 傳輸,解決資料互通的隱憂 ![](https://i.imgur.com/6xbhENb.png) - 全雙工 --- ## Method used in Ethernet ### Carrier Sense Multiple Access (CSMA) - Carrier Sence (CS) : 在傳送資料之前,MAC 會先觀查 port 是否空閒。這稱為「Carrier Sense」。 - Multiple Access (MA) : 談的是讓很多人共同來使用的資訊通道,而彼此不互相干擾,因此必須以多工技術(multiplex)架構來提供。 ### Collision Avoidance (CA) 當多個設備同時要使用頻道時,CA 會隨機決定多個設備的使用時間,一次一個設備傳送資料,從而避免碰撞性,一種簡單暴力但沒效率的演算法。 > 像是隨機決定秒數的十字路口號誌,當綠燈那方的車輛皆通過後,紅燈那方仍須等待號誌燈切換(稱為 Dead time),是不是很沒效率? ### Collision Detection (CD) > 如果說剛剛的 CA 是碰撞避免的話,CD 就是碰撞偵測 **Collision Detection** 偵測碰撞,發生碰撞時,碰撞的每一方會停止傳送,並隨機等待一段時間,再重新傳送(假如雙方碰撞後立刻重傳,又會產生碰撞)。 --- - CSMA/CD 通常應用於有線網路(例如 Ethernet),因為碰撞容易被偵測和處理。 - CSMA/CA 則更常用於無線網路 Wi-Fi,Wi-Fi 也是一種半雙工,Wi-Fi 在送資料的時候沒辦法收資料,所以碰撞的檢測較為困難,所以改用碰撞避免策略來減少碰撞的發生。 --- # Network Layer ![image](https://hackmd.io/_uploads/rJDfYTWbyx.png) ![](https://upload.wikimedia.org/wikipedia/commons/6/60/IPv4_Packet-en.svg) ## Internet Portocol (IP) Internet Protocol 中的 IP Address (簡稱 IP) 同樣分 Source & Destination Address - IPv4: IP address 以32 bits 表示,為目前主流 - 現在在網路上的主機數已將多過 IPv4 32位元可以表示的數量 - 2^32 = 4294967296 - IPv6: IP address 以 128 bits 表示,未來趨勢,以 128 bits 的方式呈現 ### IP address IP 位址(IPv4 位址)在電腦內部是以二進位 32bits 處理,但我們很難解讀二進位,所以我們採用分組的方式,將 32bits 的 IP 位址,以 8 位元分成一組,共分成四組,並以十進位表示,像是 10.107.26.215 就是 | | | | | | | -------- | -------- | -------- | -------- | --- | | 00001010 | 01101011 | 00011010 | 11010111 | BIN | | 10 | 107 | 26 | 215 | DEC | --- ## Connecting device ### Router ![](https://upload.wikimedia.org/wikipedia/commons/thumb/d/da/Linksys_WRT54GL.jpg/1280px-Linksys_WRT54GL.jpg) ![image](https://hackmd.io/_uploads/B1Wq5eqMR.png) --- ## Method used in Network ### IP Routing - IP 位址可以一分為二,一段是 Network ID,一段是 Host ID - 網路位址(Network ID) - 位於IP的前端部分,用來辨識所屬的網路 - 暨大是 `163.22.0.0` - 主機位址(Host ID) - 位於IP 的後端部分,用來辨識網路上的各個裝置 - 暨大學校網站 `163.22.12.20` - 只要在暨大網段裡面的網路都是 `163.22.x.x` ### IP address 的等級( Class ) 早期只有一些大型的網路,例如 ARPANET,32 bits 的 IPv4 address 只會由 8 bits 的 Network ID 和剩下的 24 bits 的 Host ID 組成。 這使獨立的網路的數量不能太多(最多254個),在區域網路概念出現的時候,顯得不足夠了。 - 為了方便管理與識別,IP 可分為五種等級(Class),但一般會使用到的是 Class A、B、C 三種等級,以 Network ID 長度區分,分別使用在大、中、小型網路 ![image](https://hackmd.io/_uploads/rkF2QmJ86.png) - Network ID 和 Host ID 的長度分配 - 大型的網路應該使用較短的 Network ID,才有比較多的 Host ID,小型的網路應該使用較長的 Network ID - Class A - 政府機關、國家級研究單位 - Network ID 8 bits 最多 256-2 個 - Host ID 24 bits 可以分給 16777216-2 台主機 - Class B - 大型企業、電信業者、學術單位 - Network ID 16 bits - Host ID 16 bits,可以分給 65536-2 台主機 - Class C - 一般企業、家庭 - Network ID 24 bits - Host ID 8 bits,可以分給 256-2 台主機 :::info 2^n - 2 - n 是所用的位數,減 2 是因為第一個和最後一個位址都是無效的 - \*.\*.\*.00000000 此段網路第一個 IP,代表此區段網路 Subnet - \*.\*.\*.11111111 最後一個 IP,用作 Broadcast ::: ### Subnet 子網路 - 切割網段 => 先決定想要分配的主機數: - Class C 網路為例: - 網路遮罩: 11111111.11111111.11111111.**00000000** => 255.255.255.0 ### NetMask(子網路遮罩) - 由一串連續的1,加上一段連續的0 > 例如:11111111 11111111 11111111 00000000 > 通常寫作:255.255.255.0 :::success ### 計算Net ID and Host ID - Net ID:`IP` AND `Netmask` - Host ID: `IP` AND `~Netmask` > FIXME: 用「保留幾個 bit 的講法」 #### Q:有一 IP Address:3.4.5.6 為 class A,請問 Net ID、Host ID為何? class A 有 8 bits Network ID, 24 bits Host ID Netmask 是 11111111.00000000.00000000.00000000 8 個 bits 的 1,那就保留 - Net ID:`3.0.0.0` - Host ID:`0.4.5.6` :::info 1. 有一 IP Address:192.168.38.26 為 class c,請問 Default Mask、Net ID、Host ID 為何? 2. 有一 IP Address:130.48.93.73 為 class B,請問 Default Mask、NetID、HostID 為何? ::: ### IP 的種類:主要分為兩種 剛才是有拆解 IP,至於哪裡可以應用呢? 1. public IP (公共 IP 或公開 IP 位址): - 簡單來說我們能看到的所有網站 2. private IP (私有 IP 或保留 IP 位址): - 當初設計 IPv4 時,預設保留給內部網路設定用的 IP 區段。 - 無法在公開網路上使用,只能在家裡、實驗室等等地方使用。 每個 class 裡都預留了一段作為 private,提供給用戶或企業來設定規劃自己的區域網路: - Class A:10.\*.\*.\*,一組 Class A - Class B:172.16.\*.\*, 172.17.\*.\*..., 172.31.\*.\*,共 16 組 Class B - Class C:192.168.0.\*, 192.168.1.\*..., 192.168.255.\*,共 256 組 Class C :::success 作業:下列哪幾個是屬於 private IP,需要透過 IP 分享或偽裝才能夠連上 Internet? 1. 172.15.1.1 2. 192.28.1.1 3. 10.100.1.1 4. 172.20.1.1 5. 192.168.5.1 6. 61.5.5.1 ::: :::info 分類網路(Classful Addressing),是引入 **CIDR** 之前在網際網路中使用的技術,但 class a, class b, class c 這樣的分類仍不夠彈性。 試想我們家裡有一台 router,被分類到最小的 class c,我們家裡可能最多只有 10 台需要連網的設備,然而 class c 仍然給了我們 254 台的空間作使用,這樣就浪費了 244 台空間。 在意識到這個問題後,工程師們發布了新的技術 **CIDR**,取代分類網路只能以 8 bits 為單位分類 class 的問題,簡單來說就是沒有硬性規定 Host ID 只能是 16 or 8 bits,可以是 10 bits,又或是以上面 10 台為例,就可以切出 28 bits 的 Net ID,剩下 4 bits 共 16 台就可以涵蓋我們需求了。 ::: --- ### Domain Name Server (DNS) 回到 IP address,無論是分類網路法還是 CIDR,還有一個問題,電腦看的懂這串數字,但我們實在是記不住,就像我們要用 moodle 時,我們不會在瀏覽器打 163.22.5.234,反過來說 moodle 的網站也只會顯示 moodle.ncnu.edu.tw ,此時我們會稱 moodle 是主機名稱 **Host name**,ncnu.edu.tw 是 **Domain name**,而電腦知道 moodle.ncnu.edu.tw 對應 163.22.5.234 的原因就是因為有 DNS,DNS 就像是一個紀錄主機名稱與 ip 位址的資料庫。 1. 不多人會在瀏覽器的網址列 (URL) 填寫 IP 了,大部分都是透過主機名稱來處理的。 2. 因為 Internet 就是 TCP/IP,因此上網一定要用 IP 才行 (不論是 IPv4 還是 IPv6)。 3. 所以就需要透過 DNS 系統,讓瀏覽器直接去 DNS 系統詢問某主機名稱的 IP 後,瀏覽器再自行連上該伺服器! --- ### Address Resolution Protocol (ARP) 主機剛連接到這個區域網路時或者重新啟動之後,是不知道目的方的 MAC addr 的,如果要向目的機器傳送一個 IP packet,就需要先知道目的機器的 MAC addr,所以會傳送一個叫做 ARP 請求的封包。 :::success 查看 ARP table - `arp -n`: 以 IP Address 查看 Table - `arp -d <ip 位址>`: 刪除特定紀錄 - `arp -s <ip 位址> <Mac 位址>`: 新增一筆靜態紀錄 > 過了兩分鐘不會被刪除,但重新開機後就會被清除 ::: - 只能在區域網路內解析網路裝置的 MAC Address - 知道裝置的IP 時,查詢對應的MAC Address - `A`(163.22.1.1)要傳送封包給 `B` (163.22.1.1),`A` 知道 `B` 的IP 位址,但不知道MAC位址 - `A` 發送 ARP request 給區網上的所有裝置(廣播封包) - 用這個 IP 的裝置會回應 ARP reply(`B` 會產生回應) - `A` 把 `B` 的 MAC 位址回傳 - Cache: `A` 將該筆 IP/MAC 寫入 ARP Table 中,保持20分鐘 這樣,`A` 就知道 `B` 的 MAC 位址,它就可以向 `B` 傳送資訊。同時它還更新自己的 ARP table,下次再向 `B` 傳送資訊時,直接從 ARP table 裡尋找就可。 --- ### DHCP(Dynamic Host Configuration Protocol,動態主機組態協定) - DHCP 使裝置能夠在連接到網路時自動獲取相關配置(IP Address 、子網路遮罩、 DNS sever address 等) > DHCP Server(餐廳服務生):主動詢問裝置需要多少個IP地址,然後提供相應的網路配置要連線的裝置(客人):進入網路的設備,ex. 電腦、手機等 > 客人到餐廳之後,餐廳服務生會根據人數安排座位,並提供餐具、菜單...... - 運作步驟 - **DHCP Discover** : Client 發送一個 DHCP Discover 封包(廣播訊息),通知網路上的 DHCP Server :「我需要一個 IP 地址」 - **DHCP Offer** : DHCP Server 收到 Discover 封包後,回應一個 DHCP Offer 封包,其中包含一個可用的 IP 地址、子網路遮罩、網關(gateway)、 DNS 伺服器等 - **DHCP Request** : CIient 收到 DHCP Offer 後,發送一個 DHCP Request 封包,確認要使用的 IP 地址 - **DHCP Ack**: 同意 Client 可以使用這個 IP Address ![image](https://hackmd.io/_uploads/rkqNBIuIp.png) --- ### NAT(Network Address Translation): 將私有IP位址轉成公開IP位址 ![](https://i.imgur.com/kQWD55i.png =600x) - **網站伺服器無法定位 Private IP**,在電腦送 request,router 就會把來源的 IP 位址改成 public IP( Router 同時有兩個 IP 位置,區域內的私有 IP 位置,以及 ISP 指派的公開 IP 位置) - Router 在更改ip位置時 會將私有IP 與 request 目標 IP 記錄下來 - 因為可以多個主機共用一個公有 IP > 私有 IP: 在內網使用的 IP > 公開 IP: 在外網使用的 IP | | 處理事項 | |:-------:|:--------------------------------------------:| | router | 只轉送,不會記下封包狀態 | | NAT | 轉送外,還會幫你做 IP 的轉換 | | bridges | 連接兩個不同網段,可以是相同類型或不同類型。 | --- ### LAN vs WAN - LAN(Local Area Network) - ip: 192.168.0.1 or 10.0.1.256 - WAN(Wide Area Network) - 接外部 IP 地址用 - LAN 是封閉型的,可以由辦公室內的兩台電腦組成,也可以由一個公司內的上千台電腦組成。 - WAN 就是由多個 LAN 組成之集合 同一網域 透過 switch 用 MAC address 溝通 不同網域 透過 Router 用 IP address 溝通 --- # Transport Layer ![image](https://hackmd.io/_uploads/ryJ53FVZyl.png) ## Port > Review: SSH - 如果只有 IP 位址,若有不同的軟體要同時進行傳輸,所有的資料就會從同一個出口一起通過,會產生碰撞。 - 連接埠:讓同一台電腦擁有多個對外的出口,讓網路傳輸有多工的能力 - 每個 Port 對應到不同的網路 ### port 相關指令 * `cat /etc/services`:查看 port 的使用狀況 * `grep -w /etc/services`:查詢指定port ### 常見服務對應port ![image](https://hackmd.io/_uploads/ryyJ0K4-1x.png) ## Method in Transport layer ### UDP(User Datagram Protocol) - 僅提供傳輸基本功能,負責處裡封包要傳送到哪個 Port ![image](https://hackmd.io/_uploads/B1sTLJF-Jg.png) - 追求即時性且能容忍一些封包丟失的情況(盡力傳遞) - 串流服務、視訊、音訊 ![image](https://hackmd.io/_uploads/SkCeYaVQT.png) --- ### TCP - 可靠的傳輸方式—>保障資料完整性 - 連線導向 (Connection-Oriented):傳輸資料前先建立連線,協調參數(用於資料確認與重送、流量控制) > 利用三項交握建立連線 - 資料確認與重送:確認目的端是否收到已送出的資料 - 流量控制:視情況調整資料傳輸的狀況,盡量減少資料的流失 >利用滑動視窗(Sliding Window) #### Three-way Open ![image](https://hackmd.io/_uploads/H1YbyiVbJe.png) | SYN | SYN, ACK | | -------- | -------- | | ![image](https://hackmd.io/_uploads/BJ-ogoNWkg.png) | ![image](https://hackmd.io/_uploads/Bkihlo4Z1g.png) | ![image](https://hackmd.io/_uploads/HkjqoX77p.png) #### 資料確認與重送 - A 傳送 packet1 給 B - B 回應 ACK 封包給 A - 如果A在時間內沒有收到B的ACK封包A就會重新傳送 packet 給 B | SYN | SYN, ACK | | -------- | -------- | | ![image](https://hackmd.io/_uploads/BJ-ogoNWkg.png) | ![image](https://hackmd.io/_uploads/Bkihlo4Z1g.png) | 以這張圖為例,我發送了一個封包序號為 801223437 的封包,LSA server 收到後會回應 801223438 也就是 801223437+1,表示 801223438 之前的資料都收到了。 假設今天這個封包在傳輸過程遺失了,我們過了一段時間都沒有收到來自 LSA server 回傳的 Ack. Number = Seq. Number+1,我們就可以知道資料遺失,進而重新傳送資料,完成可靠性的通訊。 #### TCP Header ![image](https://hackmd.io/_uploads/rJuLsS_L6.png) - SourcePort(來源埠號): 長度為 16 bits,用來記錄來源主機的 port - DestinationPort(目的埠號): 長度為 16 bits,用來紀錄目的主機的 port - SequenceNumber(序列號): 長度為 32 bits,用來記錄每個封包的序號。當 TCP 資料太大時(大於 IP 封包的容許程度)就必須進行分段,利用 Sequence Number 讓接收端組合資料 - AcknowledgmentNumber(確認號): 長度為 32 bits,接收端確定之前傳遞的封包已被正確收下 :::spoiler Code (Control Flags, 控制標誌碼): 長度 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表示傳送結束,通知對方資料傳輸完畢,是否同意斷線。發送者還在連線中等待對方回應。 ::: :::spoiler 其他 - Window(視窗大小): 代表「接受視窗」(receive window) 的大小,用來控制封包流量,告訴對方目前本身還有多少緩衝器(Receive Buffer)可以接收封包。 - Checksum(檢查碼): 確定所收封包是否在傳輸過程中出現錯誤 - UrgentPoint(緊急資料指標): 指出緊急資料在 TCP 資料的哪裡 ex. Urgent Pointer = 3 :arrow_right: TCP 資料的 0~3 個 bytes 是緊急資料 ::: #### Closing ![image](https://hackmd.io/_uploads/S1Z5jbcMC.png) --- :::info ### TCP/UDP 比較 | | TCP | UDP | | ------- | ----------- | ----- | | 可靠性 | 可靠 | 不可靠 | | 封包確認 | ACK | - | | 速度 | 慢 | 快 | | 傳輸方式 | 封包按順序傳輸 | 封包以串流方式傳輸 | | 錯誤檢查與修正 | 有 | 無 | | 逾時處理 | 逾時重傳、高速重傳(指定封包) | 逾時重傳(全部封包) | | 雍塞控制 | 有 | 無 | | 適用服務 | **要求可靠運輸的服務**, ex :SSH、文字聊天、電子郵件、檔案傳輸...等不能漏缺資訊的服務 | **講求速度的即時服務** ex: 串流媒體、網路電話 | ::: --- # Application Layer ## HTTP(Hyper Transfer Protocol ,超文本傳輸協定) - 全球資訊網(www)的網路通訊的基礎 - 用於網頁前後端溝通,瀏覽器向伺服器發送請求,伺服器回傳相應的資料 ![](https://hackmd.io/_uploads/HJ5ab5HQp.jpg) :::info HTTP Request Method - Get: - 較 post 不安全 - 訊息會顯示在head,body 不傳資料 - 傳遞的參數會在URL上顯示 - 流程: - 瀏覽器發出Get請求,只產生一個TCP封包 - 伺服器回應200 ,表示請求成功,同時返回資料 - Post: - 較Get安全 - 將參數放至body中再發送request - 不會在 URL 看到參數,適合用於隱密性較高的資料, EX: 登入的帳號、密碼等 - 流程: - 瀏覽器發送 Get 請求,只產生一個 TCP 封包 - 伺服器回應 200 ,表示請求成功,同時返回資料 - Put:新增一項資料,如果存在就覆蓋過去(維持一筆資料) - Patch:附加新的資料在已經存在的資料後面(資料必須已存在) - Delete:刪除資料 - Head:只會取得 HTTP header 的資料 - Option:可以了解 server 提供哪些溝通方法 ::: ## 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/H1vDkL_UT.png) :::info ### 樹狀階層式架構 ![image](https://hackmd.io/_uploads/Hy2klPOLp.png) 如何查找DNS ![](https://hackmd.io/_uploads/r1eOJPP8p.png) - `/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 server ::: ## FTP(File Transfer Protocol) - 用於檔案傳輸,將共享檔案存放在 FTP Server,讓一般使用者可以透過網路來下載或上傳。他的重點是在異質性電腦之間、以及遠距離的檔案共享使用 - Client-Server 模型 - FTP Server:提供檔案的 Server 端。 - FTP Client:透過 FTP 連接到 Server ,執行上傳或下載操作的 Client 裝置 - 20 port:傳遞資料 - 用於實際的檔案資料傳輸(下載或上傳檔案) - 21 port:傳輸流程控制 - 進行身分驗證,輸入帳號、密碼等指令 :::info Active MODE - 由 Server ==主動==向 Client 發起傳送資料請求 - ![image](https://hackmd.io/_uploads/rkLs-8uI6.png) 1. Client 透過 Command Port (1026)向 Server 的 Command Port (通常是 21 )發送連線請求,同時告知 Server 自己的 Data Port 是 1027 (N+I) 2. Server 同一個 ACK 到 Client 的 Command Port(通常是21) 發送連線請求,同時告知 Server 自己的 Data 是1027(N+1) 3. Server 從自己的 Data Port (20) 向 Client 在 Step 1 指定的 Data Port ( 1027 )建立連線 4. **當連線建立成功後**, 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 喔」 ![image](https://hackmd.io/_uploads/B1iSELOUT.png) 1. Client 主動跟 Server 連線後,告訴 Server 使用passive mode 2. Sever 回 ACK 並告訴 Client 自己開了一個 Data port(2024) 3. Client 主動跟剛才 Server 指定的 data port 連線 4. 最後 Server 回一個 ACK 給 Client 的 data port ::: ## HTTP 協定版本 ### HTTP 1.0 - 簡單的文本設定 - ==無==連線持續性(keep-alive) - 單一請求-回應模型,每個請求都需要建立新的連線,完成後即斷開 - 浪費頻寬、時間延遲 - 單路徑傳輸,一次只能處理一個請求 - 狀態碼 - HTTP 1.0主要使用標頭中的 If-Modified-Since 和 Expires 來做為暫存的判斷標準 ### HTTP 1.1 - 連線持續性(keep-alive) - 可以使用同一個 TCP 連接來重複多個 HTTP 請求,預設 keep-alive,避免重新建立連線 - 管道化 - 允許在同一連接上平行發送多個請求,但回應還是按照請求的順序返回 - 狀態碼 100 (Continue) - 引入了狀態碼 100,改善了 client 端發送 Request 的模式,避免不必要的頻寬浪費 - 更多請求方法 - 新增了 PUT、PATCH、DELETE、CONNECT、TRACE 和 OPTIONS 等請求方法 - Host 標頭 - 支援多虛擬主機,使用Host標頭字段指定伺服器的域名 - > 現在在一台伺服器上可以存在多個虛擬主機,並且會共享同一個 IP。所以加上 Host ID 之後,就可以將請求發往同一台伺服器上的不同網站。 - 快取 - 引入更多的暫存功能,例如 Etag、If-Modified-Since...,透過這些可以最佳化暫存的效率。 ### HTTP2/SPDY **SP**ee**DY** - 加快網頁載入速度,減少延遲 ![image](https://hackmd.io/_uploads/H1kZOIdIa.png) - 二進制協定 - HTTP/2 將資料轉換為二進制格式,而不再使用向 HTTP/1 那樣的文本格式,使得資料傳輸更加高效。 - Request multiplexing - 允許在同一個連接上平行交換多個請求和回應,避免了在 HTTP 中的「頭部阻塞 (head-of-line blocking, HOL)」的問題。 - > 如果有任一個請求要操作很久或封包流失,那就會阻塞整個 pipeline 的工作。 - Header 壓縮 - 使用 HPACK 壓縮標頭,減少了傳輸的大小。 - 優先請求順序 - 每個請求都有唯一的編號,並可以指定優先級,伺服器可以根據優先級進行回應,提高效能。 - Server Push - server 可以在 client 端需要之前主動推送資源,加快網頁載入速度。 ### HTTP3/QUIC :::info ### QUIC - **Q**uick **U**DP **I**nternet **C**onnection - **連線建立(Connection Establishment)** ![image](https://hackmd.io/_uploads/SJ4ytLdUT.png) - **多路複用(Multiplexing)** > TCP 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 識別連線,確保封包正確接收 ![image](https://hackmd.io/_uploads/SyE-KLO8a.png) ::: ## Demo :::success #### 使用telnet上網 - 沒有指定 host :arrow_right: 預設頁面 ```= telnet ammon.bluet.org 80 GET / HTTP/1.0 ``` ```= <head><title>BlueT.org Studio</title></head> ``` ![image](https://hackmd.io/_uploads/S1eH2BDIp.png) - 更改 host ```= telnet ammon.bluet.org 80 GET / HTTP/1.0 Host: studio.bluet.org ``` ```= Moved Permanently Location: https://Studio.BlueT.org ``` ![](https://hackmd.io/_uploads/SkmnnrPLp.png)

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    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

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully