# Week5 —— HTTP(+S, on SSL/TLS)
- ## 什麼是通訊協定?<br>為什麼要有通訊協定的存在?
定義:通訊協定在網路規範數據在網路節點之間,該如何進行傳輸和交換的一套標準。
它們描述了傳送與接收訊息、處理以及回應的格式和程序 (process)。
存在原因有
**- 規格化: *不同* 製造商、*不同* 系統與軟體、*不同* 地理位置的節點能夠通過遵守同一套通訊協定來進行溝通。**
**- 效率:定義了數據傳輸的標準格式和程序,可以提高數據傳輸的效率。**
**- 可靠性:包含錯誤檢測、校正機制,提高數據傳輸的可靠性。**
**- 兼容性:確保新舊技術之間彼此兼容性。**
**- 🌟安全性:部分通訊協定,甚至還提供數據加密、驗證,來保證數據傳輸的安全。** |
| |TCP / IP| HTTP|FTP|SMTP|
|-|-|-|-|-|
| 定義 | 網路通訊規則 | 分配網路資源協定 | 文件傳輸 | 電子郵件傳輸 |
| 層級 | OSI 模型<br>傳輸層 (TCP)與網路層 (IP) | 應用層 | 應用層 | 應用層 |
| 傳輸方式 | 連接導向 (TCP)<br>非連接導向 (IP) | 請求—回應 | 控制和資料連接 | 請求—回應 |
| 用途 | 網路通訊 | 網頁資料傳輸 | 文件傳輸 | 電子郵件傳輸 |
| 安全性 | 無 | 要 HTTPS | 要 SSL / TLS | 要 SSL / TLS |
| 實例 | 瀏覽器與伺服器 | 瀏覽網頁 | 上傳下載文件| 發送接收郵件 |
## HTTP 通訊協定有哪些重要的特性?
- 無狀態性:HTTP協定是無狀態的,意味著伺服器不會保存客戶端的任何資料。每次客戶端發送請求到伺服器時,伺服器就會處理該請求並回應,然後忘記請求。無狀態性讓 HTTP 協定更簡單,但也意味著無法直接實現像登錄狀態或購物車這類需要狀態的功能,這需要使用到如 Cookie 的其他技術。
- 簡單快速:客戶端向伺服器請求服務時,只需要傳送方法和路徑。由於 HTTP 協定的設計簡單,所以通訊速度很快。
- 靈活:HTTP 允許傳輸任何類型的數據,只需要在 HTTP Header 中的 Content-Type 欄位中標明資料類型即可。
- 無連接:意味著一次 HTTP 通信只能處理一個請求。伺服器處理完客戶的請求並收到客戶的應答後,即切斷連接。這可以 **節省傳輸時間**。
- 支援 BLOB:支援 BLOB(Binary Large Object),這表示它可以傳輸如圖片或其他多媒體檔案等大型二進位對象。
- 可擴展性:允許自定義方法和 Header 欄位,使協定具有高度擴展性。
請注意,HTTP是一種明文傳輸協定,這意味著其在傳輸數據時並不具備安全性。然而,透過**HTTPS(HTTP Secure)**,
可以為 HTTP 協定提供加密的連接,以保護數據的安全。
## HTTP Request 包含哪些重要的資訊欄位?
HTTP Request 主要由三部分組成:起始行 (Start line),請求頭 (Header),以及請求主體 (Body)。以下是這三個部分中的一些重要的欄位:
### 起始行 (Start line)
| | |
|-|-|
| **Method** | HTTP 方法,如 GET、POST、PUT、DELETE |
| **URL** | 請求的 URL,包含了所要訪問的資源的路徑 |
| **HTTP Version** | 使用的 HTTP 版本,如 HTTP / 1.1 或 HTTP / 2 |
### 請求頭 (Header)
| | |
|-|-|
|**Host**| 要訪問的伺服器的地址和端口號 (port)|
|**User-Agent**| 客戶端(例如瀏覽器)的識別資訊 |
|**Accept**| 客戶端接受的媒體類型|
|**Content-Type**| 請求有主體時,會指定主體的媒體類型 |
|**Content-Length**| 請求有主體時,會指定主體的長度(以字節為單位)|
|**Authorization**| 當需要認證時,會包含認證憑據 |
|**Cookie**| 與請求的 URL 相關的所有 Cookie |
### 請求主體 (Body)
包含實際的請求資料,並不是所有的請求都有主體。
如:GET 請求沒有主體,POST, PUT 請求通常有主體。
請注意,以上只是一些常見的重要欄位,還有許多其他的 header 欄位可以用於各種目的。
## HTTP Response 包含哪些重要的資訊欄位?
HTTP Response 主要由三部分組成:
- 狀態行 (Status line)
- 響應頭 (Header)
- 響應主體 (Body)。
以下是這三個部分中的一些重要的欄位:
### 狀態行 (Status line)
| | |
|-|-|
|**HTTP Version**|*使用的 HTTP 版本*|
|**Status Code**|HTTP 狀態碼,表明了請求的處理結果。|
|**Status Text**|與狀態碼相對應的文字描述|
### 響應頭 (Header)
| | |
|-|-|
|**Content-Type**|*指定了主體的媒體類型*|
|**Content-Length**|*指定了主體的長度(以字節為單位)*|
|**Server**|處理該請求的伺服器的訊息|
|**Set-Cookie**|伺服器設置的cookie|
|**Date**|響應生成的日期和時間|
### 響應主體 (Body)
這部分包含實際的響應數據,這可以是 HTML、圖片、JSON 對象等等。
請注意,以上只是一些常見和重要的欄位,還有許多其他的 HTTP Header 欄位可以用於各種目的。
## 哪些前端程式、瀏覽器操作會預設使用 HTTP GET 方法?
以下是一些前端程式或瀏覽器操作會預設使用 HTTP GET 方法的例子:
1. **在瀏覽器網址列輸入網址**:輸入網址並按下 Enter 時,瀏覽器會使用 GET 方法向該網址發送請求。
2. **點擊超連結**:點擊一個超連結時。
3. **重新載入頁面**:點擊按鈕或使用快速鍵(如 Ctrl+R 或 F5)時,瀏覽器會重新請求當前的頁面。
4. **透過 JavaScript 發送 AJAX 請求**:當使用 `fetch` 或 `XMLHttpRequest` 物件發送 AJAX 請求時,如果沒有明確指定請求方法,則預設會使用 GET 方法。
5. **HTML 表單的預設提交方式**:當 HTML 表單(`<form>`)的 `method` 屬性沒有指定或者設定為 `"GET"` 時,提交表單會以 GET 方法發送請求。
請注意,**GET** 方法應該只用於 **獲取資訊**
不應該用來進行會改變伺服器狀態的操作(例如 **建立、更新或刪除資源** )
這些操作應該使用其他的 **HTTP** 方法,例如 **POST**、**PUT** 或 **DELETE**。
## 詳細描述後端程式 redirect() 導向操作,實際上是如何透過前後端的互動完成?
### 絕對不會主動發訊息給客戶端
當後端程式執行 `redirect()` 方法時,它通常會向客戶端(Client side, 通常是網頁瀏覽器)發送一個特殊的 HTTP 響應。
這個響應的狀態碼通常是 **301(永久重定向)** 或 **302(臨時重定向)**,並且包含一個 `Location` 頭,其值為新的 URL。以下是這個過程的詳細步驟:
- **客戶端向伺服器發送請求**:使用者在網址列輸入網址、點擊連結、提交表單或者 JavaScript 發送 AJAX 請求而產生。
- **伺服器接收到請求並處理**:伺服器的後端程式會根據請求的 URL 和其他信息來決定如何處理這個請求。如果決定需要重定向,它就會執行 `redirect()` 方法。
- **伺服器發送重定向響應**:後端程式會創建一個狀態碼為 301 或 302 的 HTTP 響應,並且在這個響應的頭部加上一個 `Location` 頭,其值為新的 URL。然後,這個響應會被送回到客戶端。
- **客戶端接收到重定向響應**:當網頁瀏覽器(或其他客戶端)接收到這個響應時,它會解析這個響應,並且讀取 `Location` 頭的值。
- **客戶端發送新的請求**:瀏覽器會使用從 `Location` 頭獲取的新 URL,再次發送一個 HTTP 請求到伺服器。
- **伺服器處理新的請求**:當伺服器接收到新的請求時,它會像處理其他請求一樣處理這個請求,例如返回一個網頁或者其他資源。
## Redirect 重新導向流程
```sequence
客戶端->伺服器: 網址列輸入網址、點擊連結、提交表單、AJAX
Note right of 伺服器: 根據 URL 處理
伺服器-->客戶端: 狀態碼 301/302 響應+`Location` 頭,值為新 URL
Note left of 客戶端: 解析響應
客戶端->伺服器: 獲取新 URL 後再次發請求
Note right of 伺服器: 繼續處理...
伺服器-->客戶端: 繼續...
```
透過這種方式,`redirect()` 方法可以引導瀏覽器從一個 URL 導向到另一個。
這種重定向是在伺服器端完成的,而客戶端的行為(例如瀏覽器)是透明的。
換句話說,使用者通常會看到他們的瀏覽器突然從一個頁面跳轉到另一個頁面,而且網址列中的 URL 也會改變。
## What is a 301 Redirect, and When Should You Use One?
https://blog.hubspot.com/blog/tabid/6307/bid/7430/what-is-a-301-redirect-and-why-should-you-care.aspx
以下是一個用來比較 HTTP, HTTPS 和 SSL 的 Markdown 表格:
## HTTPS
**Hyper Text Transfer Protocol**
| 功能 | HTTP | HTTPS | SSL |
| ---- | ---- | ----- | --- |
| 定義 | 用於傳輸超文本的協議 | HTTP Secure,傳輸加密的網頁資料,透過 SSL / TLS 協議加密,保護資料的完整安全。 | Secure Sockets Layer,為網路通訊提供安全與資料完整性的加密協議。 |
| 安全性 | 不具備加密功能,資料傳輸過程會被竊取或篡改。 | 透過 SSL / TLS 提供加密連線,防止資料在傳輸過程被竊取篡改| SSL 是一種安全協議,用來確保在網際網路上資料的安全傳輸。|
| 預設端口號 | 80 | 443 | 依賴於使用該協議的應用。 |
| 效能 | 比 HTTPS 快 | 比 HTTP 慢,需要加密解密,但差異在現代硬體可忽略不計 | 效能取決於如何實施以及它被用在哪個網路應用中 |
| 隱私保護 | 低,傳輸過程可能會被竊取或篡改。 | 高,即使被攔截也無法輕易閱讀 | 高,因為 SSL 提供了數據加密、身份驗證以及訊息完整性檢查。 |
### 在實際應用中選擇使用哪種協議的一些考慮因素包括:
- SEO 必要性(搜索引擎優化):Google 已明確表示 HTTPS 是他們排名算法,不用的話搜尋結果排名會非常災難
- 資料安全必要性:信用卡資訊,個人身份資訊,登入憑證等,
HTTPS 通過 SSL / TLS 協議提供的加密連線能提供必要的安全性。
- 使用者信任和網站聲譽:使用者在瀏覽器上看到 `https` 或鎖定的 `🔒` 圖標,可以知道他們的資訊是安全的,增強他們對網站的信任。
- 效能和可用資源:儘管在現代硬體上 HTTPS 的加密和解密操作帶來的效能下降通常可以忽略不計,但在有限的資源或高負載的情況下,這可能仍是一個需要考慮的因素。
- Web 功能需求:某些新的 Web 功能,如 `HTTP/2` 和 Service Workers,要求網站必須運行在 HTTPS 上。
- 成本與管理:雖然現在有許多組織如 `Let's Encrypt` 提供免費的 SSL 憑證,但在某些情況下,購買和管理 SSL 憑證可能仍需要時間和資源。
| OSI Model | Layer Function |
|---|---|
| **Layer 7**: 💁Application 應用層 | 為應用程式提供網路服務的端點/接口。例如 **HTTP(S)**、SMTP、FTP 等。|
| **Layer 6**: 🧑💻Presentation 表示層 | 負責資料的轉換和編碼,以便其能夠在資料上進行傳輸,例如 **ASCII**、**Unicode**、JPEG|
| **Layer 5**: 💬Session 會話層 | 建立、管理和終止兩個網路節點之間的連結(會話),例如 NFS、**SQL**、**RPC**|
| **SSL 🔐 (Secure Sockets Layer)<br>TLS (Transport Layer Security)** | 保證資料安全和完整性,使用了 TCP (第4層) |
| **Layer 4**: ➡️ Transport 傳輸層| 提供了點對點的資料傳輸與控制。例如 **TCP** 和 UDP 協議。|
| **Layer 3**: 🛜 Network 網路層| 負責數據包的路由和傳輸,例如 **IP** 協議、ICMP、IGMP。|
| **Layer 2**: 🧵Data Link 資料連結層 | 連接網路軟體和硬體的部分。例如 Ethernet 和 PPP。|
| **Layer 1** ⚡️Physical 實體層| 處理硬體方面的細節,例如電壓、時鐘、物理數據速率等。Ethernet(硬體實現)。|
SSL (Secure Sockets Layer) 和它的繼任者 TLS (Transport Layer Security) 主要運作在 OSI 模型的第五層(會話層)和第四層(傳輸層)之間。它們為網路通信提供了安全和數據完整性保證。
SSL / TLS 協議使用了傳輸層的服務(如 TCP),並為應用層(如 HTTP)提供了一個安全的通道。因此,當我們說 HTTPS(HTTP over SSL / TLS)時,實際上是指 HTTP 在 SSL / TLS 的保護下運行。
總的來說,雖然 SSL / TLS 在 OSI 模型中並沒有明確的一層,但它們主要在會話層和傳輸層之間運作,為上層應用提供安全性保證。
```mermaid
graph TD;
A-->P;
P-->S;
S-->T;
T-->N;
N-->D;
D-->PHY;
A(應用層 HTTP, HTTPS, SMTP, FTP);
P(表示層 ASCII, Unicode, JPEG);
S(會話層 NFS, SQL, RPC);
T(傳輸層 TCP, UDP);
N(網路層 IP, ICMP, IGMP);
D(資料連結層 Ethernet, PPP);
PHY(實體層 Ethernet(硬體實現));
```
```
### 5-NFS (Network File System):
在許多 Unix 和 Linux 系統中,NFS 仍然是共享文件的主要方式。它也被用在一些企業級的存儲解決方案中。
NFS 是一種分佈式文件系統協議,由 Sun Microsystems 在 1980 年代開發,允許一個系統在網路上分享其文件系統給其他系統使用,就像本地存儲一樣。
### 4-UDP (User Datagram Protocol 使用者資料圖表協議):
UDP 是一種無連接的網路通信協議,它不保證消息的順序或可靠性,但傳輸速度快、低延遲,在許多即時應用中仍然被廣泛使用,常用於影片串流、VoIP(網路語音)、遊戲等對即時性要求高的應用。
```
### 4-TCP (Transmission Control Protocol):
TCP 是一種連接導向的協議,它確保數據包按照發送的順序到達,並重傳丟失的數據包,常用於需要可靠的傳輸的應用,如:網頁瀏覽、郵件傳輸等。
TCP 和 IP 的主要區別在於, IP (3層) 負責將數據包路由到目的地,TCP (4層) 接著負責數據的傳輸和控制。
### 3-ICMP (Internet Control Message Protocol):
用於 **IP** 網路診斷和報告錯誤的協議,例如 **"ping"** 命令
### 3-IGMP (Internet Group Management Protocol): 網際網路群組管理協議
主要用於支援多播和 IP 電視(IPTV)等應用。多播允許一個來源節點向多個目標節點同時傳送資料,而不需要重複傳送。
### (少用)2-PPP (Point-to-Point Protocol 點對點協議):
一種數據鏈路協議,用於在直接連接的兩個節點之間建立網路連接,例如撥號和數據機連接。
雖然 PPP 在撥號上網中的使用已經大大減少(因為寬頻和行動網路的普及),但它仍然在某些場合下被使用,例如在某些 DSL(數位用戶線)和 VPN(虛擬私人網路)連接中。
### Ethernet:
一種用於構建區域網路(LAN)的技術標準。
它定義了如何進行數據包的傳輸,包括如何格式化數據、如何檢測和糾正錯誤等。
Ethernet 可以用於有線(例如,使用雙絞線或光纖)和無線(例如,Wi-Fi)網路。
### LAN