網(wǎng)絡(luò)連接中的長(zhǎng)連接和短鏈接是什么意思?
短連接
連接->傳輸數(shù)據(jù)->關(guān)閉連接
比如HTTP是無(wú)狀態(tài)的的短鏈接,瀏覽器和服務(wù)器每進(jìn)行一次HTTP操作,就建立一次連接,但任務(wù)結(jié)束就中斷連接。
具體就是:瀏覽器client發(fā)起并建立TCP連接 -> client發(fā)送HttpRequest報(bào)文 -> server接收到報(bào)文->server handle并發(fā)送HttpResponse報(bào)文給前端,發(fā)送完畢之后立即調(diào)用socket.close方法
->client接收response報(bào)文->client最終會(huì)收到server端斷開TCP連接的信號(hào)->client 端斷開TCP連接,具體就是調(diào)用close方法。
也可以這樣說(shuō):短連接是指SOCKET連接后,發(fā)送接收完數(shù)據(jù)后馬上斷開連接。因?yàn)檫B接后接收了數(shù)據(jù)就斷開了,所以每次數(shù)據(jù)接受處理不會(huì)有聯(lián)系。 這也是HTTP協(xié)議無(wú)狀態(tài)的原因之一。
長(zhǎng)連接
連接->傳輸數(shù)據(jù)->保持連接 -> 傳輸數(shù)據(jù)-> ...........->直到一方關(guān)閉連接,多是客戶端關(guān)閉連接。
長(zhǎng)連接指建立SOCKET連接后不管是否使用都保持連接,但安全性較差。
HTTP在短鏈接和長(zhǎng)連接上的選擇:
HTTP是無(wú)狀態(tài)的 ,也就是說(shuō),瀏覽器和服務(wù)器每進(jìn)行一次HTTP操作,就建立一次連接,但任務(wù)結(jié)束就中斷連接。
如果客戶端瀏覽器訪問(wèn)的某個(gè)HTML或其他類型的 Web頁(yè)中包含有其他的Web資源,如JavaScript文件、圖像文件、CSS文件等;當(dāng)瀏覽器每遇到這樣一個(gè)Web資源,就會(huì)建立一個(gè)HTTP會(huì)話
HTTP1.1和HTTP1.0相比較而言,最大的區(qū)別就是增加了持久連接支持(貌似最新的HTTP1.1 可以顯示的指定 keep-alive),但還是無(wú)狀態(tài)的,或者說(shuō)是不可以信任的。 如果瀏覽器或者服務(wù)器在其頭信息加入了這行代碼 Connection:keep-alive
TCP連接在發(fā)送后將仍然保持打開狀態(tài),于是,瀏覽器可以繼續(xù)通過(guò)相同的連接發(fā)送請(qǐng)求。保持連接節(jié)省了為每個(gè)請(qǐng)求建立新連接所需的時(shí)間,還節(jié)約了帶寬。 實(shí)現(xiàn)長(zhǎng)連接要客戶端和服務(wù)端都支持長(zhǎng)連接。
什么時(shí)候用長(zhǎng)連接,短連接?長(zhǎng)連接多用于操作頻繁,點(diǎn)對(duì)點(diǎn)的通訊,而且連接數(shù)不能太多情況。
每個(gè)TCP連接都需要三步握手,這需要時(shí)間,如果每個(gè)操作都是先連接,再操作的話那么處理速度會(huì)降低很多,所以每個(gè)操作完后都不斷開,次處理時(shí)直接發(fā)送數(shù)據(jù)包就OK了,不用建立TCP連接。
例如:數(shù)據(jù)庫(kù)的連接用長(zhǎng)連接, 如果用短連接頻繁的通信會(huì)造成socket錯(cuò)誤,而且頻繁的socket 創(chuàng)建也是對(duì)資源的浪費(fèi)。
像WEB網(wǎng)站的http服務(wù)一般都用短鏈接,因?yàn)殚L(zhǎng)連接對(duì)于服務(wù)端來(lái)說(shuō)會(huì)耗費(fèi)一定的資源,而像WEB網(wǎng)站這么頻繁的成千上萬(wàn)甚至上億客戶端的連接用短連接會(huì)更省一些資源,如果用長(zhǎng)連接,而且同時(shí)有成千上萬(wàn)的用戶,如果每個(gè)用戶都占用一個(gè)連接的話,那可想而知吧。所以并發(fā)量大,但每個(gè)用戶無(wú)需頻繁操作情況下需用短連好。
總之,長(zhǎng)連接和短連接的選擇要視情況而定。