###### tags: `LSA2` `網路` `1112` # Network - Book mode: https://hackmd.io/@ncnu-opensource/book [TOC] ## 介紹 TCP/IP - 為了進行有效的通訊,協定是必須使用的,必須遵守這些規則,才能成功傳遞訊息 - 如果某家製造商沒有遵守協定,裝置就有可能無法通訊 -  - 由很多不同協定所組成的模型 - 情境 (小明要用紙條約小睿看電影) -  -  -  -  - 總結 -  -  ## Link Layer  - **同一網域主機的連接處理** - 學校的某一個班級中,人與人的溝通模式 - 為**直接**透過網路硬體裝置連接的電腦(子網路),建立相互通訊的連線,但不能透過轉送的方式跨越至其他網路(網際網路)。 - 言簡意賅的說法就是負責在相鄰的兩個網路節點之間傳輸數據。 - 在這裡設立了**幀 Frame** 的概念(又稱訊框),是 Link Layer 的傳送單位 ### 常見連接方式 | 網路 | 標準 | 功能 | 傳輸媒介 | 碰撞處理 | |-|-|-|-|-| | Ethernet 乙太網路 | 802.3 | 區域網路連線上的通信協定 | 雙絞線 | CSMA/CD | | Wi-Fi 無線網路| 802.11 | 無線區域網路的電腦通訊標準 | 5GHz / 2.4GHz 無線電波 | CSMA/CA | > [form_Reference](https://hackmd.io/@Alanjy-Huang/ryARVogrj#Ethernet-vs-Wi-Fi) > 網路傳輸皆是使用 Digital 數位訊號傳遞喔  > [圖片來源](https://www.google.com/url?sa=i&url=https%3A%2F%2Flearn.sparkfun.com%2Ftutorials%2Flogicblocks--digital-logic-introduction%2Fwhat-is-digital-logic&psig=AOvVaw3_nBrA_cIQquTgt6Ii3tjT&ust=1678258841171000&source=images&cd=vfe&ved=0CBEQjhxqFwoTCOiqsNKfyf0CFQAAAAAdAAAAABAD) ### Ethernet Frame(根據其他的協定而有不同的 frame)  > 在班上同學與同學之間溝通的格式 > 風和日麗的一天,Ray 要跟 Wally 講一件很重要的事 - **Preamble 前導碼 :** 在數據傳輸開始之前,發送方會先發送一個固定長度的前導碼,此 56 位元的前導碼為 0 與 1 交錯,當接收方收到連續的 0 與 1 ,就會知道傳輸即將發生,此外也會根據 0 與 1 的變化速度,讓接收方可以同步數據傳輸時序。 > Ray 跟 Wally 說:我要講重要的事了喔,你要開始適應我的語速,跟上我的速度喔 - **SFD :** 全名Start Frame Delimeter,目的為區隔 Preamble 與接下來的內容,表示傳輸即將開始。 > Ray : 調整完了齁,我要開始講重要的事了 - **Destination/Source Address :** 分別為接收方與發送方的地址,各 48 Bits,以 MAC Address 表示。 > 確認誰是 Ray 要傳遞對象 - **Length or Type :** 如果該欄位的值小於或等於 1500,則表示這是一個長度字段,指示了 Frame 的長度;如果該欄位的值大於 1500,則表示這是一個類型字段,指示了 Frame 中所包含的協議類型。 > 先聲明 Ray 要講什麼類型的事情 - **Data :** Frame 中實際傳輸的數據部分,大小在 46 Bits與 1500 Bits之間,如有超過這個長度就會拆成另一幀。 > Ray : LSA 是堂優質課程欸,要不要一起修 - **Frame Check Sequence :** 這是一個固定長度的校驗碼,用於檢測 Frame 中數據的錯誤。 > Ray : Wally 我剛剛講的東西有任何錯誤嗎?還是有哪裡沒聽到的 > Ethernet Frame 中,位元最長為 1518 Bits,最短為 64 Bits。 > [Frame_Reference](https://hackmd.io/@0xff07/BJUwIm5XF) ### MAC Address (Media Access Control Address) - 一張網卡,一個 MAC Address - 在一個班級中,一個座號只會有一位學生使用,但如果在其他班就可能會有一樣的號碼 - 在班上傳紙條只需要知道我要傳給幾號(MAC Address) - 要傳給其他班的時候可能需要知道對方的學號才能傳遞 (IP Address) - 以 Hexadecimal 表示 -  - Size: 6 Bytes (48 Bits) - 第 1 bit 為單播位址 Unicast (0) / 群播位址 Multicast (1) - 第 2 bit 為廣域位址(0) / 區域位址(1) - **例外:** 當每一個 bit 為 1 時 (FF:FF:FF:FF:FF:FF),則為 Broadcast 廣播位址  #### Organizationally unique identifier (OUI) 組織唯一標識符 - 用於唯一標識一個供應商、製造商或其他組織,由供應商至 IEEE 的註冊機構購買 - 即第 3~24 Bit 由 IEEE 決定 #### Network Interface Controller (NIC) 網路卡 - 由第 2 bit 決定管理者 - **Global Unique:** 由 OUI 擁有者(即實際生產該網路裝置的廠商)自行決定後 24 Bits - **Locally Administered:** 網管可自行決定 24 Bits  > [MAC_Addr_Reference 1](http://lirobo.blogspot.com/2015/09/mac-address.html) > [MAC_Addr_Reference 2](https://techaccess.in/2021/05/16/unicast-multicast-and-broadcast-mac-address/) > [OUI_Reference](https://zh.wikipedia.org/zh-tw/组织唯一标识符) ### CSMA / CD (Carrier Sense Multiple Access with Collision Detection) - 碰撞偵測處理 - 用於容易偵測碰撞的網路環境 (Ex. 乙太網路) #### 傳送步驟 1. 訊號採用廣播的方式傳送(所以才會發生碰撞) 2. 當節點要發送訊號時,會先偵測通道是否有其他節點正在使用(carrier sense) 3. 當通道沒有被其他節點使用時,就傳送封包 4. 封包傳送之後立即檢查是否發生碰撞(carrier detection),若是發生碰撞則對通道發出高頻訊號告知其他節點已經發生碰撞 5. 碰撞後隨機等待一段時間重新發送封包 6. 嘗試 15 次都失敗的話則告知上層 Timeout  > [Diagram_Reference](https://hackmd.io/@Alanjy-Huang/ryARVogrj#CSMACD-Carrier-Sense-Multiple-Access--Collision-Detection) > [CSMA/CD_Reference](https://blog.toright.com/posts/1243/csmacd-與-csmaca-之間的差異.html) ### CSMA / CA (Carrier Sense Multiple Access with Collision Avoidance) - 碰撞避免處理 - 多用在無法避免碰撞的環境 (Ex. WiFi) - 因為在無線的環境下無法確實偵測是否有碰撞,且無線的環境容易受到無線電波、宇宙射線 ... blablabla 的干擾 - 所以在無線的環境下從偵測碰撞修改成避免碰撞 (CSMA / CA) 的方式 #### 傳送步驟 1. 訊號採用廣播的方式傳送(非常容易受到無線電波干擾) 2. 當節點要發送訊號時偵測頻道是否空閒 3. 若是空閒則等待 Interval Frame Space ( IFS ) 時間後再次偵測頻道是否空閒 > Interval Frame Space: 傳送一 Frame 的時間 4. 若是空閒則發送 RTS,反之重新進入等待頻道空閒(隨機等待時間) 5. 發送 RTS 之後必須在限定時間內收到來至目的端的 CTS 訊號 6. 收到 CTS 後才發送封包 7. 當失敗 32 次之後通知上層 Timeout  > [CSMA/CA_Reference](https://blog.toright.com/posts/1243/csmacd-與-csmaca-之間的差異.html) :::info ### Appendix - Request to send / Clear to send - RTS / CTS - 送真的封包之前,先發送 RTS 封包,此封包不只有接收者會收到,發送者傳輸範圍內的其他裝置也會收到。 > 一樣又是風和日麗的一天,Ray 又要跟 Wally 說重要的事 > 今天雖然一樣在班上,但環境是無線的環境 > Ray 大喊 : Wally 你聽得到我說話嗎? (發送 RTS) - 接收者順利收到之後,則必須廣播一個 CTS 封包,代表已經準備好接收封包 - 在發送 CTS 之後,聽到 CTS 的節點,在一段足夠向發送者傳輸完訊息的時間內,都不能向發送者發送訊息。 > Wally 大喊回覆 : 我有聽到,其他人惦惦啦不要跟我說話 (發送 CTS) > [Ref](https://hackmd.io/@0xff07/SJO5VTpmY#RTSCTS) ::: ### Connecting Device - Hub - 以 Broadcast 方式進行傳輸 - 假設 A Node 要傳輸資料給 D Node ,每個 Node 都會收到 - 當 C Node 要傳輸資料時,就會發生碰撞 - 這樣的方式不僅不安全,且還要處理碰撞,所以 Hub 已經很少人在使用 - 半雙工 (half - duplex) - 全班都在講話很吵雜,只會令人不爽,容易起衝突 -  > [Hub_Ref](https://notfalse.net/66/repeater-hub-bridge-switch#-Hub)  - Switch - 全雙工(full-duplex) - 有一個表 (Table) 可以學習、儲存紀錄每台電腦的MAC位址 > 找不到再 Broadcast - 每個 port 是獨立的,並且分割碰撞網域 (不用擔心碰撞問題) - 可視為是 硬體 + ROM (table) -  -  > [Switch_Reference](https://home.gamer.com.tw/creationDetail.php?sn=4247878) - Switch 步驟 - 某一網段 A 的某電腦 X 要發送一封包給 Y ,發送時 Switch 記下了 X 電腦的 MAC Address 在網段 A 。 - Switch 不知道 Y 在哪裏,所以向所有網段轉發封包 (除了 A 以外) - MAC Address Y 的電腦收到該封包,向 MAC Address X 發出確認包。Switch 收到該包後,記錄下 MAC Address Y 所在的網段。 - Switch 向 MAC Address X 轉發確認包。 - Switch 收到一個封包,查表後發現該封包的來源位址與目的位址屬於同一網段。Switch 將不處理該封包。 > Q : 那同網段的封包不知道 MAC Address 要怎麼做處理呢? > A : 可以利用 ARP 的技術處理喔 > [Step_REF](https://zh.wikipedia.org/zh-tw/網路交換器) :::info ### Appendix-全雙工/半雙工/單工 #### 單工 - 資料流只能單向傳送,我從 A 主機 a port 送出,client B 負責接收。A主機 a port 不負責接收資料。 #### 半雙工 - 不同時間,資料可以做雙向傳輸,但同一時間內只能做單向傳輸。(Ex. 無線電通訊) #### 全雙工 - 全雙工基本上就是同一時間內兩邊可以相互傳遞資料。(Ex. 電話通訊) > [Reference](https://sites.google.com/site/archerdevil/home/networking/dan-gong-ban-shuang-gong-yu-shuang-gong-chuan-shu) ::: ### LAN (Local Area Network) - 區域網路 - 是連接住宅、學校、實驗室、大學校園或辦公大樓等有限區域內計算機的計算機網路 - Ethernet 為 LAN 最普遍使用的一種技術 - 相關規範由 IEEE 訂定,收錄於 IEEE 802.3 標準中  > [LAN_Reference 1](https://hackmd.io/@Alanjy-Huang/ryARVogrj#LAN) > [LAN_Reference 2](https://zh.wikipedia.org/zh-tw/局域网) ### WAN (Wide Area Network) - 廣域網路 - 通常跨接很大的物理範圍,近則十幾公里,遠至幾千公里。 - 它能連接多個地區、城市和國家 - 常見於企業分公司,將這些分公司以專線的方式連接,就稱 WAN - 傳送介質主要是利用公共網路(例如:網路供應商預先埋在馬路下的線路、衛星網路、海底纜線 ... etc ),頻寬較容易受限制,不僅慢,因為維護不易,成本相對高,費用也較貴。 > 一般所指的網際網路是屬於一種公共型的廣域網路,公共型的廣域網路的成本會較低 ,但跟廣域網路比較來說,是沒辦法管理頻寬,走公共型網路系統,任何一段的頻寬都無法被保證。  > [WAN_REF](https://zh.wikipedia.org/zh-tw/广域网) > FIXME:走衛星網路呢?要定義!!而不是舉例 ------ ## Internet Layer  - **跨網域的傳輸** - 班級同學與班級同學之間的傳遞 - 有了網路介面層提供的 MAC 位址後,就可以知道要把資料傳輸到子網路內的哪台電腦,然而 MAC 位址只適用於子網路的通訊,單從 MAC 地址無法得知收件者的子網路為何,因此需要 IP 協定,透過 IP 位址即可知道該電腦屬於哪一個子網路。 - 將資料轉送到未直接連接的其他網路,而將封包轉送到指定的方向就稱作**路由(route)**。 - 最具代表性的協定為 **IP(Internet Protocol,網際網路通訊協定)**,此協定針對未直接連結的網路,提供封包路由機制,為任意的電腦端點建立通訊連線。 - **ICMP(Internet Control Message Protocol,網際網路控制訊息協定)**,用來輔助 IP 協定,能偵測資料是否被送達任意端點,若否,則發送失敗通知。 > [Ref](https://pjchender.dev/internet/internet-tcp-ip-1/) ### IP Address - 每個人在學校中都會有屬於自己的學號且不重複,畢業後十年學號是可能會再被釋出的(部分學校適用) - 把學校比擬成網際網路的話,IP 位置就跟學號一樣在同一時間是不能重複的 #### IPv4  - Since 1981 - 32 Bits,8 Bits 一組,組跟組之間有一個 Dot 來做區隔,由 Decimal 表示 - 目前最廣泛使用的版本 - 目前 IPv4 已經快被用完了,因此有了 IPv6 - 其中 IP 的結構包含:**網路號碼 (Network number)** & **主機號碼(Host number)** - 一般主機的 Host ID 不會出現全 0 或全 1 的狀況 - **全 0 :** 表示網段的位置 (網域) - **全 1 :** 表示廣播的位置 #### IPv6  - Since 1995 - 128 Bits,並由 Hexadecimal 表示 - 因應 IPv4 快被用完,因此成為未來趨勢 #### 一些常見特殊 IP Address (保留位址) - **全部為 0 保留特殊使用 :** `0.0.0.0` > 1. 當在自己電腦上配置IP位址為0.0.0.0的時候,表示這台機器在網絡上是不可達的。 > 比如你的筆記本電腦在沒有聯網的時候 > 2. (配置在軟體的配置文件) > 很多伺服器都是有雙網卡的,比如其中一個網卡的IP地址為`192.168.32.10`另一塊網卡的IP地址是`192.168.45.30`。 > 如果配置成`0.0.0.0`表示無論你從哪個IP地址訪問這個服務都是OK的 > [REF1](https://kknews.cc/tech/6gkgnb3.html) - **Net ID 為 127 時 :** `127.0.0.0` > Loopback Address > 迴繞地址、繞回地址、環回地址,都是一樣的意思 > 以`127.0.0.0`作為回繞位址,`127.0.0.1`表示主機位址,主要作為測試網路使用 (Loopback Testing)。 - **IP 位址全部為 1 時:** `255.255.255.255` > Broadcast Address > 對所有主機的廣播位址 - [REF2](http://www.tsnien.idv.tw/Manager_WebBook/chap4/4-3%20IP%20協定概述.html) ### Subnet Mask (子網路遮罩) - Net_ID 全部位元為 1 ,Host_ID 全部位元為 0 時 :::info ### Appendix - IP Address 分級  > 現在幾乎不會用這種分級 - **Class A:** 以最高位元(第 31 位元)為 0 表示 Class A 模式。前一位元組(8 位元)表示網路位址;而後 24 位元表示主機位址。Class A 級的 IP 範圍: `0.0.0.0` ~ `127.0.0.0` ,通常比較大型的組織或政府機構才有辦法拿到 Class A 級的IP,Netmask = `255.0.0.0` - **Class B:** 以二個最高位元為 10 表示 Class B 模式。前 16 位元表示網路位址;而後 16 位元表示主機位址。Class B級的IP範圍: `128.0.0.0` ~ `191.255.0.0`。通常適用於中型企業,Netmask = `255.255.0.0` - **Class C:** 以前三個最高位元為 110 表示 Class C 模式。前 24 位元是網路位址;而後 8 位元為主機位址,Class C級的IP範圍: `192.0.0.0` ~ `223.255.255.0`。通常用於家庭與小型企業,Netmask = `255.255.255.0` - **Class D:** 以前四個位元為 1110 表示 Class D 模式。其主要應用於多點廣播(Multicast),一些特殊應用軟體皆用此模式,來對某些定點(工作站)廣播,如隨選視訊(VOD)就用此定址模式,對若干個定點工作站廣播視訊。 - **Class E:** 以前四個最高位元為 1111 表示 Class E 模式。目前保留尚未使用。 > [IP_Class REF1](https://notes.andywu.tw/2018/ip等級與子網路遮罩介紹/#class-b) > [IP_Class REF2](http://www.tsnien.idv.tw/Manager_WebBook/chap4/4-3%20IP%20協定概述.html) ::: - 統整 - Class A: `255.0.0.0` - Class B: `255.255.0.0` - Class C: `255.255.255.0` #### 求一網段之至多分配主機數 - 以 Class C 為例 `255.255.255.0` - 換算 Binary => `11111111.11111111.111111111.00000000` - 前 24 Bits Net ID 不管它,後面 Host ID 共 8 Bits - `2 ** 8 - 3 = 253` - 共 253 台,扣 3 為廣播位址、網段位址及 Gateway #### 如何求 Net ID (Network Number) 、 Host ID (Host Number) 與 Broadcast IP - 將 IP 位址與 Netmask 整個加在一起做 AND 運算,即可求得 Net ID - 將 Netmask 做 NOT 運算後,再與 IP 位址做 AND 運算,即可求得 Host ID - 將 Netmask 做 NOT 運算後,再與 IP 位址(或是 Net ID )做 OR 運算,即可求得 Broadcast IP > 記得要先換成 Binary 才能進行運算喔 (廢話) > 你說你聽不懂?下面實際計算一次就知道了 > 首先先看懂 Truth Table :::info ### Appendix - Truth table - AND | A | B |A∧B| | - | - | - | | 0 | 0 | 0| | 0 | 1 | 0| | 1 | 0 | 0| | 1 | 1 | 1| - OR | A | B |A∨B| | - | - | - | | 0 | 0 | 0| | 0 | 1 | 1| | 1 | 0 | 1| | 1 | 1 | 1| - NOT | A | A' | | - | - | | 0 | 1 | | 1 | 0 | ::: > fixme : 下面有個地方寫錯了 :::success #### 有一 IP Address: `3.4.5.6` 為 Class A ,請問他的 Net ID、Host ID 以及 Broadcast IP 為何? |Process|3.4.5.6| |-|-| |Binary|`00000011.00000100.00000101.00000110`| |Netmask|`11111111.11111111.11111111.00000000`| |AND|-----------------------------------------| |Net ID|`00000011.00000100.00000101.00000000`| - Net ID: `3.4.5.0` |Process|3.4.5.6| |-|-| |Binary|`00000011.00000100.00000101.00000110`| |Netmask'|`00000000.00000000.00000000.11111111`| |AND|-----------------------------------------| |Host ID|`00000000.00000000.00000000.00000110`| - Host ID: `0.0.0.6` |Process|3.4.5.6| |-|-| |Net ID|`00000011.00000100.00000101.00000000`| |Netmask'|`00000000.00000000.00000000.11111111`| |OR|-----------------------------------------| |Broadcast IP|`00000011.00000100.00000101.11111111`| - Broadcast IP: `3.4.5.255` ----- #### 有一 IP Address: `111.123.121.145/20` ,請問他的 Net ID、Broadcast IP 以及此網段可分配之主機數? > 指令 `ip a` 可得知 `X.X.X.X/X` 表示方式的 IP Address - **斜線後的數字為Netmask 有幾個 Bits** - 20 Bits => `11111111.11111111.11110000.00000000` |Process|111.123.121.145| |-|-| |Binary|`01101111.01111011.01111001.10010001`| |Netmask|`11111111.11111111.11110000.00000000`| |AND|-----------------------------------------| |Net ID|`01101111.01111011.01110000.00000000`| - Net ID: `111.123.112.0` |Process|111.123.121.145| |-|-| |Net ID|`01101111.01111011.01110000.00000000`| |Netmask'|`00000000.00000000.00001111.11111111`| |OR|-----------------------------------------| |Broadcast IP|`01101111.01111011.01111111.11111111`| - Broadcast IP: `111.123.127.255` - 可用主機數: `2 ** 12 - 3 = 4093 台` ----- #### 實際演練時間 #### 有一 IP Address: `87.200.79.179/27` ,請問他的 Net ID、Broadcast IP 以及此網段可分配之主機數? ::: #### ANSWER :::spoiler - 27 Bits => `11111111.11111111.11111111.11100000` |Process|87.200.79.179| |-|-| |Binary|`01010111.11001000.01001111.10110011`| |Netmask|`11111111.11111111.11111111.11100000`| |AND|-----------------------------------------| |Net ID|`01010111.11001000.01001111.10100000`| - Net ID: `87.200.79.160` |Process|111.123.121.145| |-|-| |Net ID|`01010111.11001000.01001111.10100000`| |Netmask'|`00000000.00000000.00000000.00011111`| |OR|-----------------------------------------| |Broadcast IP|`01010111.11001000.01001111.10111111`| - Broadcast IP: `87.200.79.191` - 可用主機數: `2 ** 5 - 3 = 29 台` ::: ### Router  > [Ref](https://www.pcnet.idv.tw/pcnet/network/network_ip_routing.htm) - 傳輸資料步驟 > Ray 今天要拿一個公文給 Wally,先查看他的學號 1. 看封包目標 IP 位置。 2. 查看自己主機的 Net_ID 是否與封包的相同(屬於同區網),若相同可以直接傳給目的主機。 > Ray 先看他是不是同一個系所的,如果是就可以直接在班上給他 4. 若不同,查詢 Router (default gateway), 並傳給它。 > 如果不是,Ray 再去找負責送公文的工讀生 6. 不理會封包流向,Router (default gatway) 會執行上述動作繼續往目的地傳送。 > 之後工讀生就會幫忙送,所以 Ray 就不必太擔心 > [Ref](https://hackmd.io/@ncnu-opensource/book/https%3A%2F%2Fhackmd.io%2Fivcr8d6lT2WBM5wZOYUyIQ) :::info ### Appendix - 查看 routing Table - **routing table:** 路由表,用來指引方向 - **iptables:** 讓 router 知道哪些要進來,哪些要擋掉,哪些要特殊處理 (下週會提到喔) - `route -n` 以主機 IP 顯示  - 不知道目的地? Default 就是你的目的地 (紅色框框) - 知道目的地就往指定的 Interface - `sudo ip route add [Address] via [Gateway] dev [Interface]` - 可使用指令加入 Table  - `sudo ip route delete [Address]` - 指定該網段從 Table 刪除  > [Ref](https://ithelp.ithome.com.tw/articles/10235018) ::: ### ICMP (lnternet Control Message Protocol) - 網際網路控制訊息協定 - 光靠 IP 傳輸是很不可靠的,我們不知道是否能夠順利安全送達目的地。 > Ray 因個人因素轉系了,Wally 很想念他,想要問他近來如何,所以試著向他傳送紙條封包給 Ray > Ray 因為太忙碌離不開實驗室,所以 Wally 拜託友人 Router A 幫忙 - **障礙通知:** 當 IP 封包傳送當中,在某一網路上發生問題而無法繼續傳送,則會回應 ICMP 訊息給原封包傳送端。訊號_1是由 Router_A 回應;或是由 Router_B 回應訊號_2;也有可能是由主機 B 回應訊號_3。 > Router A 又再請了 Router B 幫忙,不料 Router B 在從管院走到科三的路上,風直接把紙條封包吹走了 > Router B 見狀趕緊發送 ICMP 通知 Wally,並告知他傳送失敗的原因  - **狀況查詢:** 可以發送 ICMP 來查詢目前網路的情況。主機 A 發送 ICMP 查詢訊息,有可能由路由器回應(訊號_1 和 訊號_2),或由主機 B 回應訊號_3。 > Wally 這次又怕紙條被吹走,所以他一直想辦法跟 Router A 確認進度以及傳送速度 > 最後他選擇發送 ICMP 查詢,最後也有得到 Ray 的 ICMP 回覆,確認已經送到手上以及花費的時間,真是可喜可賀  - ICMP 封包無法直接傳送,必須如同 TCP 封包一樣被嵌入 IP 封包內,以 IP 方式傳送,包裝在 IP 內的封包格式  - **回聲要求(Echo Request):** 用來要求對方回聲,如有回聲表示對方主機或路由器工作正常,也可以用來測試網路路徑是否確實可以到達。 :::info ### Appendix - 常見 ICMP 應用 #### 指令:`ping [Address]`  - `Time_To_Live` (TTL) : 生存時間,每過一個路由器,生存時間就會 -1 ,直到等於 0 都還沒走到目的地地址則代表 TTL 已經到期,接著就會傳送錯誤訊息給原本發送的電腦,TTL 的值越大越好,代表經過的路由器越少,也代表越快。 - 每台電腦預設的 TTL 都不同,像是 MacOS 大多預設為 64,可自行修改 - `ping 127.0.0.1` 可以看得出自己的 TTL >記得 `Ctrl + C` 結束掉 ping command #### 指令:`traceroute [Address]` - 跟著封包去旅行,查看封包經過了哪些節點 > 非內建請先安裝  ##### 運作模式 - 輸入此指令按下 Enter 鍵後,電腦先發送一個 `TTL = 1` 的封包,到達第一個 Router 時,他會回傳一個 Timeout 封包通知電腦, 而後再發送 `TTL = 2` 的封包,遇到第二個 Router 時再回傳 Timeout 封包,以此類推,一直讓 `TTL += 1`,就可以得知到達目的地之前所有經過的節點。 ::: > [Ref1](http://www.tsnien.idv.tw/Internet_WebBook/chap5/5-4%20ICMP%20通訊協定.html) > [Ref2](https://ithelp.ithome.com.tw/articles/10239657) ### ARP (Address Resolution Protocol) / RARP (Reverse Address Resolution Protocol) - 位址解析協定 / 反向位址解析協定 - ARP 是被用來以 IP 位址查詢其相對應的網路實體位址(MAC 位址) > Ray 因為剛進入班上,不太了解大家,結果剛好遇到了一個失散多年的兄弟 > 但是他好像只知道他的學號,不知道他的座號  - 首先主機 A(163.15.2.1)的網際層(Internet Layer)發送出 ARP Request(查問 163.15.2.4)訊息給網路存取層(Network Access Layer) > 於是乎他在班上大喊,送出 ARP Request:163.15.2.4 你的座號是多少? - 網路存取層之 MAC 層(Ethernet 層)再將 ARP Request 訊息包裝在 Ethernet 訊框內,並廣播在網路上。 - 網路上(區域網路內)所有主機接收到廣播訊框再拆解訊框。 > 班上每個人都聽到 Ray 說的話,但聽到不是在叫自己就沒理他了 - 主機 C(163.15.2.4)的網際層收到 ARP Request 後,並由其中瞭解是詢問自己,便回應 ARP Reply(包含 Ethernet 位址) 給網路存取層,網路存取層再發送訊框給主機 A(163.15.2.1)。 > 他兄弟聽到了他的 Request,於是很開心的跟他講了他的座號 發送 ARP Reply 給 Ray - 其它主機也會收到 ARP Request 訊號,但皆判斷不是詢問自己而不予理會。 - **RARP** 主機電腦用自己硬體位址(MAC 位址)向伺服器詢問自己的 IP 位址 > 剛入班的 Ray 不知道自己的新學號  - 主機 A 為**動態主機組態伺服器**(Dynamic Host Configuration Protocol, DHCP),負責分配 IP 位址給網路上主機。 > 主機 A 為一名註冊組處理學號事宜的老師,也就是 DHCP 伺服器 - 電腦主機啟動時便要求 DHCP 伺服器分配一個 IP 位址,電腦主機關機時便釋放該 IP 位址,下次開機時再要求重新分配。 - 例如主機 C 啟動時立即在網路廣播(或傳送給 DHCP 伺服器) RARP Request(要求 IP 位址),主機 A 收到 RARP Request 並驗證其 Ethernet 位址是否可以給予 IP 位址,再回應 RARP Reply 給主機 C,其中攜帶對方的 IP 和 MAC 位址。 > 今天 Ray 決定直接去詢問該名老師,發送 RARP Request > 主機 A 想了想,直接給了他一張紙條 (RARP Reply),上面記載著 Ray 的學號與座號 - RARP 封包格式和 ARP 一樣。 > [Ref](http://www.tsnien.idv.tw/Network_WebBook/chap13/13-4%20ARP%20與%20RARP%20通訊協定.html) :::info ### Appendix - 查看 ARP Table - Ray 因為記性不好,所以問過的座號都存在 ARP Table, - `arp -n` 以 IP Address 查看 Table - `sudo arp -s [IP] [MAC]` 將資料寫入 Table - `sudo arp -d [IP]` 將指定資料刪除  ::: ----- ## Transport Layer -  - 網際網路層只確保封包交換設備之間的傳輸,並沒有提供一套機制來確保封包的傳輸 - 負責在兩個應用程式之間建立臨時通訊會談和傳送它們之間的資料 ### TCP(Transmission Control Protocol) - 《紙條保證傳得到通訊協定》 - 大部分的網路協定都是建立在TCP 上面 -  - `Sequence Number` : 紀錄封包序號,以便重組 ,也依據序號判斷封包是否被重複傳送 - `Acknowledge Number` : 當 client 端收到這個確認碼時,就能夠確定之前傳遞的封包已經被正確的收下 - `Data Offest` : 這是用來記錄表頭長度用的 - `Reserved` : 這是保留區間,暫時還沒被使用 - Control Flag 共有6個, 1 代表為啟動 - `URG` : 代表緊急封包,接收端立即處理 - 例如: 傳送端送出 [Ctrl-C] 的中斷訊息,當此訊息到達目的端後,目的端將會以最快速度處理此命令 - `ACK` : 回應封包 - 當傳送端送一個封包的時候,目的端如果有收到,就會向傳送端傳`ACK`代表有正確收到,如果傳送端沒有收到`ACK`的話,它會假設封包丟失,並在重送一個封包 - `PSH` : 要求對方立即將緩衝區資料交給應用層 - 例如: 像 Telnet 的協定,在使用端,每打一個字元,即使使用者尚未輸入 [ENTER] 鍵,就會立即傳送至接收端 - `RST` : 連線強制結束 - TCP 正常關閉連線是用四次揮手,但有些異常狀況可能無法做到,就需要 `RST` 1. 於對方連接時,對方的 port 不可用 2. 對方程式突然崩潰了,當 client 繼續傳訊息時,對方就會回應 `RST` 3. iptables 設定規則為 `reject` 時,也會回應 `RST` - `SYN` : 通知對方要求建立連線(TCP 連線) - `FIN` : 通知對方,資料已傳輸完畢,是否同意斷線 - `Window ` : 控制封包流量,Window=0 代表緩衝區滿了,應停止傳送 - `Checksum` : 一種計算方式,在傳輸過程中使用 `Checksum` 檢查封包的完整性,以確保封包在傳輸過程中沒有被損壞或篡改 - `Urgent Pointer` : 如果 `URG` 被設定為 1 時,那這裡就會指示出緊急資料所在位置 - 三向交握 - 情境 : -  >參考: https://ithelp.ithome.com.tw/articles/10280652 -  >來自: [wiki](https://zh.wikipedia.org/wiki/%E4%BC%A0%E8%BE%93%E6%8E%A7%E5%88%B6%E5%8D%8F%E8%AE%AE) - 四次揮手 - 情境 : -  >參考: https://ithelp.ithome.com.tw/articles/10280652 -  >來自: https://www.51cto.com/article/716299.html - 第二次揮手 : Server先回覆已收到終止連線的訊息,表示斷開連線的請求已經受理 - 第三次揮手 : Server向上層確認,還有沒有要向Client發訊息,沒有的話才會對Client回覆斷開連線 ### UDP(User Datagram Protocol) - 《快速寫紙條通訊協定》 - 盡力傳遞 - 沒有確認機制來保證資料是否正確的被接收 - 適合短封包(不用分段的封包) - 就不用考慮分段丟失的問題 - 講求的是傳輸速度 - 例如: 視訊 -  >來自:https://commons.wikimedia.org/wiki/File:UDP_header.png - `UDP Length` : UDP 頭部與資料的總長 - `UDP Checksum` : 用於校驗錯誤(可選的) ### TCP與UDP差異 | | TCP | UDP | | -------- | -------- | -------- | | 可靠性 | 可靠 | 不可靠 | | 速度 | 慢 |快 | | 傳輸方式 | 按順序傳輸 | 以串流方式傳輸 | | 壅塞控制 | 有 | 無 | | 確認 | 有 | 只有檢查碼 | | 適用服務 | 可靠傳輸的服務,例如電子郵件、網頁瀏覽、檔案傳輸 | 即時服務,例如串流媒體、網路電話、網路遊戲 | > 來自:https://nordvpn.com/zh-tw/blog/tcp-udp-bijiao/ - 壅塞控制: 確保網路上的流量不會超過網路的容量和負載能力,以防止網路壅塞和封包損失 - TCP 通過調整封包的傳輸速率來實現壅塞控制,當網路傳輸量增加時,TCP 會降低封包的傳輸速率 - UDP 可能就會出現 網路壅塞和封包丟失的情況 ### port - 知道對方電腦的ip,但要使用對方電腦的哪個服務,就需要 port > 舉例 : port 22 表示 SSH 的服務,當我們今天要連接到對方電腦的 ssh服務 - 每個port對應到不同的服務 - 就像一個郵局(IP位置),有不同的窗口(port)會執行不同的業務 - `cat /etc/services` : 查 port 的占用狀況 - `grep -w 80 /etc/services` : 查詢指定port -  :::info ### 常見的 port | port號 | 服務 | | -------- | -------- | | 21 | FTP,檔案傳輸協定的命令通道 | | 22 | SSH,較為安全的遠端連線伺服器 | | 23 | Telnet,早期的遠端連線伺服器軟體 | | 25 | SMTP,簡單郵件傳遞協定,用在作為 mail server 的埠口 | | 53 | DNS,用在作為名稱解析的領域名稱伺服器 | | 80 | WWW,全球資訊網伺服器 | | 110 | POP3,郵件收信協定 | | 443 | https,有安全加密機制的 WWW 伺服器 | ::: ## Application Layer  - 提供各種網路服務 ==執行在 TCP 協定上的協定== ### HTTP(Hypertext Transfer Protocol,超文本傳輸協定) - 當你在網路上看到一個網頁時,你的電腦需要向網站的伺服器發送一個請求,要求網站把這個網頁的資訊傳回你的電腦 - HTTP協定就是一個讓這樣的請求和回應能夠在網路上順利進行的規則,確保不同的電腦可以交換資料 - Client-Server架構 -  -  >來自:https://bytesofgigabytes.com/networking/how-http-request-and-response-works/ - Client(客人) 與 Sever(達美樂) 的關係只是一時的(可能會互換) #### HTTP的內容 -  >來自:https://developer.mozilla.org/en-US/docs/Web/HTTP/Messages ##### Requests 1. **Start Line** ``` POST / HTTP/1.1 ``` - `Method` : 請求的方法 - `Request target` : 請求的目標,通常是網址或者協議 - http的版本 :::info ### Method - 發送的 Request 根據不同的用途,有查詢、新增、修改或者是刪除,是為了讓 Server 能夠清楚辨別 request 的目的 - 從客戶端發出 Request時,通常會定義以下資訊,以預覽 Google 首頁為例 - 通常一個 Method 都會搭配一個 URL -  >取自:https://medium.com/pierceshih/%E7%AD%86%E8%A8%98-%E4%BD%95%E8%AC%82-http-%E5%82%B3%E8%BC%B8%E5%8D%94%E5%AE%9A-1d9b5be3fd24 - 假設今天要寄出一封信 - `GET`: 掛號的寄件方式 - `www.google.com` : 地址 - `Message Body` :信件內容 - 使用`GET`瀏覽網頁:`Message Body`為空 - 如果填寫表單,那client會送出資料,這筆資料會被送到server的資料庫 - 則使用`POST`方法將資料送進`Message Body`,提交給某個指定的 URL,進而建立資料或更新資料 #### 常見的 Method | Method | | | -------- | -------- | | GET | 讀取資料 | | POST | 新增資料 | | Patch | 修改資料 | | Put | 修改資料(若該筆資料不存在,則自動新增資料) | | DELETE | 刪除資料 | ::: 2. **HTTP headers** -  - `host` : server 的網址 - `Accept` : 要求服務端回應的文件型態 - `Content-Type` : 宣告遞送給對方的文件型態 - 例如:瀏覽器的表單 (FORM) 要提交表單內容給服務端程式 3. **Empty line** - 代表 HTTP headers 的內容已結束,後面可能有 body 資訊 4. **Body** - 這裡會帶有主要的溝通資訊內容 - 根據不同的 method而有所不同 - `GET`、`DELETE` 不會帶有 body - `POST`則會把資訊放入Body裡面 ##### Responses 1. **Start Line** ``` HTTP/1.1 403 Forbidden ``` - http的版本 - `Status Code` : 狀態碼 - `Status text` : 簡短說明 Status Code 是什麼意思 - Forbidden:禁止 :::info #### Status Code - 來告訴 client 這個 request 到底是成功還是失敗 - 按F12 可以看到狀態碼 -  ##### 常見的狀態碼 - `200` : 請求成功 - `404` : 請求失敗,找不到頁面 ##### 分成五類 - `1XX` : 收到請求,請求者繼續執行操作 - `2XX` : 操作被成功接受並處理 - `3XX` : 需進一步操作才能完成 - `4XX` : cleint端錯誤 - `5XX` : server端錯誤 ::: 2. **HTTP headers** -  - `Server` : 透過什麼webserver來回應 - `content-type` :定義回應格式,client端才會知道該如何打開訊息 3. **Empty line** 4. **Body** - 會帶著 server 要回傳給 client 的資料 - 通常會是程式碼檔案,渲染畫面給使用者看 ### FTP(File Transfer Protocol,檔案傳輸協定) - 當你需要從一個網站下載(上傳)一個檔案時,你可以使用 FTP 協定來建立與該網站的連接,然後將檔案下載(上傳)到你的電腦上 - FTP 協定是用來在網際網路上傳輸檔案的一種協定 -  - FTP Server : 提供給別人作上下傳服務 - FTP Client : 去抓檔案、傳檔案給別人 - 傳送時,程式會自動將檔案切成多個小塊,以便快速傳輸,之後再由接收端程式將切割過後的小塊重新組合 -  - 用戶端要求檔案,伺服器則提供檔案,因此建立連線需要用到兩條TCP連線 - 控制連線(port 21): 用來傳輸控制指令 - 隨時保持暢通 - 資料連線(port 20): 用來傳輸資料 - 只有在傳輸才會建立,傳送完就會中斷 1. FTP 檔案傳輸系統採用 Client-server ,FTP 伺服端隨時監視埠口 21(tcp/21)是否有連線要求。FTP 客戶端需要連線時,便由著名埠口 21 連結到 FTP 伺服器。 2. 伺服端同意連線後(驗證使用者名稱及密碼),便建立並保持著控制連線,以便隨時交換訊息,當需要傳輸檔案時,再建立資料連線,傳輸後立即釋放該資料連線,一般伺服端的資料連線都建立在埠口 20(20/tcp)。 3. 雙方透過資料連線來存取各自檔案系統(File System)中的檔案。 >來自: https://hackmd.io/@ncnu-opensource/book/https%3A%2F%2Fhackmd.io%2F%40Alanjy-Huang%2FryARVogrj ==執行在 UDP 協定上的協定== ### DHCP(Dynamic Host Configuration Protocol,動態主機組態協定) - 當你連接到一個新的 Wi-Fi 網路時,你的裝置需要一個 IP 位址才能夠在網路上通訊 - 如果沒有 DHCP 協定,你需要手動設定 IP 位址和其他網路相關的設定,非常麻煩 - 但是有了 DHCP 協定,你的裝置可以自動向網路中的 DHCP 伺服器發送請求,然後獲取所需的 IP 位址和其他設定 - 當今天有100部電腦需要設置? - 藉由一部主機來自動的分配所有的網路參數給所有電腦 - 提供用戶端電腦動態的 IP 位址、子網路遮罩、預設閘道器與 DNS 的位址等 - 減少用戶手動設定 IP 位址的麻煩 -  -  >來自:https://www.stockfeel.com.tw/dhcp%E4%BC%BA%E6%9C%8D%E5%99%A8%E6%98%AF%E4%BB%80%E9%BA%BC%EF%BC%9F%E5%A6%82%E4%BD%95%E9%81%8B%E7%94%A8%EF%BC%9F/#p-2 - a : 用戶端電腦發出廣播封包到整個子網路,向負責這個子網路的 DHCP 伺服器要求 IP 位址來連接網路 - b : DHCP 伺服器回應用戶端電腦的要求,指定一個未被使用的 IP 位址給用戶端電腦使用 - c : 用戶端電腦收到 DHCP 伺服器所提供的 IP 位址後,發出回覆給 DHCP 伺服器,表示接受 DHCP 伺服器所指定 的 IP 位址 - d : 由 DHCP 伺服器回應用戶端電腦確認訊號,表示用戶端電腦可以使用這個 IP 位址連接網路 > IP: 房間 , 用戶端電腦 : 你 , DHCP伺服器 : 住服組 ==執行在 TCP 和 UDP 協定上的協定== ### DNS(Domain Name Service,域名服務) - 當你想要打開一個網站,但是你只知道它的名字,如果沒有 DNS,你就需要記住這個網站的 IP 位址,然後才能打開它 - DNS 的存在可以讓你輸入簡單的域名,然後由 DNS 伺服器幫你找到對應的 IP 位址,讓你更輕鬆地瀏覽網路和使用網路資源 -  - 使用UDP - 因為UDP具有較低的延遲 - 使用TCP - 當傳輸的 DNS 封包大小超過了 UDP 的最大限制(約 512 位元)時,DNS 就會使用 TCP 協議來進行傳輸 - 如果用戶端未收到來自 DNS 的回應,則間隔 3-5 秒後會使用 TCP 重新傳輸資料 >來自:https://ithelp.ithome.com.tw/articles/10273420 #### DNS 命名方式 整個 DNS 系統裡包含三種網域名稱系列: - 採樹狀階層式的架構 - 以 cu.edu.tw. 網域為例 : - 子網域 : cis.cu.edu.tw - 主機 : linux.cu.edu.tw - TLD(Top-level Domain) - 頂級域名 - 例如 : com、edu、tw、jp -  > 來自 : http://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 - 反向網域 : 由 IP 位址查詢到 Domain Name - 通用網域 : 大多以三個英文字母表示某一組織單位的網域名稱,此網域名稱都以美國本土單位為主 - com : 公司、企業 - gov : 政府 - edu : 教育單位 - 國家網域 : 大多以兩個字母來表示某一國家的網域名稱 - 例如 : tw 、 jp #### FQDN (Full Qualified Domain Name) - 完整網域名稱 - 一個網站或主機在網路上的完整識別名稱 - 『主機名稱 (Hostname) 』 + 『網域名稱 (Domain name )』 + 『. (root)』 - 『linux.cis.cu.edu.tw.』 - 『主機名稱』 : linux - 『網域名稱』 : cis.cu.edu.tw - 『.』 : root #### DNS 查詢過程 - 當在 linux 系統輸入 domain name 時,會先檢查 `/etc/hosts`確定裡面有匹配的 IP 嗎 - 如找不到, linux 會發出 DNS 請求 - 先去本機的 DNS cache中查 - 如果之前已經解析過,本機就會將結果保存在 DNS cache中 - 如沒有,會向本機預設的 DNS Server 傳送請求,然後去本機預設的 DNS Server 的 cache中查 - 預設的 DNS 伺服器在 `/etc/resolv.conf` 裡面 - 如沒有,則會向上層 DNS Server 傳送請求,直到能解析該 domain name -  #### 相關設定檔 - `/etc/hosts` : 本機的 IP 地址對應表 - 紀錄一些特殊的 domain name - `/etc/resolv.conf` : 預設的 DNS Server - DNS 伺服器的 IP 可以設定多個(備援) #### DNS 紀錄 - DNS Server 會根據此 domain name 查詢相關的紀錄 - 如果該 domain name 設定 A 紀錄,在 DNS 查詢過程就會使用 A 紀錄 - 像是搜尋 google.com ,DNS Server 先查詢到它是使用 A 紀錄,所以就會回傳 IPv4 | DNS紀錄 | 作用 | | -------- | -------- | | A | IPv4 的 IP 位址 | | AAAA | IPv6 的 IP 位址 | | NS | 管理這個領域名稱的伺服器主機名字 | | MX | 主要用於傳輸電子郵件使用 | | CNAME | 實際代表這個主機別名的主機名字 | #### 指令 - `dig` - `dig www.ncnu.edu.tw` -  - [待查資料] [暫存時間(秒)] IN [[資源類型] [資源內容]] - 暫存時間 - TTL(time to live ) - 當這筆記錄被其他 DNS 伺服器查詢到後, 這個記錄會保持在對方 DNS 伺服器的快取中,保持多少秒 - 試試看反覆執行 ! - 這個數字歸零後,下次有人再重新搜尋這筆記錄時,你的 DNS 就會重新沿著 . (root) 開始重來搜尋一遍, 而不會從快取裡面抓取 - `dig -t A www.ncnu.edu.tw` -  - `dig -t ns ncnu.edu.tw` - 查詢 www.ncnu.edu.tw 是由哪部 DNS 伺服器提供的 - 要輸入 domain Name 才查的到 -  - 至少會有兩部以上才不會掛掉 - `dig +trace www.ncnu.edu.tw` - 查看 DNS 的搜尋過程 - . --> .tw --> .edu.tw --> .ncnu.edu.tw --> www.ncnu.edu.tw -  - `host -a www.ncnu.edu.tw` - 查出所有重要參數 -  - `nslookup www.ncnu.edu.tw` -  - 其中 `127.0.0.53` 是查詢的 DNS 伺服器 - 預設會使用 `/etc/resolv.conf` 內設定的 DNS 伺服器 - `whois www.ncnu.edu.tw` - 可以查詢到當初註冊這個 domain 的使用者的相關資訊 - 近年來很多網路資訊安全的問題 - 查詢到的資訊已經不見得是完全正確 -  --- ## TCP/IP統整 | 層級 | 負責事項 | 傳送依據 |說明 | | -------- | -------- | -------- |-------- | | Application | 提供各種網路應用程式 | | HTTP,FTP,,DHCP,DNS | | Transport | 根據不同的用途提供不同的通訊品質 | port |TCP,UDP | | Network | 決定資料如何傳送到目的地 | IP Address | IP, ICMP,ARP | | Data Link | 負責網路對硬體的溝通 | MAC Address | Ethernet, Wi-Fi | - 分層的好處 - HTTP(應用層),規範預覽網站的規則,像是傳輸內容的格式,就不用管封包沒有送達怎麼辦,這類的問題就是交給TCP(傳輸層) - 盡可能的把抽象和實際的應用之間做一個連接,有些應用不見得可以很明確的歸類在某一層 ## 參考資料 - https://zh.wikipedia.org/zh-tw/TCP/IP%E5%8D%8F%E8%AE%AE%E6%97%8F#%E5%BA%94%E7%94%A8%E5%B1%82https://miahsuwork.medium.com/%E7%AC%AC%E5%85%AD%E9%80%B1-%E7%B6%B2%E8%B7%AF%E5%9F%BA%E7%A4%8E-tcp-ip-f89cc09f1f36 - https://yakimhsu.com/project/project_w4_Network_http.html - https://sls.weco.net/CollectiveNote20/HTTP - https://www.seo-panda.tw/http-status-code-202112/#HTTP_Status_Code_1xx_%E8%A8%8A%E6%81%AF - https://medium.com/johnny%E7%9A%84%E8%BD%89%E8%81%B7%E5%B7%A5%E7%A8%8B%E5%B8%AB%E7%AD%86%E8%A8%98/%E7%B6%B2%E8%B7%AF%E6%A6%82%E8%AB%96-%E4%BB%80%E9%BA%BC%E6%98%AFhttp-460c101c553 - https://www.rocksaying.tw/archives/21334380.html - https://ithelp.ithome.com.tw/articles/10246761?sc=pt - https://medium.com/pierceshih/%E7%AD%86%E8%A8%98-%E4%BD%95%E8%AC%82-http-%E5%82%B3%E8%BC%B8%E5%8D%94%E5%AE%9A-1d9b5be3fd24 - https://linux.vbird.org/linux_server/redhat9/0340dhcp.php#theory_Whatisdhcp - https://hackmd.io/@ncnu-opensource/book/https%3A%2F%2Fhackmd.io%2F%40Alanjy-Huang%2FryARVogrj#TCP - https://ithelp.ithome.com.tw/articles/10282225 - https://ithelp.ithome.com.tw/articles/10280652 - http://www.raidenftpd.com/tw/ftp.html - https://www.pcnet.idv.tw/pcnet/network/network_ip_tcp.htm - https://articles.onlinetoknow.com/dns/
×
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