owned this note
owned this note
Published
Linked with GitHub
[TOC]
- Book mode: https://hackmd.io/@ncnu-opensource/book
# TCP/IP
> 回到企資網,來當郵差:D
## 引言
- 中文與英文是「協定」
- 透過中文或英文溝通是「通訊」
- 講話的內容是「資料」

- 使用的語言(協定)不同,理解不能
---

- 使用的語言(協定)一樣,溝通無礙
---
人類具有智慧、理解力,即使脫離原則,還是可以與對方溝通

但電腦沒有這樣的理解力,在電腦之間的通訊,無論是以太網路等實體層,還是應用程式的軟體層面,都需要明確規範並遵這個約定,這個約定就是「協定」
---
約定是約定了,但要聽誰的...?

---

---
## 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 模型
雖然兩種模型各有自己的架構,但基本上能互相對照

|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`

2. 選擇 ens33、enp1s0、ens3...e 開頭的都可以

3. 指定ip.addr及Protocol,將不需要的資訊過濾掉
`ip.addr==44.211.137.141 && ssh`

4. ssh 到 lsa server
```bash=
ssh lsa@lsalab.moli.rocks # Password 在群組
```

5. 找到一個用 TCP Protocol 的封包,點開它


現在開始解讀封包
---
# Link Layer
## MAC Address
> 也有人將 MAC Address 稱為硬體位址、 Physical address 、 Layer 2 Address

一張網卡,一個 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

- broadcast 收到資料就全部傳出去
> 不安全,在連同一個 hub 的情況下,資料會互通
- 半雙工(half-duplex)
- 收資料或送資料不能同時,一次只能作其中一種

- 現在 switch 最常見

- 可以建立 MAC address table
> 不同種類、規格儲存不同數量的 Mac address
- 每個 port 會紀錄 client 的 Mac address
> 檢查 Mac address 後會指定一個 port 傳輸,解決資料互通的隱憂

- 全雙工
---
## 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


## 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


---
## 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 長度區分,分別使用在大、中、小型網路

- 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

---
### NAT(Network Address Translation): 將私有IP位址轉成公開IP位址

- **網站伺服器無法定位 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

## Port
> Review: SSH
- 如果只有 IP 位址,若有不同的軟體要同時進行傳輸,所有的資料就會從同一個出口一起通過,會產生碰撞。
- 連接埠:讓同一台電腦擁有多個對外的出口,讓網路傳輸有多工的能力
- 每個 Port 對應到不同的網路
### port 相關指令
* `cat /etc/services`:查看 port 的使用狀況
* `grep -w /etc/services`:查詢指定port
### 常見服務對應port

## Method in Transport layer
### UDP(User Datagram Protocol)
- 僅提供傳輸基本功能,負責處裡封包要傳送到哪個 Port

- 追求即時性且能容忍一些封包丟失的情況(盡力傳遞)
- 串流服務、視訊、音訊

---
### TCP
- 可靠的傳輸方式—>保障資料完整性
- 連線導向 (Connection-Oriented):傳輸資料前先建立連線,協調參數(用於資料確認與重送、流量控制)
> 利用三項交握建立連線
- 資料確認與重送:確認目的端是否收到已送出的資料
- 流量控制:視情況調整資料傳輸的狀況,盡量減少資料的流失
>利用滑動視窗(Sliding Window)
#### Three-way Open

| SYN | SYN, ACK |
| -------- | -------- |
|  |  |

#### 資料確認與重送
- A 傳送 packet1 給 B
- B 回應 ACK 封包給 A
- 如果A在時間內沒有收到B的ACK封包A就會重新傳送 packet 給 B
| SYN | SYN, ACK |
| -------- | -------- |
|  |  |
以這張圖為例,我發送了一個封包序號為 801223437 的封包,LSA server 收到後會回應 801223438 也就是 801223437+1,表示 801223438 之前的資料都收到了。
假設今天這個封包在傳輸過程遺失了,我們過了一段時間都沒有收到來自 LSA server 回傳的 Ack. Number = Seq. Number+1,我們就可以知道資料遺失,進而重新傳送資料,完成可靠性的通訊。
#### TCP Header

- 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

---
:::info
### TCP/UDP 比較
| | TCP | UDP |
| ------- | ----------- | ----- |
| 可靠性 | 可靠 | 不可靠 |
| 封包確認 | ACK | - |
| 速度 | 慢 | 快 |
| 傳輸方式 | 封包按順序傳輸 | 封包以串流方式傳輸 |
| 錯誤檢查與修正 | 有 | 無 |
| 逾時處理 | 逾時重傳、高速重傳(指定封包) | 逾時重傳(全部封包) |
| 雍塞控制 | 有 | 無 |
| 適用服務 | **要求可靠運輸的服務**, ex :SSH、文字聊天、電子郵件、檔案傳輸...等不能漏缺資訊的服務 | **講求速度的即時服務** ex: 串流媒體、網路電話 |
:::
---
# Application Layer
## HTTP(Hyper Transfer Protocol ,超文本傳輸協定)
- 全球資訊網(www)的網路通訊的基礎
- 用於網頁前後端溝通,瀏覽器向伺服器發送請求,伺服器回傳相應的資料

:::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>`

:::info
### 樹狀階層式架構

如何查找DNS

- `/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 發起傳送資料請求
- 
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 喔」

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**
- 加快網頁載入速度,減少延遲

- 二進制協定
- 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)**

- **多路複用(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 識別連線,確保封包正確接收

:::
## Demo
:::success
#### 使用telnet上網
- 沒有指定 host :arrow_right: 預設頁面
```=
telnet ammon.bluet.org 80
GET / HTTP/1.0
```
```=
<head><title>BlueT.org Studio</title></head>
```

- 更改 host
```=
telnet ammon.bluet.org 80
GET / HTTP/1.0
Host: studio.bluet.org
```
```=
Moved Permanently
Location: https://Studio.BlueT.org
```
