前言
最近一直在后端開發的面經🙌,里面涉及到了好多計算機網絡的知識😁,在這里以問題的形式寫一個學習筆記(其中參考了: JavaGuide 和 小林coding 這兩個很好的學習網站😘)
1.當鍵入網址后,到網頁顯示,其間發生了什么?
(1)首先瀏覽器會解析URL。(如確定協議像Http或Https)
(2)然后通過DNS服務器把域名解析為IP地址。(找到服務器啦)
(3)接著TCP協議三次握手和服務器建立連接。(客戶端與服務器之間建立起連接了)
(4)成功建立連接后,瀏覽器向服務器發送一個 HTTP 請求報文。(發送數據了)
(5)服務器收到 HTTP 請求報文后,處理請求,并返回 HTTP 響應報文給瀏覽器。
(6)最后,瀏覽器把這些內容解析并展示出來。
2.TCP 傳輸數據之前,要先三次握手建立連接,過程是什么?
我們都知道在 HTTP 傳輸數據之前,首先需要 TCP 建立連接,Http數據的傳輸是要基于TCP 連接的。
(1).首先,客戶端發一個SYN包給服務器(這就像打招呼說:你好!我想連你了😘)
(2.)服務器收到后,發送一個SYN+ACK包回去(我收到啦,同意連接)
(3).客戶端收到后,再發一個ACK包給服務器,確認連接。
3.HTTP1.0,1.1,2.0,3.0區別?
這個吧,它這個很多,我也沒咋學全面,我感覺吧,因為Http數據的傳輸是要基于TCP 連接的,這個技術基于傳輸層,就是不斷提升不斷升級就是是運輸的效率更高?稍微總結一下:
(1)HTTP/1.0 每次請求響應都要建立新連接,效率低。
(2)HTTP/1.1 支持持久連接,能減少連接開銷,但還是按順序來處理請求。
(3)HTTP/2.0 能同時處理多個請求,多路復用,傳輸更快。
(4)HTTP/3.0 用UDP協議替代了TCP,減少了TCP握手延遲,改進了擁塞控制,在高丟包網絡環境下性能更好。
4.HTTP 是不保存狀態的協議, 如何保存用戶狀態?
這個在后端開發登陸界面的時候有很大用處
方法一:Session (會話) 配合 Cookie (主流方式)
🙌先來了解一下Cookie和Session:
**cookie:**是主要在客戶端,能存一些小數據,,就像身份證,負責在客戶端和服務器見傳遞標志;
**Session:**主要在服務端,就像檔案庫,在服務器端存客戶端的狀態信息
基本流程是這樣的:
(1)用戶向服務器發送用戶名、密碼、驗證碼用于登陸系統。
(2)服務器驗證通過后,會為這個用戶創建一個專屬的 Session 對象
(3)服務器通過 HTTP 響應頭中的 Set-Cookie 指令,把這個 Session發送給用戶的瀏覽器。
(4)瀏覽器接收到 SessionID 后,會將其以 Cookie 的形式保存在本地。
(5)當用戶保持登錄狀態時,每次向該服務器發請求,瀏覽器都會自動帶上這個存有 Session 的 Cookie。
(6)服務器收到請求后,從 Cookie 中拿出 Session,就能找到之前保存的那個 Session 對象
注🤯:然而這種方法不支持跨域請求,所以一般使用以下方法:
方法二:Token-based 認證 (如 JWT - JSON Web Tokens)
這個我在蒼穹外賣登錄界面的文章里寫過,里面還有實現代碼感興趣想進一步學習可以看看: 點我🙌
實現步驟如下:
(1)用戶向服務器發送用戶名、密碼以及驗證碼用于登陸系統;
(2)如果用戶用戶名、密碼以及驗證碼校驗正確的話,服務端會返回已經簽名的 Token,也就是 JWT;
(3)客戶端收到 Token 后自己保存起來(比如瀏覽器的 localStorage )用戶以后每次向服務端發請求都在 Header 中帶上這個 JWT (直接當發送信息儲存到HTTP傳輸數據中);
(4)服務端檢查 JWT 并從中獲取用戶相關信息。