NCNU-OpenSource
      • 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
        • Owners
        • Signed-in users
        • Everyone
        Owners Signed-in users Everyone
      • Write
        • Owners
        • Signed-in users
        • Everyone
        Owners 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
    • 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 Help
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
Owners
  • Owners
  • Signed-in users
  • Everyone
Owners Signed-in users Everyone
Write
Owners
  • Owners
  • Signed-in users
  • Everyone
Owners 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
    # 網路基礎 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)

    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