HTTP的長鏈接和短鏈接實際上是TCP的長連接和短鏈接。首先我們先介紹一下TCP/IP協議組四層模型。其中包括以下:
- 應用層:HTTP、FTP、DNS、TELNET等協議
- 傳輸層:TCP、UDP
- 網絡層:IP、ARP、RARP、ICMP協議等
- 網絡接口層:是TCP/IP協議的基層,負責數據幀的發送和接收。
接下來我們說下常見的幾個協議的作用:
-
HTTP:HTTP協議無狀態指的是對事物處理沒有記憶能力。也就是說打開一個服務器的網頁和上次打開這個網頁之間沒有任何聯系。
-
IP協議:負責解決網路路由和尋址問題
-
TCP:解決如何在IP層之上可靠的傳遞數據包。并且順序和發送順序一致,不丟包。TCP協議是可靠的、面相連接的。
-
UDP:與TCP是對應,是面相非連接的協議,只負責把數據包傳過去。數據量小、可靠性不高,可能會掉包。我們經常使用的ping命令就是發送UDP數據包。
好了好了,進入正題,開始說長鏈接和短鏈接。
短連接
在HTTP/1.0中默認是使用短連接,客戶端每進行一次http請求就建立一次連接,任務結束連接就中斷(雙方都可以發起close,一般是客戶端發起),比如訪問一個網頁或者其他web資源(img、css、js等),每遇到一個web資源就要建立一次連接。
優缺點:
因為每次通信都需要建立TCP連接,連接的建立都需要三次握手,而釋放需要四次握手。所以會浪費時間和帶寬。但是優點就是對于服務端來講,不要進行額外的控制,每條連接都是有用的。
長連接
從HTTP/1.1開始默認使用長連接。使用長連接的HTTP協議會在響應頭加入Connection: keep-alive
。當打開一個網頁客戶端和服務端建立的TCP連接不會關閉。當再次訪問服務器時還會使用這個連接。但是這個狀態不會永久保持連接,可以在不同的服務器軟件(Apache)上設置。
優缺點:
減少了TCP的建立和關閉,減少浪費、節約時間。對于頻繁請求適合使用長連接,但是缺點就是隨著用戶的增多,服務器會扛不住的。所以需要采取一些策略:如關閉長時間沒有讀寫操作的連接。
應用
web網站的http服務一般都是短連接。
保活功能擴展:
如果客戶端已經消失但是連接沒有斷開,服務器會保留一個半開放的連接,而服務器又在等待客戶端的數據,此時服務端將會永遠等待。保活功能會試圖檢測半開放狀態。如果一個連接2個小時沒有任何動作,服務端會發送一個試探報文,根據客戶端響應的4個客戶端狀態進行判斷。
-
客戶端機正常運行,且服務器可達,此時TCP響應正常,服務器將保活定時器復位。
-
客戶機已經奔潰,并且關閉或者重新啟動。服務端無法收到響應。服務端每隔75秒發一次,一共發10次,若沒有收到一個響應,則認為客戶端已經關閉并且終止連接。
-
客戶端奔潰并已經重新啟動,服務端將收到一個對其保活探測的響應,這個響應是一個復位,使得服務器終止這個連接。
-
客戶機正常運行,但是服務器不可達。這種情況與第二種類似。