HTTP也有長短之分?HTTP的長連接 vs. 短連接
你一定聽說過關于http所謂的 長連接和短連接之說。
但是,什么是長連接?什么是短連接,我想很多人都是懵懵懂懂的,不能完全說出他們的區別。今天就帶你們完全了解他們,從此再也不會忘記了。
什么是長連接
HTTP長短連接的區別在于使用的TCP的長連接還是短連接。
在HTTP 1.0中默認使用的是短連接,而從HTTP 1.1 之后默認的連接都變為長連接。長短連接的區別?本質上是有TCP連接來決定的,為什么這么說呢?因為TCP是一個向雙通道,他可以保持一段時間不關閉,這樣就有了長連接和短連接的區別了。比方說:在數據的傳輸完成后,保持TCP連接不中斷,等待相同域名再次請求時,繼續使用這個TCP連接通道進行數據傳輸。這個就是長連接。
舉個例子吧,比如你需要郵件一個東西給你的朋友,HTTP協議指的就是你需要填寫的那個快遞單,你寄件的時候填寫的那個快遞單的動作就相當于進行了一次HTTP請求。而你的快遞需要通過交通運輸工具來運送吧,可以是貨車、貨車、高鐵、飛機等等。而TCP協議指的就是那個運送快遞的運輸工具。因為需要運輸啊,就需要有道路啊,地上是公路或者鐵路,天上是航線。那么這個運輸道路就是TCP連接,因為這個道路是雙向的,可以運過來也可以運過去。所以,TCP連接也叫作雙向的數據通道。
如果這個道路長時間都有車來運送貨物,那就叫作長連接。如果運送一段時間后,需要休整沒有車經過了,那么就叫做短連接。
因此我們可以看出來,所謂的HTTP連接指的就是TCP的連接。TCP連接是可以保持一段時間不中斷的就是長連接,發起一次請求后就主動斷開的就是短連接,所以就有了長連接和短連接一說。
那么問題來了,怎么樣的連接才能被稱之為 ----長連接呢?
長連接的條件:
- ***, 需要將HTTP 的頭部,Connection設置為 keep-alive,但是這里有一個問題出現了,是不是只需要設置Connection 為 keep-alive就算是長連接了呢?這個問題很明顯,當然不是的,你需要在服務器和客戶端都要進行設置。
- 第二, 我們日常生活中所用的HTTP請求是不是長連接呢?答案很明顯,當然是的了。因為現在的HTTP使用的都是1.1協議了,你細心觀察一下就會發現,它的Connection 都是設置為keep-alive.
那么現在你是不是對keep-alive,很好奇啊。什么是Connection 設置為keep-alive 呢?接下來,我就帶你們來揭開它神秘的面紗。
Keep-alive 又為何方神圣?
我們知道啊,HTTP協議采用的都是“請求-應答”模式,當Connection 為非keep-alive模式,則每一次的 請求-應答任務,服務器和客戶端都需要重新建立一次連接。任務完成后,斷開連接。而當Connection為keep-alive模式,會使服務器與客戶端一直保持連接的狀態。當再有新的請求任務發生時,就不需要重新建立。節約時間,也不用耗費資源。
非keep-alive:
有上面的圖可以看出來:
短連接的步驟:
長連接的步驟:
接下來我們就聊一聊 長連接和短連接分別在什么場景下使用?
- 長連接使用場景:長連接多用于頻繁操作,多次請求的網絡應答響應,而且是一對一,點對點的通信。 例如:數據庫的連接用長連接,如果使用短連接頻繁的應答響應會造成socket報錯,同時也會浪費資源。
- 短連接的使用場景:短連接怎不會那么耗費資源,因為不需要長時間占用TCP連接。因此,像Web網站中的http服務一般都是用的短連接。因為長連接會占用一定的資源,而像淘寶,京東等網站這樣頻繁的被用戶訪問,趕上雙十一都是上億規模的訪問量,如果使用長連接,每個用戶都占用一個TCP連接通道,那么服務器的壓力可想而知。所以,這種情況下 使用短連接效果比較好。
因為上面我們說到HTTP的連接實際上就是TCP的連接,那么在這里我們就不得不來詳細說一下,TCP的連接有什么特色呢?
TCP 連接
在網絡應答請求時,客戶端與服務器端之間必須建立一個連接,當網絡請求完成之后,雙方就不再需要這個連接時就可以將連接釋放。 而這里采用的是TCP連接,TCP的協議里面的連接,依靠是“三次握手”,釋放時依靠“四次分手”。
因此每一次的連接都是需要耗費資源和時間的。
1. TCP 的“三次握手”:
TCP 的三次握手的示意圖
詳細解釋:
- ***次握手:客戶端想服務器發送一個SYN 標志位為1的包,以及初始序號X,包裝在包的頭的序列號字段里。
- 第二次握手:服務器發回ACK(確認包),即將SYN和ACK標志位都命名為1,同時將序列號修改為X+1.
- 第三次握手:客戶端向服務器再次發送確認包(ACK),SYN標志位為0.ACK標志位為1.同時把服務器發過來的ACK包序列號字段+1.放在包中,發給服務器即ACK=Y+1
2. TCP 的“四次分手”:
因為TCP的斷開需要發送四個包,因此被稱之為 四次揮手。客戶端或服務器端均可主動斷開。在socket 編程中,任何一方執行close()操作即可產生分手操作。
HTTP 協議的長連接和短連接,實質上就是TCP協議的長連接和短連接。
短連接和長連接的工作原理是啥,有啥優勢呢?
- 短連接:client向server發送請求,server收到請求,雙方建立連接。Client向server發送消息,server響應client.然后一次連接就完成了。此時,雙方都可以發起close操作。
- 短連接的優點:管理簡單,發起的連接都是有效的連接。不需要額外的控制手段。
- 長連接:client向server發送請求,server響應client的連接,雙方建立連接。然后完成一次成功的響應請求,之后他們的連接不會主動關閉,后面的讀寫響應請求還會繼續使用這個連接通道。