HTTP的長連接和短連接本質(zhì)上是TCP長連接和短連接克胳。HTTP屬于應用層協(xié)議.
短連接:瀏覽器和服務器每進行一次HTTP操作,就建立一次連接,但任務結(jié)束就中斷連接怪嫌。
長連接:當一個網(wǎng)頁打開完成后,客戶端和服務器之間用于傳輸HTTP數(shù)據(jù)的 TCP連接不會關閉柳沙,如果客戶端再次訪問這個服務器上的網(wǎng)頁岩灭,會繼續(xù)使用這一條已經(jīng)建立的連接。Keep-Alive不會永久保持連接赂鲤,它有一個保持時間噪径,可以在不同的服務器軟件(如Apache)中設定這個時間。實現(xiàn)長連接要客戶端和服務端都支持長連接数初。
TCP短連接:client向server發(fā)起連接請求找爱,server接到請求,然后雙方建立連接泡孩。client向server發(fā)送消息车摄,server回應client,然后一次讀寫就完成了仑鸥,這時候雙方任何一個都可以發(fā)起close操作吮播,不過一般都是client先發(fā)起 close操作。短連接一般只會在 client/server間傳遞一次讀寫操作
TCP長連接:client向server發(fā)起連接锈候,server接受client連接薄料,雙方建立連接。Client與server完成一次讀寫之后泵琳,它們之間的連接并不會主動關閉摄职,后續(xù)的讀寫操作會繼續(xù)使用這個連接。
TCP的被窳校活功能主要為服務器應用提供谷市。如果客戶端已經(jīng)消失而連接未斷開,則會使得服務器上保留一個半開放的連接击孩,而服務器又在等待來自客戶端的數(shù)據(jù)迫悠,此時服務器將永遠等待客戶端的數(shù)據(jù)。惫遥活功能就是試圖在服務端器端檢測到這種半開放的連接创泄。
如果一個給定的連接在兩小時內(nèi)沒有任何動作艺玲,服務器就向客戶發(fā)送一個探測報文段,根據(jù)客戶端主機響應探測4個客戶端狀態(tài):
客戶主機依然正常運行鞠抑,且服務器可達饭聚。此時客戶的TCP響應正常,服務器將备樽荆活定時器復位秒梳。
客戶主機已經(jīng)崩潰,并且關閉或者正在重新啟動箕速。上述情況下客戶端都不能響應TCP酪碘。服務端將無法收到客戶端對探測的響應。服務器總共發(fā)送10個這樣的探測盐茎,每個間隔75秒兴垦。若服務器沒有收到任何一個響應,它就認為客戶端已經(jīng)關閉并終止連接庭呜。
客戶端崩潰并已經(jīng)重新啟動滑进。服務器將收到一個對其保活探測的響應募谎,這個響應是一個復位扶关,使得服務器終止這個連接。
客戶機正常運行数冬,但是服務器不可達节槐。這種情況與第二種狀態(tài)類似。
長連接和短連接的優(yōu)點和缺點
由上可以看出拐纱,長連接可以省去較多的TCP建立和關閉的操作铜异,減少浪費,節(jié)約時間秸架。對于頻繁請求資源的客戶端適合使用長連接揍庄。在長連接的應用場景下,client端一般不會主動關閉連接东抹,當client與server之間的連接一直不關閉蚂子,隨著客戶端連接越來越多,server會保持過多連接缭黔。這時候server端需要采取一些策略食茎,如關閉一些長時間沒有請求發(fā)生的連接,這樣可以避免一些惡意連接導致server端服務受損馏谨;如果條件允許則可以限制每個客戶端的最大長連接數(shù)别渔,這樣可以完全避免惡意的客戶端拖垮整體后端服務。
短連接對于服務器來說管理較為簡單,存在的連接都是有用的連接哎媚,不需要額外的控制手段喇伯。但如果客戶請求頻繁,將在TCP的建立和關閉操作上浪費較多時間和帶寬抄伍。
長連接和短連接的產(chǎn)生在于client和server采取的關閉策略艘刚。不同的應用場景適合采用不同的策略管宵。
數(shù)據(jù)庫的連接用長連接截珍, 如果用短連接頻繁的通信會造成socket錯誤,而且頻繁的socket 創(chuàng)建也是對資源的浪費箩朴。 而像WEB網(wǎng)站的http服務一般都用短鏈接岗喉,因為長連接對于服務端來說會耗費一定的資源