###### tags: `lsa` `ncnu`
# Network
- Book mode: https://hackmd.io/@ncnu-opensource/book
[TOC]
## 介紹 TCP/IP Protocol Suite
- Protocol 協定
- 兩個裝置之間溝通需要共同遵守某個規則
- 例如:打電話
- 撥號、鈴響、接起來、打招呼、回應、掰掰、掛電話
- 分層
- 情境 (小明要用紙條約小睿看電影)
- 
- 
- 
> 圖取自 [1112 LSA Network 講義 - HackMD](https://hackmd.io/@ncnu-opensource/By4H6JLNW/https%3A%2F%2Fhackmd.io%2F%40qtNgFtaqR4Or_CLAuotXjw%2FrkY9fXB0o?type=book#%E4%BB%8B%E7%B4%B9-TCPIP)
- 上層內容依賴下層服務
- 
> 圖片取自 [en:User:Cburnett](https://en.wikipedia.org/wiki/User:Cburnett) original work, colorization by [en:User:Kbrose](https://en.wikipedia.org/wiki/User:Kbrose), [CC BY-SA 3.0](http://creativecommons.org/licenses/by-sa/3.0/), via Wikimedia Commons, [Link](https://commons.wikimedia.org/wiki/File:UDP_encapsulation.svg)
- 
- TCP/IP
- 名字取自 Transmission Control Protocol (TCP) 和 Internet Protocol (IP)
- TCP 中定義了比較高階的動作,例如分割、重組、錯誤偵測
- IP 負責把資料傳到指定的另一端
- 在 1983 年 ARPANET 轉移到 TCP/IP 協議,成為 Internet 的標準
- | 層數 | 名稱 |
| -------- | -------- |
| 4 | 應用層 Application layer |
| 3 | 傳輸層 Transport layer |
| 2 | 網路層 Internet layer |
| 1 | 資料連結層 Data link layer |
- OSI 模型
- 全名 Open Systems Interconnection
- 由國際標準化組織 (International Standards Organization, ISO) 提出
- 是一種概念模型,一個試圖使各種電腦在世界範圍內互連為網路的標準框架
- | 層數 | 名稱 |
| -------- | -------- |
| 7 | 應用層 Application layer |
| 6 | 表現層 Presentation layer |
| 5 | 會議層 Session layer |
| 4 | 傳輸層 Transport layer |
| 3 | 網路層 Network layer |
| 2 | 資料連結層 Data link layer |
| 1 | 實體層 Physical layer |
- OSI Model 與 TCP/IP 的比較
- 
> 圖取自 Chunte7 on Wikimedia Commons <a href="https://creativecommons.org/licenses/by-sa/3.0" title="Creative Commons Attribution-Share Alike 3.0"> CC BY-SA 3.0</a>, <a href="https://commons.wikimedia.org/w/index.php?curid=16949432">Link</a>
## Link layer
- 定義如何傳送 **frame** ,一個資料單元
- 為直接透過網路硬體裝置連接的電腦(同個子網路 subnet),建立相互通訊的連線
- 透過 Physical Address (**MAC address**) 找到對方
| 網路 | 標準 | 功能 | 傳輸媒介 | 碰撞處理 |
|-|-|-|-|-|
| Ethernet 乙太網路 | 802.3 | 區域網路連線上的通信協定 | 雙絞線 | CSMA/CD |
| Wi-Fi 無線網路| 802.11 | 無線區域網路的電腦通訊標準 | 5GHz / 2.4GHz 無線電波 | CSMA/CA |
### Ethernet Frame 格式

- **Preamble 前導碼 :** 在數據傳輸開始之前,發送方會先發送一個固定長度的前導碼,此 56 位元的前導碼為 0 與 1 交錯,當接收方收到連續的 0 與 1 ,就會知道傳輸即將發生,此外也會根據 0 與 1 的變化速度,讓接收方可以同步數據傳輸時序。
- **SFD :** 全名 Start Frame Delimeter,目的為區隔 Preamble 與接下來的內容,表示傳輸即將開始。
- **Destination/Source Address :** 分別為接收方與發送方的地址,各 48 Bits,以 MAC Address 表示。
- **Length or Type :** 如果該欄位的值小於或等於 1500,則表示這是一個長度字段,指示了 Frame 的長度;如果該欄位的值大於 1500,則表示這是一個類型字段,指示了 Frame 中所包含的協議類型。
- **Data :** Frame 中實際傳輸的數據部分,大小在 46 bytes 與 1500 bytes之間,如有超過這個長度就會拆成另一幀。
- **Frame Check Sequence :** 這是一個固定長度的校驗碼,用於檢測 Frame 中數據的錯誤。
### MAC Address
- 全名: Media Access Control Address
- 網路卡卡號
- 長度 6 bytes (48 bits),常以 16 進位形式表示
:::info
看自己卡號方法,在 Linux 中下指令 `ip addr`
```=bash
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 30:5a:3a:81:13:3c brd ff:ff:ff:ff:ff:ff
inet 192.168.0.104/24 brd 192.168.0.255 scope global dynamic noprefixroute enp2s0
valid_lft 73772sec preferred_lft 73772sec
```
link/ether 後的 `30:5a:3a:81:13:3c` 即是此卡卡號
:::

> 圖取自 [File:MACaddressV3.png by Vtraveller on Wikipedia](https://en.wikipedia.org/w/index.php?title=File:MACaddressV3.png&oldid=887203797)
- 第 1 bit 為單播位址 Unicast (0) / 群播位址 Multicast (1)
- **例外:** 當每一個 bit 為 1 時 (FF:FF:FF:FF:FF:FF),則為 Broadcast 廣播位址
- Unicast 目的位址為單一目標
- Multicast 目的位址是一組目標,加入該組的成員均是封包的目的地
- 要看 link layer 支不支援,像 Ethernet 有支援,而[很多無線協議不支援](https://www.rfc-editor.org/rfc/rfc9119.html)
- Broadcast 目的位址為網路中的全體目標
- 由第 2 bit 決定管理者
- **Global Unique:** 由 OUI 擁有者(即實際生產該網路裝置的廠商)自行決定後 24 Bits
- **Locally Administered:** 網管可自行決定 24 Bits
#### Organizationally unique identifier (OUI) 組織唯一標識符
- 用於唯一標識一個供應商、製造商或其他組織,由供應商至 IEEE 的註冊機構購買
- 即第 3~24 Bit 由 IEEE 決定
- 線上查詢工具: [Search - MAC or OUI address lookup](https://hwaddress.com/)
- 例如[查上面我電腦 MAC](https://hwaddress.com/?q=30%3A5a%3A3a%3A81%3A13%3A3c) 得知製造者為 ASUSTek COMPUTER INC.
- 
### CSMA/CD
- **Carrier Sense**: 監聽媒體使用情況,當 A 主機要發送網路封包時,要先監聽網路媒體,若無人使用才能發出 frame。
- **Collision Detection**: frame 有偵測碰撞能力,如果 A 主機與 B 主機剛好同時發 frame 時,2 方資料撞在一起,這 frame 即會損毀,此時 A 與 B 會各自等一段隨機時間,再次發送 frame 資料。

> 圖取自 TCP/IP Protocol Suite, 4th Edition by B. Forouzan (McGraw-Hill, 2010)
> © The McGraw-Hill Companies, Inc.
- 其實現在有線網路不太會遇到 collision,因為現在大家常用的網路設備:L2 switch 及 router,基本上一條線路兩端只會有網路設備、使用者裝置各一台
### Hub 集線器
- 網路共享媒體,同一時間僅允許一部主機使用。
- 會有上面一段 collision 的問題
- [用來抓封包很方便](https://wiki.wireshark.org/CaptureSetup/Ethernet#capture-using-an-ethernet-hub)
- 現在市面上很難找到了,[照片長這樣](http://ms15.ipv6.club.tw/~jiazheng/notes/images/hub_found_in_lab.jpg)
### Switch 交換器
- 這裡講的是 L2 switch,也叫 bridge,運作在 physical 和 link layer (能看到 MAC address)
- **Forwarding information base (FIB)**: 或稱 forwarding table, MAC table,Switch 會用一張表記住哪個 port 上面有什麼 MAC address 的裝置
- **Learning**: 在有 frame 經過它的時候,記錄他的來源地址和哪個 port,就能把學到的對應加進表裡
- **Forwarding**: 從表裡查到後往正確的 port 送
- **Flooding**: 若發現目的地址不在表裡,就把 frame 傳給所有的 port
### CSMA/CA - Carrier Sense Multiple Access with Collision Avoidance

> [來源](http://www.tsnien.idv.tw/Network_WebBook/chap15/15-4%20IEEE%20802_11%20MAC%20%E5%8D%94%E5%AE%9A.html)
1. 發送端會去偵測網路是否有訊號傳輸。
2. 假如頻道中沒有其他訊號傳遞時,發送端會再等待一段隨機時間 (IFS, interframe space 一個訊框間隔時間),在這段時間過後,如果還是沒有偵測到任何訊號在傳遞,發送端就會將 request to send (RTS) control frame 傳送出去。
- 假如一開始就偵測到有訊號使用了這個頻道,發送端會等到頻道淨空之後、再等待一個隨機的後退(Backoff)時間,才重新發送。
- RTS/CTS 傳送機制:

[來源](http://www.tsnien.idv.tw/Network_WebBook/chap15/15-4%20IEEE%20802_11%20MAC%20%E5%8D%94%E5%AE%9A.html)
- 工作站首先利用較小的訊框(request to send, RTS 訊框)來測試網路是否空閒,如果可以收到對方的回應訊框(clear to send, CTS 訊框),那表示網路是真正的空閒。
- 每個工作站內都會有網路配置向量(Net Allocation Vector, NAV),可以藉由他人的 RTS/CTS 得知目前在傳輸的訊號會維持多久並填入 NAV 內,這段期間就不會進行偵側。
## Internet Layer
### IP Address
- IP = Internet Protocol
- 通常在 Internet 中在同一時間內要是獨一無二的 <!-- (除非 [anycast](https://en.wikipedia.org/wiki/Anycast)) -->
#### IPv4
- 32 bits,通常以 8 bit 一組,用點`.`隔開,每組裡用 10 進位數表示
- 例如: `163.22.17.70` = `10100011.00010110.00010001.01000110`
- 特殊地址們
- 0.0.0.0
- 在裝置還不知道自己要用的 IPv4 地址時用的
- 設定成 server listen address 時,表示無論你從哪個 IP 地址存取這個服務都可以
- 255.255.255.255
- 廣播
- Loopback Address 127.0.0.0/8
- 本機
- Private Addresses
- 由於這三段 Class 的 IP 是預留使用的,所以不能直接作為連接 Internet 之用,適合一些 Public IP 不充足的組織內部用來規劃在區域網路使用。
- | IP 地址範圍 | IP 數量 | CIDR |
|-------------------------------|------------|------------------------------|
| 10.0.0.0 – 10.255.255.255 | 16,777,216 | 10.0.0.0/8 (255.0.0.0) |
| 172.16.0.0 – 172.31.255.255 | 1,048,576 | 172.16.0.0/12 (255.240.0.0) |
| 192.168.0.0 – 192.168.255.255 | 65,536 | 192.168.0.0/16 (255.255.0.0) |
- Multicast Addresses 224.0.0.0/4
- 每個區塊裡都有的
- Network Address - subnet 裡第一個位址
- Broadcast Address - subnet 裡最後一個位址
### Subnet Mask (子網路遮罩)
- 子網路 Subnet - 藉由將較大網路分成幾個相等部分所建立的較小網路
- 把一個 IP 地址分成兩段: **Network ID** 和 **Host ID**
- 以一間公司的員工舉例:行銷部的陳小姐
- Network ID 網路位址,前綴 = 行銷部
- Host ID 主機位址,後綴 = 陳小姐
- 找出 Network ID 方法: bitwise AND operation
1. 先把 IP 轉成 2 進位表示 `163.22.17.70` = `10100011.00010110.00010001.01000110`
2. 拿到 Mask 也轉成 2 進位 `255.255.255.0` = `11111111.11111111.11111111.00000000`
3. 做 bitwise AND operation
`10100011.00010110.00010001.01000110` AND
`11111111.11111111.11111111.00000000` =
`10100011.00010110.00010001.00000000`
4. 轉回 10 進位表示 = `163.22.17.0`
- [暨大的 subnet 列表](https://ccweb.ncnu.edu.tw/ccnetsrv/ccnet_subnetlist.asp?pageno=1&t=ccnet_subnet&recperpage=100)
:::info
**AND 邏輯運算**
1 AND 1 = 1
1 AND 0 = 0
0 AND 0 = 0
:::
- Classless Inter-Domain Routing,簡稱 **CIDR**
- 非固定限制長度的 Network ID 與 Mask
- 表示法: 例如 163.22.22.64 **/27**
- 等同於前 27 bit 都是 1,後 5 bit 都是 0
- `11111111.11111111.11111111.11100000`
- `255.255.255.224`
#### IPv6
- 因應 IPv4 快被用完,因此成為未來趨勢
- 128 bits,通常以 16 bits 為一組,每組以冒號「:」隔開,每組裡用 16 進位表示
- 可以用雙冒號「::」表示一組0或多組連續的0,但只能出現一次
- 例如: `2001:e10:6840:17::70` = `2001:e10:6840:17:0:0:0:70`
### Router 路由器
- 運作在 physical, data link 和 Internet layers (能看到 IP 地址)
- 可以連結 LAN (區域網路) & WAN (廣域網路)
- 轉送封包流程
1. 看封包目標 IP 位置。
2. 查看自己主機的 Net_ID 是否與封包的相同(屬於同區網),若相同可以直接傳給目的主機。
3. 若不同,查詢 default gateway (此為 Server A) 並傳給它。
4. 不理會封包流向,default gatway 會執行上述動作繼續往目的地傳送。
:::info
**[住宅閘道器](https://zh.wikipedia.org/wiki/%E4%BD%8F%E5%AE%85%E7%BD%91%E5%85%B3)**
- 一般人放在家裡的**住宅閘道器**(residential gateway)通常提供:
- 通過網頁介面設定
- 在家庭網路與網際網路之間路由 (Router)
- 提供家庭網路的連通性,就像一台網路交換器 (Switch)
- 網路位址轉換(NAT)
- DHCP
- 防火牆功能
- 也可能內建
- 數據機 (modem,modulator-demodulator 的縮寫,俗稱小烏龜)
- 動態 DNS (DDNS)
- [Wi-Fi 基地台](https://iqmore.tw/cht-hinet-alcatel-i-040gw-login)
> 來自維基百科 - [住宅閘道器](https://zh.wikipedia.org/wiki/%E4%BD%8F%E5%AE%85%E7%BD%91%E5%85%B3)
:::
## Transport Layer
- 負責提供兩個應用程式之間的傳輸
- 用 **Port** 號碼來區分同 host 內不同程式
:::info
### 常見的 port
| port 號 | 服務 |
| -------- | -------- |
| 21 | FTP,檔案傳輸協定的命令通道 |
| 22 | SSH,較為安全的遠端連線伺服器 |
| 23 | Telnet,早期的遠端連線伺服器軟體 |
| 25 | SMTP,簡單郵件傳遞協定,用在作為 mail server 的埠口 |
| 53 | DNS,用在作為名稱解析的領域名稱伺服器 |
| 80 | WWW,全球資訊網伺服器 |
| 110 | POP3,郵件收信協定 |
| 443 | https,有安全加密機制的 WWW 伺服器 |
`cat /etc/services` 可以看系統預先定義的列表
:::
### UDP
- User Datagram Protocol
- Header Format
```
0 7 8 15 16 23 24 31
+--------+--------+--------+--------+
| Source | Destination |
| Port | Port |
+--------+--------+--------+--------+
| | |
| Length | Checksum |
+--------+--------+--------+--------+
|
| data octets ...
+---------------- ...
```
- 提供不可靠的傳輸
- 對於即時性要求較高的應用程式通常用這種
- 適用場景
- 串流媒體,即時多人遊戲和網路電話
### TCP
- Transmission Control Protocol
- Header Format
```
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
```
- 可靠的
- sequence numbers and acknowledgments (**ACK**)
- 當傳送端送一個封包的時候,目的端如果有收到,就會向傳送端傳 ACK 代表有正確收到,如果傳送端在 timer expire 之後還沒有收到 ACK 的話,它會假設封包丟失,並再重送一個封包
:::info
#### Seqence Number & ACK
- 正確收到封包: `sequence number` + `封包大小` = ACK 回傳數字

:::
- 建立連線
- three-way handshake
```
TCP A TCP B
1. CLOSED LISTEN
2. SYN-SENT --> <SEQ=100><CTL=SYN> --> SYN-RECEIVED
3. ESTABLISHED <-- <SEQ=300><ACK=101><CTL=SYN,ACK> <-- SYN-RECEIVED
4. ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK> --> ESTABLISHED
5. ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK><DATA> --> ESTABLISHED
Basic 3-Way Handshake for Connection Synchronization
```
## Application Layer
### DNS
- 網域名稱系統 Domain Name System
- 將域名和 IP 位址相互對映的一個分散式資料庫
- 光是 root name server 就[有 13 組、1719 台](https://zh.wikipedia.org/zh-tw/%E6%A0%B9%E7%B6%B2%E5%9F%9F%E5%90%8D%E7%A8%B1%E4%BC%BA%E6%9C%8D%E5%99%A8)
- 例如: mirror.ossplanet.net -> 163.22.17.70
- 採樹狀階層式的架構
- 
- iterative query
- 
- `dig +trace mirror.ossplanet.net` 可以看得到這過程
- 有很多地方會暫存結果
- 
- 通常是用 UDP 或 TCP 的 port 53
#### 用 `dig` 來查 DNS
- `dig [options] example.com [type]`
- `dig mirror.ossplanet.net a` 對映到主機的 IP 地址
- `dig mirror.ossplanet.net aaaa` 主機名對映到 IPv6 地址
- `dig ossplanet.net ns` 找該域名由哪個 DNS 伺服器來進行解析
- `dig ncnu.edu.tw mx` Mail Exchange (MX) 郵件主機
- `dig ncnu.edu.tw txt` 各種純文字記錄
- `dig @8.8.8.8 www.ncnu.edu.tw` 指定要對哪一台伺服器送出 DNS 查詢
- 用來測 [TWNIC DNS RPZ](https://rpz.twnic.tw/e.html)
- `dig +cdflag @8.8.8.8 example.com` 關閉 DNSSEC 驗證
### HTTP
- HyperText Transfer Protocol
- 通常伺服器使用 TCP port 80
- 請求
- 下指令`nc example.com 80` 之後輸入以下內容加空行
- ```
GET / HTTP/1.1
Host: example.com
```
- 第一行 Request-Line 包含
- Method
- GET
- POST
- Request-URI
- HTTP-Version
- 可以有更多 Request Header
- 回應
- ```
HTTP/1.1 200 OK
Age: 332180
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Wed, 06 Mar 2024 13:59:38 GMT
Etag: "3147526947+gzip+ident"
Expires: Wed, 13 Mar 2024 13:59:38 GMT
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Server: ECS (sac/2538)
Vary: Accept-Encoding
X-Cache: HIT
Content-Length: 1256
<!doctype html>
<html>
<head>
<title>Example Domain</title>
...內容省略
```
- 第一行 Status-Line 包含: Status Code
- Status Code
- 1XX (參考訊息)
- 2XX (成功)
- 3XX (重新導向)
- 4XX (客戶端錯誤)
- 5XX (伺服器錯誤)
### DHCP
- Dynamic Host Configuration Protocol
- 當你連接到一個新的 Wi-Fi 網路時,你的裝置需要一個 IP 位址才能夠在網路上通訊
- 如果沒有 DHCP 協定,你需要手動設定 IP 位址和其他網路相關的設定,非常麻煩
- 但是有了 DHCP 協定,你的裝置可以自動向網路中的 DHCP 伺服器發送請求,然後獲取所需的 IP 位址和其他設定
- 當今天有100部電腦需要設置?
- 藉由一部主機來自動的分配所有的網路參數給所有電腦
- 提供用戶端電腦動態的 IP 位址、子網路遮罩、預設閘道器與 DNS 的位址等
- 減少用戶手動設定 IP 位址的麻煩
- 
1. 使用者電腦發出 DHCPDISCOVER 廣播到整個子網路
2. DHCP 伺服器回應 DHCPOFFER 包含一個可用的地址
3. 使用者收到(可能很多個) OFFER 之後用廣播回應 DHCPREQUEST,跟伺服器說我要這個
4. 伺服器回應 DHCPACK ,真的把資源預留下來,告訴使用者可以用
5. 使用者收到 DHCPACK 之後把參數設定好拿來開始用
- DHCP client 用 UDP 來送訊息到 DHCP server (port 68),DHCP server 回應到 client 的 UDP port 67
## 參考資料
- [1112 LSA Network 講義 - HackMD](https://hackmd.io/@ncnu-opensource/By4H6JLNW/https%3A%2F%2Fhackmd.io%2F%40qtNgFtaqR4Or_CLAuotXjw%2FrkY9fXB0o?type=book#%E4%BB%8B%E7%B4%B9-TCPIP) (Retrieved 03:34, March 6, 2024)
- TCP/IP Protocol Suite, 4th Edition - B. Forouzan (McGraw-Hill, 2010)
- TCP/IP协议族. (2024, March 2). Retrieved from 维基百科, 自由的百科全书: https://zh.wikipedia.org/w/index.php?title=TCP/IP%E5%8D%8F%E8%AE%AE%E6%97%8F&oldid=81747512
- Wikipedia contributors. (2024, February 9). OSI model. In Wikipedia, The Free Encyclopedia. Retrieved 03:34, March 6, 2024, from https://en.wikipedia.org/w/index.php?title=OSI_model&oldid=1205349643
- [國家教育研究院 樂詞網](https://terms.naer.edu.tw/)
- [RFC 793 - Transmission Control Protocol](https://datatracker.ietf.org/doc/html/rfc793#autoid-11)
- [RFC 768 - User Datagram Protocol](https://datatracker.ietf.org/doc/html/rfc768)
- [DNS 除錯教學系列文章(4) – dig 指令教學 | 哈部落](https://haway.30cm.gg/dns-4-dig/)
- Seqence Number & ACK 來自 [Week 10 (2022/11/17) TCP/IP & iptables - HackMD](https://hackmd.io/@ncnu-opensource/By4H6JLNW/https%3A%2F%2Fhackmd.io%2FCn2YtIi1R-iu1KN8agyejQ?type=book#Seqence-Number-amp-ACK)
- [TCP 三向交握 (Three-way Handshake) - NotFalse 技術客](https://notfalse.net/7/three-way-handshake#Acknowledgment-Number)
## 延伸閱讀