這是我參與8月更文挑戰的第5天,活動詳情查看: 8月更文挑戰nginx
微信公衆號搜索【程序媛小莊】,Rest cannot be enjoyed by lazy people~面試
前情提要:絕頂聰明的面試官繼續和小莊面試啦,你們一塊兒來圍觀吧數據庫
面試官大佬:(面帶慈祥)小夥子來啦,來來來我們接着聊呀,今天來聊聊網絡這塊的東西~後端
我:(時刻準備着)您問~瀏覽器
面試官大佬:先說說HTTP協議get請求和post請求有啥區別呢?安全
我:get
請求的主要特徵是向服務器獲取資源,在發送請求的過程當中,請求的參數會拼在URL後面。post
請求通常用於表單提交,至關於把信息提交給服務器,等待服務器響應,post
方式是把提交給後端的參數放在請求體中,對攜帶的參數長度沒有要求。get
請求在發送過程當中會產生一個TCP數據包,而post
請求在發送過程當中會產生兩個TCP數據包,對於get
請求瀏覽器會把http header
和data
一併發送出去,服務器響應狀態碼200返回客戶端須要的資源;而對於post
請求瀏覽器先發送header
服務器響應狀態碼100表示continue,瀏覽器再發送data數據,服務器響應狀態碼200。服務器
面試官大佬:TCP協議知道吧,簡單講一下TCP協議的三次握手四次揮手?微信
我:TCP協議是傳輸層的協議,基於TCP協議的通訊客戶端和服務端必須創建一個雙向通訊的鏈接,鏈接創建以後就能夠發送數據了,三次握手和四次揮手分別對應TCP的鏈接和釋放過程。markdown
在創建TCP鏈接的時候,首先由客戶端向服務端發送鏈接請求,服務端接收到請求後,會告訴客戶端收到該請求並同時向客戶端發送鏈接請求,而後客戶端告訴服務端已經收到該請求,此時TCP鏈接就已經創建。cookie
在斷開TCP鏈接的時候,由哪一方提出均可以,好比說客戶端想要斷開鏈接,客戶端向服務端發送想要斷開鏈接的請求,服務端收到該請求後會告訴客戶端已經收到該請求,可是不會馬上中斷服務端與客戶端的鏈接,由於此時可能客戶端須要的數據還未傳輸完畢,當服務端向客戶端傳輸的數據發送完畢後,服務端會向客戶端發送斷開鏈接的請求,客戶端收到請求後會給服務端確認斷開的信息,至此,TCP鏈接斷開。
面試官大佬:粘包問題你知道嗎?
我:粘包問題是TCP協議傳輸中的問題,TCP協議是面向流的協議,粘包問題的主要緣由是接收方不知道消息之間的界限,不知道一次性提取多少字節的數據形成的。
發送方和接收方創建通訊的底層仍是基於操做系統,因爲操做系統有本身的機制規定何時向接收方發送數據,所以可能會出現同一個業務數據被分割成多個數據包或者多個業務數據被打包到同一個數據包發送。
因爲問題的根源是接收方不知道消息之間的界限,所以解決粘包問題的方法就是圍繞如何讓發送端在發送數據前,把本身要發送的數據流總大小告知接收端,而後接收端能夠起一個循環接收完全部數據。
面試官大佬:(小夥子能夠呀)cookie和session瞭解嗎?
我:HTTP協議有一個特色就是無狀態,每次請求都是獨立的,客戶端的服務當次會話產生的數據不會被保留,可是隨着互聯網的發展,又須要保存狀態,爲了解決HTTP協議的無狀態這一特性出現了cookie。cookie具體指的是保存在客戶端瀏覽器一小段信息,當用戶第一次登錄時,服務端會產生隨機串保存在客戶端瀏覽器上,下次客戶端瀏覽器再次訪問服務端的時候會自動攜帶這個串,服務端就能夠在這個串上獲取用戶的信息。
可是因爲cookie是保存在客戶端上的,有可能被攔截或者被竊取,存在很大的安全風險,就須要有一種新的技術,將用戶信息保存在服務端上保證信息的安全性,就是session。 session是基於cookie的,session是存放在服務器上的隨機串,當用戶第一次登錄的時候,服務器會產生一個隨機串保存在客戶端瀏覽器中,下次客戶端訪問服務器的時候會攜帶該隨機串,服務端經過客戶端攜帶的數據去服務器的數據庫中進行比對,校驗當前登錄用戶是否合法,可是若是有很是多的用戶登錄的話,就會產生很是多的數據,當用戶登錄時服務器查詢數據庫就會很是的慢,並且若是採用的分佈式服務的話,就須要在每臺服務器都配置相同的數據庫,由於使用nginx轉發的時候,並不知道當次請求會被轉發到哪臺服務器上,這樣就會很是佔用服務器資源,token就能夠解決這個問題。 token也是基於cookie,token由三段組成,第一部分是頭,第二部分是荷載,第三部分是簽名,第一部分存放的是base64轉碼後的加密方式/公司信息等,第二部分荷載存放的是base64轉碼後的用戶不敏感的信息好比用戶名 過時時間等,第三部分是由前兩部分組合轉碼以後再hash加密 獲得的簽名。 當用戶第一次登錄以後,服務端會返回這樣的一個隨機串給客戶端瀏覽器保存,下次再次訪問服務器想要進行其餘操做的時候,服務端就會經過本身的解碼方式獲得前兩部分,經過相同的加密方式獲得隨機串與客戶端瀏覽器攜帶的串進行對比,判斷用戶信息是否正確。 使用token的好處就是服務器不須要存儲用戶的數據,能夠節省服務器資源,每臺服務器只須要保存對應的方法便可。
面試官大佬:666,你在說一下地址欄中輸入URL按下回車發生了什麼?
我:首先瀏覽器分析連接指向頁面的URL,瀏覽器向DNS請求解析目標URL的IP地址,域名系統DNS解析出URL的IP地址後,瀏覽器與服務器創建TCP鏈接,鏈接創建以後瀏覽器會向目標服務器發起HTTP請求,請求數據包,若是目標服務器是一個簡單的頁面,就會直接返回。對於須要的重定向的頁面,瀏覽器在獲取了重定向響應後,找到重定向地址,重複第一步操做,而後瀏覽器從新發送請求,攜帶新的 URL,目標服務器返回數據。
面試官大佬:我這邊面試基本就沒什麼問題了,等下一位面試官和你聊聊哦~
我:好嘞~