當網絡通訊時採用TCP協議時,在真正的讀寫操做以前,server與client之間必須創建一個鏈接,當讀寫操做完成後,雙方再也不須要這個鏈接時它們能夠釋放這個鏈接,鏈接的創建是須要三次握手的,而釋放則須要4次揮手,因此說每一個鏈接的創建都是須要資源消耗和時間消耗的html
示意圖:數據庫
長鏈接:服務器
所謂長鏈接,指在一個TCP鏈接上能夠連續發送多個數據包,在TCP鏈接保持期間,若是沒有數據包發送,須要雙方發檢測包以維持此鏈接,通常須要本身作在線維持(不發生RST包和四次揮手)。 網絡
鏈接→數據傳輸→保持鏈接(心跳)→數據傳輸→保持鏈接(心跳)→……→關閉鏈接(一個TCP鏈接通道多個讀寫通訊);
這就要求長鏈接在沒有數據通訊時,定時發送數據包(心跳),以維持鏈接狀態;併發
TCP保活功能,保活功能主要爲服務器應用提供,服務器應用但願知道客戶主機是否崩潰,從而能夠表明客戶使用資源。若是客戶已經消失,使得服務器上保留一個半開放的鏈接,而服務器又在等待來自客戶端的數據,則服務器將應遠等待客戶端的數據,保活功能就是試圖在服務器端檢測到這種半開放的鏈接。socket
若是一個給定的鏈接在兩小時內沒有任何的動做,則服務器就向客戶發一個探測報文段,客戶主機必須處於如下4個狀態之一:函數
短鏈接:網站
短鏈接是指通訊雙方有數據交互時,就創建一個TCP鏈接,數據發送完成後,則斷開此TCP鏈接(管理起來比較簡單,存在的鏈接都是有用的鏈接,不須要額外的控制手段);spa
鏈接→數據傳輸→關閉鏈接;server
應用場景:
長鏈接多用於操做頻繁(讀寫),點對點的通信,並且鏈接數不能太多狀況,。每一個TCP鏈接都須要三步握手,這須要時間,若是每一個操做都是先鏈接,再操做的話那麼處理速度會下降不少,因此每一個操做完後都不斷開,次處理時直接發送數據包就OK了,不用創建TCP鏈接。例如:數據庫的鏈接用長鏈接, 若是用短鏈接頻繁的通訊會形成socket錯誤,並且頻繁的socket 建立也是對資源的浪費。
而像WEB網站的http服務通常都用短連接(http1.0只支持短鏈接,1.1keep alive 帶時間,操做次數限制的長鏈接),由於長鏈接對於服務端來講會耗費必定的資源,而像WEB網站這麼頻繁的成千上萬甚至上億客戶端的鏈接用短鏈接會更省一些資源,若是用長鏈接,並且同時有成千上萬的用戶,若是每一個用戶都佔用一個鏈接的話,那可想而知吧。因此併發量大,但每一個用戶無需頻繁操做狀況下需用短連好;
在長鏈接中通常是沒有條件可以判斷讀寫何時結束,因此必需要加長度報文頭。讀函數先是讀取報文頭的長度,再根據這個長度去讀相應長度的報文。
轉至:http://www.cnblogs.com/qqzy168/p/3141703.html
http://www.cnblogs.com/liuyong/archive/2011/07/01/2095487.html