【Java核心面試寶典】Day17、詳解“Keep-Alive”和“非 Keep-Alive”區別及使用場景
Hello,你好呀,我是灰小猿!一個超會寫bug的程序猿!
用堅持締造技術、用指尖敲動未來!
和很多小伙伴們一樣,我也是一名奔波在Java道路上的“創造者”。也想靠技術來改未來,改變世界!因為我們堅信每一次敲動鍵盤都能讓生活變得更智能、世界變得更有趣!
在此專欄《Java核心面試寶典》記錄我們備戰夢想的【day 17】!
今天我來和大家講解一下HTTP協議中有關持久層連接和非持久層連接的幾道常見面試題。
一、“持久連接(Keep-Alive)和非持久連接(非Keep-Alive)的區別,他們對服務性能有影響嗎?”
在最早期的HTTP/1.0中,**瀏覽器每次發起HTTP請求都要與服務器建立一個TCP連接,服務器完成請求處理之后就會立即斷開這個TCP連接,**因此服務器并不會跟蹤每一個用戶,同時也不會記錄之前的請求信息。然而創建和關閉連接是需要消耗大量的資源和時間的,為了減少資源的消耗,縮短響應的時間,就需要重用連接。
所以在之后的HTTP/1.1版本中就默認使用持久連接,而在之前的版本中默認使用的是非持久連接,
對于非Keep-Alive來說, 對于每一個瀏覽器請求,我們必須為每一個請求的對象建立和維護一個全新的連接,同時對于每一個這樣的連接,客戶機和服務器都要分配TCP的緩沖區和變量,這就給服務器帶來了嚴重的負擔,因為一臺web服務器可能服務數以百計的客戶機請求,如果每一次請求對要不斷的斷開和重新建立連接,那么將會對服務器資源造成巨大的損失!
而在Keep-Alive方式下, 服務器響應后保持該TCP連接打開,這樣在同一臺客戶機和服務器之間進行的后續請求和響應報文就都可以通過這個TCP連接傳輸,甚至位于同一臺服務器的多個web頁面在向同一個客戶機發送時,可以在單個持久的TCP連接上進行。
我們可以通過下面這張圖來表示Keep-Alive和非Keep-Alive連接。
==但是對于Keep-Alive就沒有缺點了嗎?并不是的!==
二、追問:如何避免持久連接時系統資源被無效占用?
當我們長時間保持TCP連接時容易造成系統資源被無效占用, 若對Keep-Alive模式配置不當,這樣將可以會造成比非Keep-Alive方式更大的損失。因此我們需要正確的設置Keep-Alive timeout參數,當TCP連接傳送玩最后一個HTTP響應后,該連接會保持Keep-Alive_timeout秒,之后斷開并關閉這個連接!這樣就會很好的避免系統資源被長時間無效的占用。
三、追問:那么如果使用了舊版本的HTTP,如何維持持久連接呢?
如果想要在舊版本的HTTP協議上維持持久連接,則需要指定connection的首部字段為Keep-Alive,來告訴對方這個請求完成后不要關閉,下一次還要使用這個連接進行通信。
四、HTTP長連接和短連接的使用場景是什么?
==長連接:== 長連接多用于操作頻繁,點對點的通訊,而且客戶端連接數目較少的情況。如即時通訊、網絡游戲等。
==短連接:== 用戶數目較多的web網站通常使用短連接,例如京東、淘寶這樣的大型網站一般客戶端數量達到千萬級甚至上億,若使用長連接勢必會造成大量的資源被無效占用,所以一般使用短連接,請求處理完成即關閉!
今日總結
今天的文章主要和大家講解了HTTP協議的持久連接和非持久連接的區別和使用,我們需要了解持久連接和非持久連接的特點,兩者之間如何轉換。使用場景等。
如果小伙伴們有遇到其他相關的面試題,歡迎在評論區留言提出,我會把大家提出的總結到文章內, 歡迎小伙伴們一起評論區打卡學習!小伙伴們可也在左方加我好友一起探討學習!
我是 ==灰小猿== ,我們下期見!
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。