短連接
連接->傳輸數據->關閉連接
HTTP是無狀態的,瀏覽器和服務器每進行一次HTTP操作,就建立一次連接,但任務結束就中斷連接。
也可以這樣說:短連接是指建立好SOCKET連接后,發送數據,接收端接收完數據后,馬上斷開連接。
長連接
連接->傳輸數據->保持連接 -> 傳輸數據-> ... ->關閉連接。
長連接指建立SOCKET連接后,不管是否使用都保持連接,但安全性較差。
http的長連接
HTTP也可以建立長連接的,使用Connection:keep-alive,HTTP 1.1默認進行持久連接。
HTTP1.1和HTTP1.0相比較而言,最大的區別就是增加了持久連接支持(貌似最新的 http1.0 可以顯式的指定 keep-alive),但還是無狀態的,或者說是不可以信任的。
什么時候用長連接,短連接?
長連接多用于操作頻繁,點對點的通訊,而且連接數不能太多情況。
每個TCP連接都需要三步握手,這需要時間,如果每個操作都是先連接,再操作的話那么處理速度會降低很多,所以每個操作完后都不斷開,每次處理時直接發送數據包就OK了,不用建立TCP連接。例如:數據庫的連接用長連接, 如果用短連接頻繁的通信會造成socket錯誤,而且頻繁的socket 創建也是對資源的浪費。
而像Web網站的http服務一般都用短鏈接,因為長連接對于服務端來說會耗費一定的資源,而像Web網站這么頻繁的成千上萬甚至上億客戶端的連接用短連接會更省一些資源,如果用長連接,而且同時有成千上萬的用戶,如果每個用戶都占用一個連接的話,那可想而知吧。
所以并發量大,但每個用戶無需頻繁操作情況下需用短連接好。
補充與擴展
通俗點講,短連接就是一次TCP請求得到結果后,連接馬上結束。而長連接并不馬上斷開,而是一直保持著連接,直到長連接TIMEOUT(具體程序都有相關參數說明)。長連接可以避免不斷的進行TCP三次握手和四次揮手。
長連接(keepalive)是需要靠雙方不斷的發送探測包來維持的,keepalive
期間服務端和客戶端的TCP連接狀態是ESTABLISHED
。