面試官:如何理解 OSI 七層模型和 TCP/IP 四層模型? HTTP 作為如何保存使用者狀態?

一、面試官:OSI 七層模型是什麼?每一層的作用是什麼? TCP/IP四層模型和OSI七層模型的差別是什麼?

OSI(開放系統互聯)七層模型是一種用於理解和實現網路通訊的分層模型,它將網路通訊過程劃分為七個獨立的功能層。每一層專注於完成特定的任務,並為上一層提供服務,同時依賴下一層的支援。以下是OSI七層模型的詳細描述及其每一層的作用:

 

 

1. 應用程式層(Application Layer

作用:應用層是OSI模型的最高層,直接與使用者交互,提供網路服務和應用程式介面。

 

關鍵功能:

 

提供使用者存取網路資源的介面。

支援文件傳輸、電子郵件、遠端登入等功能。

典型協定:HTTP(超文本傳輸協定)、FTP(檔案傳輸協定)、SMTP(簡單郵件傳輸協定)、DNS(網域名稱系統)。

 

 

 

2. 表示層(Presentation Layer

作用:表示層負責資料格式的轉換、加密和壓縮,以確保資料能夠在不同系統之間正確解釋。

 

關鍵功能:

 

資料編碼和解碼(如ASCIIEBCDIC)。

資料加密和解密(如SSL/TLS)。

資料壓縮和解壓縮。

典型協定:SSL/TLS

 

3. 會話層(Session Layer

作用:會話層負責建立、管理和終止應用程式之間的會話(通訊會話)。

 

關鍵功能:

 

控制會話的建立、維護和斷開。

提供會話同步和檢查點功能(如斷點續傳)。

典型協定:NetBIOSRPC(遠端程序呼叫)、PPTP(點對點隧道協定)。

 

 

4. 傳輸層(Transport Layer

作用:傳輸層負責端到端的通信,確保資料完整、有序地從來源主機傳輸到目標主機。

 

關鍵功能:

 

提供可靠的資料傳輸(如TCP)或不可靠的資料傳輸(如UDP)。

實現流量控制和錯誤復原。

資料分段和重組。

典型協議:

 

TCP(傳輸控制協定):面向連接,可靠傳輸。

UDP(用戶資料報協定):無連接,快速但不可靠。

5. 網路層(Network Layer

作用:網路層負責封包的路由選擇和轉發,確保資料能夠從來源主機到達目標主機。

 

 

關鍵功能:

 

提供邏輯位址(如IP位址)。

路由選擇和封包轉送。

分段和重組資料包。

典型協定/設備:

 

設備:路由器。

協定:IPIPv4/IPv6)、ICMPARP

6. 資料鏈結層(Data Link Layer

作用:資料鏈結層負責在相鄰節點之間可靠地傳輸資料幀,並處理物理層可能引入的錯誤(如位元錯誤)。

 

關鍵功能:

 

 

將比特流封裝成訊框。

實現流量控制和錯誤偵測與修正。

定義MAC位址(媒體存取控制位址)以識別設備。

典型協定/設備:

 

設備:交換器、網橋。

協定:乙太網路(Ethernet)、PPP(點對點協定)、HDLC

7. 物理層(Physical Layer

作用:物理層負責在物理介質上傳輸原始的位元流(01)。它定義了硬體設備(如網卡、電纜等)之間的電氣、機械、功能和規程特性。

 

關鍵功能:

 

定義電壓、介面、電纜標準等。

實現比特流的傳輸和接收。

提供實體連接的建立、維護和釋放。

典型協定/設備:

 

 

設備:中繼器、集線器

OSI七層模型透過分層的方式,將複雜的網路通訊任務分解為多個獨立的功能模組。每一層都專注於完成特定的任務,並為上一層提供支援。這種分層設計使得不同的網路協定和設備可以協同工作,從而實現跨網路的通訊。

 

高三層(應用層、表示層、會話層)更接近用戶,負責提供進階的網路服務和資料處理功能。

低三層(傳輸層、網路層、資料鏈結層、實體層)主要負責網路通訊的基礎部分,包括資料的傳輸、路由和鏈路管理。

8. TCP/IP四層模型

由下到上分為四層:

 

網路介面層:對應OSI的實體層和資料鏈結層,負責硬體相關的資料傳輸。

 

 

 

OSI七層模型更適合用於學習和理解網路通訊的基本原理,而TCP/IP四層模型則因其高效性和實用性,成為現代網路通訊的實際標準。

 

二、面試官:HTTP 本身是無狀態協議,HTTP如何保存使用者狀態?

HTTP 是一種無狀態(stateless)協議,這意味著每個請求和回應之間是相互獨立的,伺服器不會自動保存使用者的會話狀態。然而,在實際應用中,為了實現使用者狀態的保存(如登入狀態、購物車資訊等),通常會採用以下幾種機制:

 

 

 

1. 使用 Cookie

原理:伺服器透過在 HTTP 回應頭中設定 Set-Cookie 字段,將使用者的狀態資訊儲存到客戶端。用戶端在後續請求中會自動攜帶該 Cookie,從而實現狀態的傳遞。

 

範例:

 

伺服器回傳回應時設定 Set-Cookie: sessinotallow=abc123; Path=/; HttpOnly

用戶端在下次請求時會在請求頭中加入 Cookie: sessinotallow=abc123

優點:

 

簡單易用,適合保存少量資料。

支援過期時間、網域限制等安全特性。

缺點:資料儲存在客戶端,可能被竄改或竊取(需配合加密或簽章使用)。

 

 

2. 使用 Session

原理:伺服器為每個使用者產生一個唯一的會話識別碼(Session ID),並透過 Cookie URL 重寫的方式傳送給客戶端。實際的使用者狀態資訊(如登入資訊)儲存在伺服器端,客戶端僅保存 Session ID

 

範例:

 

使用者登入後,伺服器產生一個 Session 並傳回 Set-Cookie: sessinotallow=xyz456

用戶端在後續請求中攜帶 Cookie: sessinotallow=xyz456,伺服器根據 ID 擷取對應的使用者狀態。

優點:

 

敏感資料儲存在伺服器端,安全性較高。

減少客戶端的資料儲存負擔。

缺點:伺服器需要維護大量會話數據,可能導致效能瓶頸。

 

 

3. 使用 Token(如 JWT

原理:伺服器在使用者登入成功後產生一個令牌(Token),並將 Token 傳回給客戶端。用戶端在後續請求中透過請求頭(如 Authorization: Bearer)攜帶該 Token。伺服器透過驗證 Token 的合法性來識別使用者狀態。

 

JWT 範例:

 

Token 格式:Header.Payload.Signature,其中 Payload 包含使用者資訊(如使用者 ID、角色等)。

客戶端發送請求時攜帶 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9…。

優點:

 

無需伺服器儲存會話信息,支援分散式部署。

Token 可包含自訂數據,減少資料庫查詢。

缺點:

 

Token 較大,增加了每次請求的開銷。

Token 一旦簽發,無法輕易撤銷(需引入黑名單機制)。

 

 

4. URL 重寫

原理:將使用者狀態資訊(如會話 ID)附加到 URL 中,作為請求的一部分傳遞給伺服器。

 

範例:

 

伺服器傳回的 URLhttp://example.com/cart?sessinotallow=12345

當客戶端點擊連結時,會話 ID URL 傳送到伺服器。

優點:不依賴 Cookie,適用於停用 Cookie 的場景。

 

缺點:

 

URL 中暴露狀態訊息,有安全隱患。

URL 長度有限制,不適合儲存複雜資料。

 

 

 

5. 隱藏表單字段

原理:在 HTML 表單中嵌入隱藏字段,用於儲存使用者狀態資訊。當使用者提交表單時,這些資訊會隨請求一起傳送到伺服器。

 

範例:

 

複製

<input type="hidden" name="sessionId" value="abc123">

1.

優點:簡單易實現,適合特定場景。

 

缺點:

 

僅適用於 POST 請求,無法覆寫所有互動場景。

安全性較低,容易被竄改。

 

 

6. 總結

 

綜上所述,HTTP 協定雖然本身是無狀態的,但透過上述機制(如 CookieSessionToken 等)可以有效地保存使用者狀態,滿足不同場景的需求。

 

三、面試官:能不能具體說一下Cookie的工作原理、生命週期、作用域?使用Cookie儲存會話資訊會有什麼限制?

Cookie是瀏覽器和伺服器之間用於儲存使用者會話資訊的小型文字檔案Cookie的工作原理涉及多個環節,包括建立、儲存、傳送、更新以及安全措施等。以下是Cookie工作原理的詳細介紹:

 

 

1. Cookie的建立與設定

當使用者首次造訪一個網站時,伺服器可以透過HTTP回應頭中的Set-Cookie指令來建立一個Cookie。這個指令包含了Cookie的名稱、值以及一些可選的屬性。

 

例如:

 

 

鍵值對:sessinotallow=abc123表示Cookie的名稱是sessionId,值是abc123

 

作用域:Path=/表示這個Cookie在整個網站的所有路徑下都有效。

 

安全性:

 

HttpOnly禁止JavaScript存取這個Cookie,有助於防止跨站腳本攻擊(XSS)。

Secure表示這個Cookie只能透過HTTPS協定傳輸,有助於防止中間人攻擊。

生命週期:Max-Age=3600表示這個Cookie3600秒(1小時)後過期。

 

 

 

2. Cookie的儲存與管理

瀏覽器會根據網域名稱和路徑規則來儲存Cookie。每個網域下的Cookie都是獨立儲存的,例如,example.comCookieother.comCookie是分開儲存的。 Cookie的作用域由Path屬性決定,例如,Path=/shopCookie只在/shop路徑下有效。

 

瀏覽器也會根據Cookie的過期時間(Max-AgeExpires屬性)來管理Cookie的生命週期。如果Cookie沒有設定過期時間,它就是一個會話Cookie,會在瀏覽器關閉後自動刪除。如果設定了過期時間,它就是一個持久性Cookie,會在指定的時間後過期。

 

 

 

3. Cookie的自動攜帶與使用

當使用者再次造訪同一個網站時,瀏覽器會自動將相關Cookie附加到HTTP請求頭中,傳送給伺服器。例如:

 

伺服器透過解析請求頭中的Cookie訊息,可以識別使用者的身份,從而實現會話管理、個人化服務等功能。

 

例如:

 

會話管理:伺服器可以透過sessionId來識別使用者是否已登錄,避免使用者每次造訪都需要重新登入。

個人化服務:伺服器可以根據Cookie中儲存的使用者偏好(如語言、主題等)來提供客製化的內容。

 

 

4. Cookie的更新與刪除

伺服器可以透過再次傳送Set-Cookie指令來更新Cookie的值或屬性。例如,伺服器可以延長Cookie的有效期,或修改Cookie的作用域。

 

要刪除一個Cookie,伺服器可以傳送一個同名的Cookie,並將其過期時間設定為一個已經過去的時間。例如:

 

 

5. Cookie的安全與限制

儘管Cookie在網路開發中非常有用,但它也面臨一些安全風險:

 

跨站腳本攻擊(XSS):如果Cookie沒有設定HttpOnly屬性,惡意腳本可能會竊取Cookie中的資訊。

跨站請求偽造(CSRF):攻擊者可以利用Cookie來偽造使用者的請求。

此外,Cookie還有一些限制:

 

大小限制:單一Cookie的大小通常不能超過4KB

數量限制:每個網域下可以儲存的Cookie數量是有限的。

 

 

 

 

6. Cookie的替代方案

隨著Web技術的發展,Cookie不再是一些場景下的最佳選擇。以下是一些Cookie的替代方案:

 

LocalStorage/SessionStorageHTML5提供的本機儲存方案,容量較大(通常5-10MB),但僅限於客戶端使用。

Token認證:使用JWTJSON Web Token)等令牌來取代Cookie,可以減少伺服器儲存壓力,並提高安全性。

7. 總結

Cookie透過伺服器建立、瀏覽器儲存與自動攜帶的機制,實現了使用者狀態的持久化。它在會話管理、個人化服務等方面發揮著重要作用,但開發者也需要注意其安全性和限制,並根據實際需求選擇合適的儲存方案。

 

 

 

四、面試官:SessionCookie的差別是什麼?如果沒有 Cookie 的話 Session 還能用嗎?多伺服器節點下 Session-Cookie 方案如何做?

1. Session 的工作原理詳解

SessionCookie類似,也是 Web 開發中用於追蹤用戶狀態的重要機制,它允許伺服器在多個請求之間識別和記住特定的用戶,從而實現個人化的用戶體驗和安全的用戶認證。

 

以下是 Session 工作原理的詳細步驟:

 

(1) Session 的創建

 

 

使用者首次造訪:當使用者第一次造訪伺服器時,伺服器會建立一個新的 Session 物件。這個過程通常是由伺服器端的程式語言和框架自動完成的,無需開發者手動幹預。

產生 Session ID:伺服器為 Session 物件指派一個唯一的標識符,稱為 Session ID。這個 ID 通常是一個隨機產生的字串,用於在後續的請求中識別和檢索對應的 Session 物件。

傳遞 Session ID:伺服器將 Session ID 透過某種方式傳遞給客戶端,通常是將其儲存在使用者的瀏覽器中,例如作為 Cookie 的值或在 URL 中作為參數。

(2) Session 的存儲

 

 

 

伺服器端儲存:Session 物件通常儲存在伺服器的記憶體中,但也可以儲存在其他地方,如資料庫、檔案系統等。儲存方式取決於伺服器的配置和應用程式的需求。

記憶體儲存:速度快,但伺服器重新啟動或記憶體不足時資料可能會遺失。

資料庫儲存:持久性強,支援 Session 共享和叢集化,但速度相對較慢。

檔案系統儲存:簡單,但速度較慢,不利於 Session 分享。

(3) Session 的傳遞與使用

 

用戶端攜帶 Session ID:在使用者的後續請求中,瀏覽器會自動將 Session ID(通常透過 Cookie 方式)傳送到伺服器。

 

 

 

伺服器驗證 Session ID:伺服器根據客戶端傳送的 Session ID,去尋找對應的 Session 物件。如果找到,伺服器會載入該使用者的會話資料。

讀寫 Session 數據:伺服器根據目前請求,讀取或修改該用戶的 Session 數據,以完成各種業務邏輯處理,例如保存用戶的登入狀態、購物車內容等。

(4) Session 的銷毀

 

會話結束:當會話結束時,伺服器會銷毀對應的 Session 對象,釋放佔用的資源。會話結束的情況包括使用者關閉瀏覽器、會話逾時、使用者主動登出等。

 

 

 

逾時設定:伺服器可以設定一個會話逾時時間,當使用者在一段時間內沒有活動時,伺服器會自動銷毀 Session 物件。

主動銷毀:當使用者主動登出時,伺服器應該銷毀對應的 Session 對象,以確保使用者的隱私和安全。

2. 網頁原始碼範例(Node.js + Express

 

3. SessionCookie的關鍵差異如下:

 

 

在多伺服器節點環境下,實施Session-Cookie方案需要解決的核心問題是Session共享與同步,確保使用者在不同伺服器間切換時,會話狀態保持一致。以下是具體方案及實現步驟:

 

1. Session共享與同步機制

(1) 黏性會話(Sticky Session

 

原理:透過負載平衡器(如Nginx)將同一用戶的所有請求固定分配到同一台伺服器。

 

設定範例(Nginx):

 

 

缺點:

 

伺服器負載可能不平衡。

單一伺服器故障會導致使用者會話遺失。

(2) Session複製

 

原理:伺服器之間即時同步Session數據,確保所有伺服器擁有相同的Session資訊。

 

實現方式:

 

Tomcat叢集配置Cluster節點和DeltaManager

Spring Session整合Redis等快取伺服器。

缺點:

 

網路頻寬消耗大。

伺服器間耦合度高。

 

 

(3) 共享存儲

 

原理:將Session資料儲存在共享儲存中(如資料庫、快取伺服器、檔案系統),所有伺服器透過統一介面存取。

 

技術選型:

 

資料庫 MySQL(持久化存儲,但效能較低)。

快取伺服器Redis(高效能,支援過期時間)。

檔案系統NFS(簡單易用,但效能較低)。

2. 具體實作步驟(以Redis為例)

(1) 技術選型

 

Redis:作為共享存儲,提供高效能的Session讀寫。

Spring Boot:整合Spring Session簡化開發。

 

 

(2) 設定步驟

 

新增依賴:

 

Redis配置:

 

啟用Spring Session

 

(3) 程式碼範例

 

儲存Session

 

讀取Session

 

4. 總結